summaryrefslogtreecommitdiffstats
path: root/slobrok
diff options
context:
space:
mode:
authorArne Juul <arnej@yahoo-inc.com>2018-10-03 17:35:28 +0000
committerArne Juul <arnej@yahoo-inc.com>2018-10-03 17:40:46 +0000
commit4d3da1b82751c6acd14fa4575b16e340e13ec9d3 (patch)
tree9634ca75c35f60b3506ce6d7783df7f23262579d /slobrok
parentdffaccbc023d3ad17fa973edf0bba168551dc83c (diff)
avoid multi-thread issue
* postpone actual work to scheduled tasks, to avoid multiple threads doing callbacks at the same time
Diffstat (limited to 'slobrok')
-rw-r--r--slobrok/src/vespa/slobrok/server/exchange_manager.cpp11
-rw-r--r--slobrok/src/vespa/slobrok/server/exchange_manager.h3
-rw-r--r--slobrok/src/vespa/slobrok/server/managed_rpc_server.cpp8
-rw-r--r--slobrok/src/vespa/slobrok/server/managed_rpc_server.h2
4 files changed, 21 insertions, 3 deletions
diff --git a/slobrok/src/vespa/slobrok/server/exchange_manager.cpp b/slobrok/src/vespa/slobrok/server/exchange_manager.cpp
index e74724803e8..9c02b7bda45 100644
--- a/slobrok/src/vespa/slobrok/server/exchange_manager.cpp
+++ b/slobrok/src/vespa/slobrok/server/exchange_manager.cpp
@@ -120,15 +120,22 @@ ExchangeManager::healthCheck()
ExchangeManager::WorkPackage::WorkItem::WorkItem(WorkPackage &pkg,
RemoteSlobrok *rem,
FRT_RPCRequest *req)
- : _pkg(pkg), _pendingReq(req), _remslob(rem)
+ : FNET_Task(pkg._exchanger._env.getScheduler()), _pkg(pkg), _pendingReq(req), _remslob(rem)
{
}
void
ExchangeManager::WorkPackage::WorkItem::RequestDone(FRT_RPCRequest *req)
{
- bool denied = false;
LOG_ASSERT(req == _pendingReq);
+ ScheduleNow();
+}
+
+void
+ExchangeManager::WorkPackage::WorkItem::PerformTask()
+{
+ bool denied = false;
+ FRT_RPCRequest *req = _pendingReq;
FRT_Values &answer = *(req->GetReturn());
if (!req->IsError() && strcmp(answer.GetTypeString(), "is") == 0) {
diff --git a/slobrok/src/vespa/slobrok/server/exchange_manager.h b/slobrok/src/vespa/slobrok/server/exchange_manager.h
index ea335cbb3c0..fc691daa089 100644
--- a/slobrok/src/vespa/slobrok/server/exchange_manager.h
+++ b/slobrok/src/vespa/slobrok/server/exchange_manager.h
@@ -44,7 +44,7 @@ private:
class WorkPackage
{
private:
- class WorkItem: public FRT_IRequestWait
+ class WorkItem: public FRT_IRequestWait, public FNET_Task
{
private:
WorkPackage &_pkg;
@@ -53,6 +53,7 @@ private:
public:
void expedite();
void RequestDone(FRT_RPCRequest *req) override;
+ void PerformTask() override;
WorkItem(WorkPackage &pkg, RemoteSlobrok *rem, FRT_RPCRequest *req);
WorkItem(const WorkItem&) = delete;
WorkItem& operator= (const WorkItem&) = delete;
diff --git a/slobrok/src/vespa/slobrok/server/managed_rpc_server.cpp b/slobrok/src/vespa/slobrok/server/managed_rpc_server.cpp
index 065dac04304..b9e8b8d032d 100644
--- a/slobrok/src/vespa/slobrok/server/managed_rpc_server.cpp
+++ b/slobrok/src/vespa/slobrok/server/managed_rpc_server.cpp
@@ -16,6 +16,7 @@ ManagedRpcServer::ManagedRpcServer(const std::string & name,
const std::string & spec,
IRpcServerManager &manager)
: NamedService(name, spec),
+ FNET_Task(manager.getSupervisor()->GetScheduler()),
_mmanager(manager),
_monitor(*this, *manager.getSupervisor()),
_monitoredServer(nullptr),
@@ -87,6 +88,13 @@ void
ManagedRpcServer::RequestDone(FRT_RPCRequest *req)
{
LOG_ASSERT(req == _checkServerReq);
+ ScheduleNow();
+}
+
+void
+ManagedRpcServer::PerformTask()
+{
+ FRT_RPCRequest *req = _checkServerReq;
FRT_Values &answer = *(req->GetReturn());
if (req->GetErrorCode() == FRTE_RPC_ABORT) {
diff --git a/slobrok/src/vespa/slobrok/server/managed_rpc_server.h b/slobrok/src/vespa/slobrok/server/managed_rpc_server.h
index 072aebd7850..6c978d03299 100644
--- a/slobrok/src/vespa/slobrok/server/managed_rpc_server.h
+++ b/slobrok/src/vespa/slobrok/server/managed_rpc_server.h
@@ -23,6 +23,7 @@ class IRpcServerManager;
class ManagedRpcServer: public NamedService,
public FRT_IRequestWait,
+ public FNET_Task,
public IMonitoredServer
{
public:
@@ -44,6 +45,7 @@ private:
FRT_StringValue *strings);
public:
void RequestDone(FRT_RPCRequest *req) override;
+ void PerformTask() override;
void notifyDisconnected() override; // lost connection to service
};