diff options
Diffstat (limited to 'slobrok')
-rw-r--r-- | slobrok/src/vespa/slobrok/server/cmd.cpp | 22 | ||||
-rw-r--r-- | slobrok/src/vespa/slobrok/server/cmd.h | 2 | ||||
-rw-r--r-- | slobrok/src/vespa/slobrok/server/exchange_manager.cpp | 4 | ||||
-rw-r--r-- | slobrok/src/vespa/slobrok/server/rpc_server_manager.cpp | 4 | ||||
-rw-r--r-- | slobrok/src/vespa/slobrok/server/rpchooks.cpp | 7 | ||||
-rw-r--r-- | slobrok/src/vespa/slobrok/server/sbenv.cpp | 3 | ||||
-rw-r--r-- | slobrok/src/vespa/slobrok/server/sbenv.h | 23 |
7 files changed, 39 insertions, 26 deletions
diff --git a/slobrok/src/vespa/slobrok/server/cmd.cpp b/slobrok/src/vespa/slobrok/server/cmd.cpp index 60060b9868f..b809f655a9d 100644 --- a/slobrok/src/vespa/slobrok/server/cmd.cpp +++ b/slobrok/src/vespa/slobrok/server/cmd.cpp @@ -55,7 +55,7 @@ ScriptCommand::makeRegRpcSrvCmd(SBEnv &env, } ScriptCommand -ScriptCommand::makeRemRemCmd(SBEnv &env, const std::string & name, const std::string &spec) +ScriptCommand::makeIgnoreCmd(SBEnv &env, const std::string & name, const std::string &spec) { auto data = std::make_unique<ScriptData>(env, name, spec, nullptr); data->_state = ScriptData::XCH_IGNORE; @@ -72,7 +72,7 @@ ScriptCommand::doRequest() void cleanupReservation(ScriptData & data) { - RpcServerMap &map = data.env._rpcsrvmap; + RpcServerMap &map = data.env.rpcServerMap(); const ReservedName *rsvp = map.getReservation(data.name.c_str()); if (rsvp != nullptr && rsvp->isLocal) { map.removeReservation(data.name.c_str()); @@ -88,13 +88,14 @@ ScriptCommand::doneHandler(OkState result) ScriptData & data = *dataUP; const char *name_p = data.name.c_str(); const char *spec_p = data.spec.c_str(); - ExchangeManager &xch = data.env._exchanger; - RpcServerManager &rsm = data.env._rpcsrvmanager; + ExchangeManager &xch = data.env.exchangeManager(); + RpcServerManager &rsm = data.env.rpcServerManager(); if (result.failed()) { - LOG(warning, "failed [%s->%s] in state %d: %s", - name_p, spec_p, data._state, result.errorMsg.c_str()); - cleanupReservation(data); + LOG(warning, "failed [%s->%s] in state %d: %s", name_p, spec_p, data._state, result.errorMsg.c_str()); + if (data._state != ScriptData::XCH_IGNORE) { + cleanupReservation(data); + } // XXX should handle different state errors differently? if (data.registerRequest != nullptr) { data.registerRequest->SetError(FRTE_RPC_METHOD_FAILED, result.errorMsg.c_str()); @@ -124,14 +125,13 @@ ScriptCommand::doneHandler(OkState result) data._state = ScriptData::RDC_INVAL; // all OK data.registerRequest->Return(); - goto alldone; + cleanupReservation(data); + return; } else if (data._state == ScriptData::XCH_IGNORE) { - goto alldone; + return; } // no other state should be possible LOG_ABORT("should not be reached"); - alldone: - cleanupReservation(data); } //----------------------------------------------------------------------------- diff --git a/slobrok/src/vespa/slobrok/server/cmd.h b/slobrok/src/vespa/slobrok/server/cmd.h index 02ae16e457b..d790ae93f5c 100644 --- a/slobrok/src/vespa/slobrok/server/cmd.h +++ b/slobrok/src/vespa/slobrok/server/cmd.h @@ -25,7 +25,7 @@ public: ~ScriptCommand(); static ScriptCommand makeRegRpcSrvCmd(SBEnv &env, const std::string &name, const std::string &spec, FRT_RPCRequest *req); - static ScriptCommand makeRemRemCmd(SBEnv &env, const std::string &name, const std::string &spec); + static ScriptCommand makeIgnoreCmd(SBEnv &env, const std::string &name, const std::string &spec); void doneHandler(OkState result); void doRequest(); diff --git a/slobrok/src/vespa/slobrok/server/exchange_manager.cpp b/slobrok/src/vespa/slobrok/server/exchange_manager.cpp index 632c823a2c1..87892c59f21 100644 --- a/slobrok/src/vespa/slobrok/server/exchange_manager.cpp +++ b/slobrok/src/vespa/slobrok/server/exchange_manager.cpp @@ -15,7 +15,7 @@ namespace slobrok { ExchangeManager::ExchangeManager(SBEnv &env, RpcServerMap &rpcsrvmap) : _partners(), _env(env), - _rpcsrvmanager(env._rpcsrvmanager), + _rpcsrvmanager(env.rpcServerManager()), _rpcsrvmap(rpcsrvmap) { } @@ -68,7 +68,7 @@ void ExchangeManager::forwardRemove(const std::string & name, const std::string & spec) { WorkPackage *package = new WorkPackage(WorkPackage::OP_REMOVE, *this, - ScriptCommand::makeRemRemCmd(_env, name, spec)); + ScriptCommand::makeIgnoreCmd(_env, name, spec)); for (const auto & entry : _partners) { package->addItem(entry.second.get()); } diff --git a/slobrok/src/vespa/slobrok/server/rpc_server_manager.cpp b/slobrok/src/vespa/slobrok/server/rpc_server_manager.cpp index dfcdc0ef9d1..0f0679e35ea 100644 --- a/slobrok/src/vespa/slobrok/server/rpc_server_manager.cpp +++ b/slobrok/src/vespa/slobrok/server/rpc_server_manager.cpp @@ -17,8 +17,8 @@ namespace slobrok { RpcServerManager::RpcServerManager(SBEnv &sbenv) : FNET_Task(sbenv.getScheduler()), - _rpcsrvmap(sbenv._rpcsrvmap), - _exchanger(sbenv._exchanger), + _rpcsrvmap(sbenv.rpcServerMap()), + _exchanger(sbenv.exchangeManager()), _env(sbenv), _addManageds(), _deleteList() diff --git a/slobrok/src/vespa/slobrok/server/rpchooks.cpp b/slobrok/src/vespa/slobrok/server/rpchooks.cpp index 2fefce1d474..062ec148bfb 100644 --- a/slobrok/src/vespa/slobrok/server/rpchooks.cpp +++ b/slobrok/src/vespa/slobrok/server/rpchooks.cpp @@ -234,7 +234,12 @@ RPCHooks::rpc_registerRpcServer(FRT_RPCRequest *req) LOG(debug, "RPC: invoked registerRpcServer(%s,%s)", dName, dSpec); _cnts.registerReqs++; - + { + // TODO: run only this path, and complete the request instead of ignoring + auto script = ScriptCommand::makeIgnoreCmd(_env, dName, dSpec); + ServiceMapping mapping{dName, dSpec}; + _env.localMonitorMap().addLocal(mapping, std::make_unique<ScriptCommand>(std::move(script))); + } // is this already OK? if (_rpcsrvmanager.alreadyManaged(dName, dSpec)) { LOG(debug, "registerRpcServer(%s,%s) OK, already managed", diff --git a/slobrok/src/vespa/slobrok/server/sbenv.cpp b/slobrok/src/vespa/slobrok/server/sbenv.cpp index d8a3e62f44e..1f54716c29c 100644 --- a/slobrok/src/vespa/slobrok/server/sbenv.cpp +++ b/slobrok/src/vespa/slobrok/server/sbenv.cpp @@ -119,7 +119,8 @@ SBEnv::SBEnv(const ConfigShim &shim) _rpcsrvmap() { srandom(time(nullptr) ^ getpid()); - _localMonitorSubscription = MapSubscription::subscribe(_rpcsrvmap.proxy(), _localRpcMonitorMap); + // note: feedback loop between these two: + _localMonitorSubscription = MapSubscription::subscribe(_consensusMap, _localRpcMonitorMap); _consensusSubscription = MapSubscription::subscribe(_localRpcMonitorMap.dispatcher(), _consensusMap); // TODO: use consensus as source here: _globalHistorySubscription = MapSubscription::subscribe(_rpcsrvmap.proxy(), _globalVisibleHistory); diff --git a/slobrok/src/vespa/slobrok/server/sbenv.h b/slobrok/src/vespa/slobrok/server/sbenv.h index 576e5d4b30c..44b7305814c 100644 --- a/slobrok/src/vespa/slobrok/server/sbenv.h +++ b/slobrok/src/vespa/slobrok/server/sbenv.h @@ -61,6 +61,14 @@ private: UnionServiceMap _consensusMap; ServiceMapHistory _globalVisibleHistory; + RpcServerManager _rpcsrvmanager; + ExchangeManager _exchanger; + RpcServerMap _rpcsrvmap; + + std::unique_ptr<MapSubscription> _localMonitorSubscription; + std::unique_ptr<MapSubscription> _consensusSubscription; + std::unique_ptr<MapSubscription> _globalHistorySubscription; + public: explicit SBEnv(const ConfigShim &shim); ~SBEnv(); @@ -73,14 +81,18 @@ public: void suspend(); void resume(); - RpcServerManager _rpcsrvmanager; - ExchangeManager _exchanger; - RpcServerMap _rpcsrvmap; + RpcServerManager& rpcServerManager() { return _rpcsrvmanager; } + ExchangeManager& exchangeManager() { return _exchanger; } + RpcServerMap& rpcServerMap() { return _rpcsrvmap; } ServiceMapHistory& globalHistory() { return _globalVisibleHistory; } + LocalRpcMonitorMap& localMonitorMap() { + return _localRpcMonitorMap; + } + ServiceMapHistory& localHistory() { return _localRpcMonitorMap.history(); } @@ -100,11 +112,6 @@ public: OkState removePeer(const std::string& name, const std::string &spec); void countFailedHeartbeat() { _rpcHooks.countFailedHeartbeat(); } - -private: - std::unique_ptr<MapSubscription> _localMonitorSubscription; - std::unique_ptr<MapSubscription> _consensusSubscription; - std::unique_ptr<MapSubscription> _globalHistorySubscription; }; } // namespace slobrok |