diff options
author | Arne Juul <arnej@yahoo-inc.com> | 2018-10-03 17:35:28 +0000 |
---|---|---|
committer | Arne Juul <arnej@yahoo-inc.com> | 2018-10-03 17:40:46 +0000 |
commit | 4d3da1b82751c6acd14fa4575b16e340e13ec9d3 (patch) | |
tree | 9634ca75c35f60b3506ce6d7783df7f23262579d /slobrok | |
parent | dffaccbc023d3ad17fa973edf0bba168551dc83c (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')
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 }; |