summaryrefslogtreecommitdiffstats
path: root/slobrok
diff options
context:
space:
mode:
Diffstat (limited to 'slobrok')
-rw-r--r--slobrok/src/vespa/slobrok/server/cmd.cpp22
-rw-r--r--slobrok/src/vespa/slobrok/server/cmd.h2
-rw-r--r--slobrok/src/vespa/slobrok/server/exchange_manager.cpp4
-rw-r--r--slobrok/src/vespa/slobrok/server/rpc_server_manager.cpp4
-rw-r--r--slobrok/src/vespa/slobrok/server/rpchooks.cpp7
-rw-r--r--slobrok/src/vespa/slobrok/server/sbenv.cpp3
-rw-r--r--slobrok/src/vespa/slobrok/server/sbenv.h23
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