summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2018-09-28 16:36:30 +0200
committerGitHub <noreply@github.com>2018-09-28 16:36:30 +0200
commitc46906ef798afd24a761b38ec9a037c7e6f21b93 (patch)
tree693686f9f6b4d24a48f4ae653188631cf9488053
parent3d74ee9620abd934e84c9482dd4ff10090d1e4dd (diff)
parent89f549f7dd3198095590d019f15c3fec379b7cd6 (diff)
Merge pull request #7137 from vespa-engine/balder/use-smart-pointers-in-slobrok
Balder/use smart pointers in slobrok
-rw-r--r--slobrok/src/apps/check_slobrok/check_slobrok.cpp21
-rw-r--r--slobrok/src/apps/sbcmd/sbcmd.cpp21
-rw-r--r--slobrok/src/vespa/slobrok/server/cmd.cpp89
-rw-r--r--slobrok/src/vespa/slobrok/server/cmd.h33
-rw-r--r--slobrok/src/vespa/slobrok/server/exchange_manager.cpp131
-rw-r--r--slobrok/src/vespa/slobrok/server/exchange_manager.h61
-rw-r--r--slobrok/src/vespa/slobrok/server/history.cpp2
-rw-r--r--slobrok/src/vespa/slobrok/server/history.h3
-rw-r--r--slobrok/src/vespa/slobrok/server/managed_rpc_server.cpp30
-rw-r--r--slobrok/src/vespa/slobrok/server/managed_rpc_server.h10
-rw-r--r--slobrok/src/vespa/slobrok/server/named_service.cpp3
-rw-r--r--slobrok/src/vespa/slobrok/server/named_service.h6
-rw-r--r--slobrok/src/vespa/slobrok/server/remote_slobrok.cpp133
-rw-r--r--slobrok/src/vespa/slobrok/server/remote_slobrok.h25
-rw-r--r--slobrok/src/vespa/slobrok/server/reserved_name.h6
-rw-r--r--slobrok/src/vespa/slobrok/server/rpc_server_manager.cpp171
-rw-r--r--slobrok/src/vespa/slobrok/server/rpc_server_manager.h59
-rw-r--r--slobrok/src/vespa/slobrok/server/rpc_server_map.cpp146
-rw-r--r--slobrok/src/vespa/slobrok/server/rpc_server_map.h45
-rw-r--r--slobrok/src/vespa/slobrok/server/rpchooks.cpp46
-rw-r--r--slobrok/src/vespa/slobrok/server/rpchooks.h12
-rw-r--r--slobrok/src/vespa/slobrok/server/rpcmirror.cpp8
-rw-r--r--slobrok/src/vespa/slobrok/server/sbenv.cpp14
-rw-r--r--slobrok/src/vespa/slobrok/server/sbenv.h2
-rw-r--r--slobrok/src/vespa/slobrok/server/selfcheck.cpp3
-rw-r--r--slobrok/src/vespa/slobrok/server/visible_map.cpp81
-rw-r--r--slobrok/src/vespa/slobrok/server/visible_map.h27
27 files changed, 502 insertions, 686 deletions
diff --git a/slobrok/src/apps/check_slobrok/check_slobrok.cpp b/slobrok/src/apps/check_slobrok/check_slobrok.cpp
index 744a64b89cd..ed72c459e44 100644
--- a/slobrok/src/apps/check_slobrok/check_slobrok.cpp
+++ b/slobrok/src/apps/check_slobrok/check_slobrok.cpp
@@ -13,14 +13,14 @@ LOG_SETUP("check_slobrok");
class Slobrok_Checker : public FastOS_Application
{
private:
- FRT_Supervisor *_supervisor;
- FRT_Target *_target;
+ std::unique_ptr<FRT_Supervisor> _supervisor;
+ FRT_Target *_target;
Slobrok_Checker(const Slobrok_Checker &);
Slobrok_Checker &operator=(const Slobrok_Checker &);
public:
- Slobrok_Checker() : _supervisor(NULL), _target(NULL) {}
+ Slobrok_Checker() : _supervisor(), _target(nullptr) {}
virtual ~Slobrok_Checker();
int usage();
void initRPC(const char *spec);
@@ -30,8 +30,8 @@ public:
Slobrok_Checker::~Slobrok_Checker()
{
- LOG_ASSERT(_supervisor == NULL);
- LOG_ASSERT(_target == NULL);
+ LOG_ASSERT( !_supervisor);
+ LOG_ASSERT(_target == nullptr);
}
@@ -46,7 +46,7 @@ Slobrok_Checker::usage()
void
Slobrok_Checker::initRPC(const char *spec)
{
- _supervisor = new FRT_Supervisor();
+ _supervisor = std::make_unique<FRT_Supervisor>();
_target = _supervisor->GetTarget(spec);
_supervisor->Start();
}
@@ -55,14 +55,13 @@ Slobrok_Checker::initRPC(const char *spec)
void
Slobrok_Checker::finiRPC()
{
- if (_target != NULL) {
+ if (_target != nullptr) {
_target->SubRef();
- _target = NULL;
+ _target = nullptr;
}
- if (_supervisor != NULL) {
+ if (_supervisor) {
_supervisor->ShutDown(true);
- delete _supervisor;
- _supervisor = NULL;
+ _supervisor.reset();
}
}
diff --git a/slobrok/src/apps/sbcmd/sbcmd.cpp b/slobrok/src/apps/sbcmd/sbcmd.cpp
index 30aaa6a1406..c4b76bd7ed0 100644
--- a/slobrok/src/apps/sbcmd/sbcmd.cpp
+++ b/slobrok/src/apps/sbcmd/sbcmd.cpp
@@ -12,14 +12,14 @@ LOG_SETUP("vespa-slobrok-cmd");
class Slobrok_CMD : public FastOS_Application
{
private:
- FRT_Supervisor *_supervisor;
+ std::unique_ptr<FRT_Supervisor> _supervisor;
FRT_Target *_target;
Slobrok_CMD(const Slobrok_CMD &);
Slobrok_CMD &operator=(const Slobrok_CMD &);
public:
- Slobrok_CMD() : _supervisor(NULL), _target(NULL) {}
+ Slobrok_CMD() : _supervisor(), _target(nullptr) {}
virtual ~Slobrok_CMD();
int usage();
void initRPC(const char *spec);
@@ -29,8 +29,8 @@ public:
Slobrok_CMD::~Slobrok_CMD()
{
- LOG_ASSERT(_supervisor == NULL);
- LOG_ASSERT(_target == NULL);
+ LOG_ASSERT(! _supervisor);
+ LOG_ASSERT(_target == nullptr);
}
int
@@ -56,7 +56,7 @@ Slobrok_CMD::usage()
void
Slobrok_CMD::initRPC(const char *spec)
{
- _supervisor = new FRT_Supervisor();
+ _supervisor = std::make_unique<FRT_Supervisor>();
_target = _supervisor->GetTarget(spec);
_supervisor->Start();
}
@@ -65,14 +65,13 @@ Slobrok_CMD::initRPC(const char *spec)
void
Slobrok_CMD::finiRPC()
{
- if (_target != NULL) {
+ if (_target != nullptr) {
_target->SubRef();
- _target = NULL;
+ _target = nullptr;
}
- if (_supervisor != NULL) {
+ if (_supervisor) {
_supervisor->ShutDown(true);
- delete _supervisor;
- _supervisor = NULL;
+ _supervisor.reset();
}
}
@@ -165,7 +164,7 @@ Slobrok_CMD::Main()
} else {
fprintf(stderr, "vespa-slobrok-cmd OK, returntypes '%s'\n", atypes);
uint32_t idx = 0;
- while (atypes != NULL && *atypes != '\0') {
+ while (atypes != nullptr && *atypes != '\0') {
switch (*atypes) {
case 's':
printf(" string = '%s'\n", answer[idx]._string._str);
diff --git a/slobrok/src/vespa/slobrok/server/cmd.cpp b/slobrok/src/vespa/slobrok/server/cmd.cpp
index 6ba4f9a6e98..e728c8f80ad 100644
--- a/slobrok/src/vespa/slobrok/server/cmd.cpp
+++ b/slobrok/src/vespa/slobrok/server/cmd.cpp
@@ -30,27 +30,33 @@ public:
const std::string spec;
FRT_RPCRequest * const registerRequest;
- RegRpcSrvData(SBEnv &e, const char *n, const char *s, FRT_RPCRequest *r)
+ RegRpcSrvData(SBEnv &e, const std::string &n, const std::string &s, FRT_RPCRequest *r)
: _state(RDC_INIT), env(e), name(n), spec(s), registerRequest(r)
{}
};
+RegRpcSrvCommand::RegRpcSrvCommand(std::unique_ptr<RegRpcSrvData> data)
+ : _data(std::move(data))
+{}
+
+RegRpcSrvCommand::RegRpcSrvCommand(RegRpcSrvCommand &&) = default;
+RegRpcSrvCommand & RegRpcSrvCommand::operator =(RegRpcSrvCommand &&) = default;
+RegRpcSrvCommand::~RegRpcSrvCommand() = default;
+
RegRpcSrvCommand
RegRpcSrvCommand::makeRegRpcSrvCmd(SBEnv &env,
- const char *name, const char *spec,
+ const std::string &name, const std::string &spec,
FRT_RPCRequest *req)
{
- RegRpcSrvData *data = new RegRpcSrvData(env, name, spec, req);
- return RegRpcSrvCommand(data);
+ return RegRpcSrvCommand(std::make_unique<RegRpcSrvData>(env, name, spec, req));
}
RegRpcSrvCommand
-RegRpcSrvCommand::makeRemRemCmd(SBEnv &env,
- const char *name, const char *spec)
+RegRpcSrvCommand::makeRemRemCmd(SBEnv &env, const std::string & name, const std::string &spec)
{
- RegRpcSrvData *data = new RegRpcSrvData(env, name, spec, NULL);
+ auto data = std::make_unique<RegRpcSrvData>(env, name, spec, nullptr);
data->_state = RegRpcSrvData::XCH_IGNORE;
- return RegRpcSrvCommand(data);
+ return RegRpcSrvCommand(std::move(data));
}
@@ -62,66 +68,61 @@ RegRpcSrvCommand::doRequest()
}
void
-RegRpcSrvCommand::cleanupReservation()
+RegRpcSrvCommand::cleanupReservation(RegRpcSrvData & data)
{
- RpcServerMap &map = _data->env._rpcsrvmap;
- ReservedName *rsvp = map.getReservation(_data->name.c_str());
- if (rsvp != NULL && rsvp->isLocal) {
- map.removeReservation(_data->name.c_str());
+ RpcServerMap &map = data.env._rpcsrvmap;
+ const ReservedName *rsvp = map.getReservation(data.name.c_str());
+ if (rsvp != nullptr && rsvp->isLocal) {
+ map.removeReservation(data.name.c_str());
}
}
void
RegRpcSrvCommand::doneHandler(OkState result)
{
- LOG_ASSERT(_data != NULL);
-
+ LOG_ASSERT(_data != nullptr);
+ std::unique_ptr<RegRpcSrvData> dataUP = std::move(_data);
+ RegRpcSrvData & data = *dataUP;
if (result.failed()) {
- LOG(warning, "failed in state %d: %s",
- _data->_state, result.errorMsg.c_str());
- cleanupReservation();
+ LOG(warning, "failed in state %d: %s", data._state, result.errorMsg.c_str());
+ cleanupReservation(data);
// XXX should handle different state errors differently?
- if (_data->registerRequest != NULL) {
- _data->registerRequest->SetError(FRTE_RPC_METHOD_FAILED,
- result.errorMsg.c_str());
- _data->registerRequest->Return();
+ if (data.registerRequest != nullptr) {
+ data.registerRequest->SetError(FRTE_RPC_METHOD_FAILED, result.errorMsg.c_str());
+ data.registerRequest->Return();
} else {
LOG(warning, "ignored: %s", result.errorMsg.c_str());
}
goto alldone;
}
- if (_data->_state == RegRpcSrvData::RDC_INIT) {
- LOG(spam, "phase wantAdd(%s,%s)",
- _data->name.c_str(), _data->spec.c_str());
- _data->_state = RegRpcSrvData::XCH_WANTADD;
- _data->env._exchanger.wantAdd(_data->name.c_str(), _data->spec.c_str(), *this);
+ if (data._state == RegRpcSrvData::RDC_INIT) {
+ LOG(spam, "phase wantAdd(%s,%s)", data.name.c_str(), data.spec.c_str());
+ data._state = RegRpcSrvData::XCH_WANTADD;
+ data.env._exchanger.wantAdd(data.name.c_str(), data.spec.c_str(), std::move(dataUP));
return;
- } else if (_data->_state == RegRpcSrvData::XCH_WANTADD) {
- LOG(spam, "phase addManaged(%s,%s)",
- _data->name.c_str(), _data->spec.c_str());
- _data->_state = RegRpcSrvData::CHK_RPCSRV;
- _data->env._rpcsrvmanager.addManaged(_data->name.c_str(), _data->spec.c_str(), *this);
+ } else if (data._state == RegRpcSrvData::XCH_WANTADD) {
+ LOG(spam, "phase addManaged(%s,%s)", data.name.c_str(), data.spec.c_str());
+ data._state = RegRpcSrvData::CHK_RPCSRV;
+ data.env._rpcsrvmanager.addManaged(data.name, data.spec.c_str(), std::move(dataUP));
return;
- } else if (_data->_state == RegRpcSrvData::CHK_RPCSRV) {
- LOG(spam, "phase doAdd(%s,%s)", _data->name.c_str(), _data->spec.c_str());
- _data->_state = RegRpcSrvData::XCH_DOADD;
- _data->env._exchanger.doAdd(_data->name.c_str(), _data->spec.c_str(), *this);
+ } else if (data._state == RegRpcSrvData::CHK_RPCSRV) {
+ LOG(spam, "phase doAdd(%s,%s)", data.name.c_str(), data.spec.c_str());
+ data._state = RegRpcSrvData::XCH_DOADD;
+ data.env._exchanger.doAdd(data.name.c_str(), data.spec.c_str(), std::move(dataUP));
return;
- } else if (_data->_state == RegRpcSrvData::XCH_DOADD) {
- LOG(debug, "done doAdd(%s,%s)", _data->name.c_str(), _data->spec.c_str());
- _data->_state = RegRpcSrvData::RDC_INVAL;
+ } else if (data._state == RegRpcSrvData::XCH_DOADD) {
+ LOG(debug, "done doAdd(%s,%s)", data.name.c_str(), data.spec.c_str());
+ data._state = RegRpcSrvData::RDC_INVAL;
// all OK
- _data->registerRequest->Return();
+ data.registerRequest->Return();
goto alldone;
- } else if (_data->_state == RegRpcSrvData::XCH_IGNORE) {
+ } else if (data._state == RegRpcSrvData::XCH_IGNORE) {
goto alldone;
}
// no other state should be possible
LOG_ABORT("should not be reached");
alldone:
- cleanupReservation();
- delete _data;
- _data = NULL;
+ cleanupReservation(data);
}
//-----------------------------------------------------------------------------
diff --git a/slobrok/src/vespa/slobrok/server/cmd.h b/slobrok/src/vespa/slobrok/server/cmd.h
index 744d874eed0..07b3d3ee0ba 100644
--- a/slobrok/src/vespa/slobrok/server/cmd.h
+++ b/slobrok/src/vespa/slobrok/server/cmd.h
@@ -2,6 +2,7 @@
#pragma once
#include "ok_state.h"
+#include <memory>
class FRT_RPCRequest;
@@ -20,33 +21,19 @@ struct RegRpcSrvData;
class RegRpcSrvCommand
{
private:
- RegRpcSrvData *_data;
- RegRpcSrvCommand(RegRpcSrvData *data) : _data(data) {}
- void cleanupReservation();
+ std::unique_ptr<RegRpcSrvData> _data;
+ static void cleanupReservation(RegRpcSrvData &);
+ RegRpcSrvCommand(std::unique_ptr<RegRpcSrvData> data);
public:
virtual void doneHandler(OkState result);
void doRequest();
- RegRpcSrvCommand(const RegRpcSrvCommand &rhs)
- : _data(rhs._data)
- {
- }
-
- virtual ~RegRpcSrvCommand() {}
-
- RegRpcSrvCommand& operator=(const RegRpcSrvCommand &rhs)
- {
- _data = rhs._data;
- return *this;
- }
-
- static RegRpcSrvCommand makeRegRpcSrvCmd(SBEnv &env,
- const char *name,
- const char *spec,
- FRT_RPCRequest *req);
- static RegRpcSrvCommand makeRemRemCmd(SBEnv &env,
- const char *name,
- const char *spec);
+ RegRpcSrvCommand(RegRpcSrvCommand &&);
+ RegRpcSrvCommand & operator=(RegRpcSrvCommand &&);
+ virtual ~RegRpcSrvCommand();
+
+ static RegRpcSrvCommand makeRegRpcSrvCmd(SBEnv &env, const std::string &name, const std::string &spec, FRT_RPCRequest *req);
+ static RegRpcSrvCommand makeRemRemCmd(SBEnv &env, const std::string &name, const std::string &spec);
};
//-----------------------------------------------------------------------------
diff --git a/slobrok/src/vespa/slobrok/server/exchange_manager.cpp b/slobrok/src/vespa/slobrok/server/exchange_manager.cpp
index f3e06d83282..e74724803e8 100644
--- a/slobrok/src/vespa/slobrok/server/exchange_manager.cpp
+++ b/slobrok/src/vespa/slobrok/server/exchange_manager.cpp
@@ -13,23 +13,23 @@ namespace slobrok {
//-----------------------------------------------------------------------------
ExchangeManager::ExchangeManager(SBEnv &env, RpcServerMap &rpcsrvmap)
- : _partners(NULL),
+ : _partners(),
_env(env),
_rpcsrvmanager(env._rpcsrvmanager),
_rpcsrvmap(rpcsrvmap)
{
}
+ExchangeManager::~ExchangeManager() = default;
OkState
-ExchangeManager::addPartner(const char *name, const char *spec)
+ExchangeManager::addPartner(const std::string & name, const std::string & spec)
{
- RemoteSlobrok *oldremote = _partners[name];
- if (oldremote != NULL) {
+ RemoteSlobrok *oldremote = lookupPartner(name);
+ if (oldremote != nullptr) {
// already a partner, should be OK
- if (strcmp(spec, oldremote->getSpec()) != 0) {
- return OkState(FRTE_RPC_METHOD_FAILED,
- "name already partner with different spec");
+ if (spec != oldremote->getSpec()) {
+ return OkState(FRTE_RPC_METHOD_FAILED, "name already partner with different spec");
}
// this is probably a good time to try connecting again
if (! oldremote->isConnected()) {
@@ -38,100 +38,81 @@ ExchangeManager::addPartner(const char *name, const char *spec)
return OkState();
}
- RemoteSlobrok *partner = new RemoteSlobrok(name, spec, *this);
- LOG_ASSERT(_partners.isSet(name) == false);
- _partners.set(name, partner);
- partner->tryConnect();
+ LOG_ASSERT(_partners.find(name) == _partners.end());
+ auto newPartner = std::make_unique<RemoteSlobrok>(name, spec, *this);
+ RemoteSlobrok & partner = *newPartner;
+ _partners.emplace(name, std::move(newPartner));
+ partner.tryConnect();
return OkState();
}
-
void
-ExchangeManager::removePartner(const char *name)
+ExchangeManager::removePartner(const std::string & name)
{
// assuming checks already done
- RemoteSlobrok *oldremote = _partners.remove(name);
- LOG_ASSERT(oldremote != NULL);
- delete oldremote;
+ auto oldremote = std::move(_partners[name]);
+ LOG_ASSERT(oldremote);
+ _partners.erase(name);
}
-
std::vector<std::string>
ExchangeManager::getPartnerList()
{
std::vector<std::string> partnerList;
- HashMap<RemoteSlobrok *>::Iterator itr = _partners.iterator();
- for (; itr.valid(); itr.next()) {
- partnerList.push_back(std::string(itr.value()->getSpec()));
+ for (const auto & entry : _partners) {
+ partnerList.push_back(entry.second->getSpec());
}
return partnerList;
}
void
-ExchangeManager::forwardRemove(const char *name, const char *spec)
+ExchangeManager::forwardRemove(const std::string & name, const std::string & spec)
{
- RegRpcSrvCommand remremhandler
- = RegRpcSrvCommand::makeRemRemCmd(_env, name, spec);
- WorkPackage *package = new WorkPackage(WorkPackage::OP_REMOVE,
- name, spec, *this,
- remremhandler);
- HashMap<RemoteSlobrok *>::Iterator it = _partners.iterator();
- while (it.valid()) {
- RemoteSlobrok *partner = it.value();
- package->addItem(partner);
- it.next();
+ WorkPackage *package = new WorkPackage(WorkPackage::OP_REMOVE, name, spec, *this,
+ RegRpcSrvCommand::makeRemRemCmd(_env, name, spec));
+ for (const auto & entry : _partners) {
+ package->addItem(entry.second.get());
}
package->expedite();
}
void
-ExchangeManager::doAdd(const char *name, const char *spec,
- RegRpcSrvCommand rdc)
+ExchangeManager::doAdd(const std::string &name, const std::string &spec, RegRpcSrvCommand rdc)
{
- HashMap<RemoteSlobrok *>::Iterator it =
- _partners.iterator();
+ WorkPackage *package = new WorkPackage(WorkPackage::OP_DOADD, name, spec, *this, std::move(rdc));
- WorkPackage *package =
- new WorkPackage(WorkPackage::OP_DOADD, name, spec, *this, rdc);
-
- while (it.valid()) {
- RemoteSlobrok *partner = it.value();
- package->addItem(partner);
- it.next();
+ for (const auto & entry : _partners) {
+ package->addItem(entry.second.get());
}
package->expedite();
}
void
-ExchangeManager::wantAdd(const char *name, const char *spec,
- RegRpcSrvCommand rdc)
+ExchangeManager::wantAdd(const std::string &name, const std::string &spec, RegRpcSrvCommand rdc)
{
- WorkPackage *package =
- new WorkPackage(WorkPackage::OP_WANTADD, name, spec, *this, rdc);
- HashMap<RemoteSlobrok *>::Iterator it = _partners.iterator();
- while (it.valid()) {
- RemoteSlobrok *partner = it.value();
- package->addItem(partner);
- it.next();
+ WorkPackage *package = new WorkPackage(WorkPackage::OP_WANTADD, name, spec, *this, std::move(rdc));
+ for (const auto & entry : _partners) {
+ package->addItem(entry.second.get());
}
package->expedite();
}
+RemoteSlobrok *
+ExchangeManager::lookupPartner(const std::string & name) const {
+ auto found = _partners.find(name);
+ return (found == _partners.end()) ? nullptr : found->second.get();
+}
void
ExchangeManager::healthCheck()
{
- int i=0;
- HashMap<RemoteSlobrok *>::Iterator it = _partners.iterator();
- while (it.valid()) {
- RemoteSlobrok *partner = it.value();
+ for (const auto & entry : _partners) {
+ RemoteSlobrok *partner = entry.second.get();
partner->healthCheck();
- it.next();
- i++;
}
- LOG(debug, "ExchangeManager::healthCheck for %d partners", i);
+ LOG(debug, "ExchangeManager::healthCheck for %ld partners", _partners.size());
}
//-----------------------------------------------------------------------------
@@ -152,8 +133,7 @@ ExchangeManager::WorkPackage::WorkItem::RequestDone(FRT_RPCRequest *req)
if (!req->IsError() && strcmp(answer.GetTypeString(), "is") == 0) {
if (answer[0]._intval32 != 0) {
- LOG(warning, "request denied: %s [%d]",
- answer[1]._string._str, answer[0]._intval32);
+ LOG(warning, "request denied: %s [%d]", answer[1]._string._str, answer[0]._intval32);
denied = true;
} else {
LOG(spam, "request approved");
@@ -163,7 +143,7 @@ ExchangeManager::WorkPackage::WorkItem::RequestDone(FRT_RPCRequest *req)
// XXX tell remslob?
}
req->SubRef();
- _pendingReq = NULL;
+ _pendingReq = nullptr;
_pkg.doneItem(denied);
}
@@ -175,21 +155,19 @@ ExchangeManager::WorkPackage::WorkItem::expedite()
ExchangeManager::WorkPackage::WorkItem::~WorkItem()
{
- if (_pendingReq != NULL) {
+ if (_pendingReq != nullptr) {
_pendingReq->Abort();
- LOG_ASSERT(_pendingReq == NULL);
+ LOG_ASSERT(_pendingReq == nullptr);
}
}
-ExchangeManager::WorkPackage::WorkPackage(op_type op,
- const char *name, const char *spec,
- ExchangeManager &exchanger,
- RegRpcSrvCommand donehandler)
+ExchangeManager::WorkPackage::WorkPackage(op_type op, const std::string & name, const std::string & spec,
+ ExchangeManager &exchanger, RegRpcSrvCommand donehandler)
: _work(),
_doneCnt(0),
_numDenied(0),
- _donehandler(donehandler),
+ _donehandler(std::move(donehandler)),
_exchanger(exchanger),
_optype(op),
_name(name),
@@ -197,13 +175,7 @@ ExchangeManager::WorkPackage::WorkPackage(op_type op,
{
}
-ExchangeManager::WorkPackage::~WorkPackage()
-{
- for (size_t i = 0; i < _work.size(); i++) {
- delete _work[i];
- _work[i] = NULL;
- }
-}
+ExchangeManager::WorkPackage::~WorkPackage() = default;
void
ExchangeManager::WorkPackage::doneItem(bool denied)
@@ -240,15 +212,14 @@ ExchangeManager::WorkPackage::addItem(RemoteSlobrok *partner)
} else if (_optype == OP_DOADD) {
r->SetMethodName("slobrok.internal.doAdd");
}
- r->GetParams()->AddString(_exchanger._env.mySpec());
+ r->GetParams()->AddString(_exchanger._env.mySpec().c_str());
r->GetParams()->AddString(_name.c_str());
r->GetParams()->AddString(_spec.c_str());
- WorkItem *item = new WorkItem(*this, partner, r);
- _work.push_back(item);
+ _work.push_back(std::make_unique<WorkItem>(*this, partner, r));
LOG(spam, "added %s(%s,%s,%s) for %s to workpackage",
- r->GetMethodName(), _exchanger._env.mySpec(),
- _name.c_str(), _spec.c_str(), partner->getName());
+ r->GetMethodName(), _exchanger._env.mySpec().c_str(),
+ _name.c_str(), _spec.c_str(), partner->getName().c_str());
}
diff --git a/slobrok/src/vespa/slobrok/server/exchange_manager.h b/slobrok/src/vespa/slobrok/server/exchange_manager.h
index 4d7bf4cff15..ea335cbb3c0 100644
--- a/slobrok/src/vespa/slobrok/server/exchange_manager.h
+++ b/slobrok/src/vespa/slobrok/server/exchange_manager.h
@@ -1,14 +1,14 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#pragma once
-#include <deque>
-#include <string>
-
-#include <vespa/vespalib/util/hashmap.h>
#include "ok_state.h"
#include "cmd.h"
#include "remote_slobrok.h"
+#include <deque>
+#include <string>
+#include <unordered_map>
+
namespace slobrok {
//-----------------------------------------------------------------------------
@@ -17,8 +17,6 @@ class SBEnv;
class RpcServerMap;
class RpcServerManager;
-using vespalib::HashMap;
-
//-----------------------------------------------------------------------------
/**
@@ -31,10 +29,8 @@ using vespalib::HashMap;
class ExchangeManager
{
private:
- ExchangeManager(const ExchangeManager &); // Not used
- ExchangeManager &operator=(const ExchangeManager &); // Not used
-
- HashMap<RemoteSlobrok *> _partners;
+ using PartnerMap = std::unordered_map<std::string, std::unique_ptr<RemoteSlobrok>>;
+ PartnerMap _partners;
class WorkPackage;
@@ -48,27 +44,21 @@ private:
class WorkPackage
{
private:
- WorkPackage(const WorkPackage&); // not used
- WorkPackage& operator= (const WorkPackage&); // not used
-
class WorkItem: public FRT_IRequestWait
{
private:
WorkPackage &_pkg;
FRT_RPCRequest *_pendingReq;
RemoteSlobrok *_remslob;
-
- WorkItem(const WorkItem&); // not used
- WorkItem& operator= (const WorkItem&); // not used
public:
void expedite();
void RequestDone(FRT_RPCRequest *req) override;
- WorkItem(WorkPackage &pkg,
- RemoteSlobrok *rem,
- FRT_RPCRequest *req);
+ WorkItem(WorkPackage &pkg, RemoteSlobrok *rem, FRT_RPCRequest *req);
+ WorkItem(const WorkItem&) = delete;
+ WorkItem& operator= (const WorkItem&) = delete;
~WorkItem();
};
- std::vector<WorkItem *> _work;
+ std::vector<std::unique_ptr<WorkItem>> _work;
size_t _doneCnt;
size_t _numDenied;
RegRpcSrvCommand _donehandler;
@@ -81,41 +71,36 @@ private:
void addItem(RemoteSlobrok *partner);
void doneItem(bool denied);
void expedite();
- WorkPackage(op_type op,
- const char *name, const char *spec,
- ExchangeManager &exchanger,
- RegRpcSrvCommand donehandler);
+ WorkPackage(const WorkPackage&) = delete;
+ WorkPackage& operator= (const WorkPackage&) = delete;
+ WorkPackage(op_type op, const std::string & name, const std::string & spec,
+ ExchangeManager &exchanger, RegRpcSrvCommand donehandler);
~WorkPackage();
};
public:
+ ExchangeManager(const ExchangeManager &) = delete;
+ ExchangeManager &operator=(const ExchangeManager &) = delete;
ExchangeManager(SBEnv &env, RpcServerMap &rpcsrvmap);
- ~ExchangeManager() {}
+ ~ExchangeManager();
SBEnv &_env;
RpcServerManager &_rpcsrvmanager;
RpcServerMap &_rpcsrvmap;
- OkState addPartner(const char *name, const char *spec);
- void removePartner(const char *name);
+ OkState addPartner(const std::string & name, const std::string & spec);
+ void removePartner(const std::string & name);
std::vector<std::string> getPartnerList();
- void registerFrom(RemoteSlobrok *partner);
- void reregisterTo(RemoteSlobrok *partner);
+ void forwardRemove(const std::string & name, const std::string & spec);
- void forwardRemove(const char *name, const char *spec);
-
- void wantAdd(const char *name, const char *spec, RegRpcSrvCommand rdc);
- void doAdd(const char *name, const char *spec, RegRpcSrvCommand rdc);
-
- RemoteSlobrok *lookupPartner(const char *name) const {
- return _partners[name];
- }
+ void wantAdd(const std::string & name, const std::string & spec, RegRpcSrvCommand rdc);
+ void doAdd(const std::string & name, const std::string & spec, RegRpcSrvCommand rdc);
+ RemoteSlobrok *lookupPartner(const std::string & name) const;
void healthCheck();
};
//-----------------------------------------------------------------------------
} // namespace slobrok
-
diff --git a/slobrok/src/vespa/slobrok/server/history.cpp b/slobrok/src/vespa/slobrok/server/history.cpp
index 9b4fcedba8b..f23b0cbb757 100644
--- a/slobrok/src/vespa/slobrok/server/history.cpp
+++ b/slobrok/src/vespa/slobrok/server/history.cpp
@@ -22,7 +22,7 @@ History::verify() const
}
void
-History::add(const char *name, vespalib::GenCnt gen)
+History::add(const std::string &name, vespalib::GenCnt gen)
{
HistoryEntry h;
_entries.push_back(h);
diff --git a/slobrok/src/vespa/slobrok/server/history.h b/slobrok/src/vespa/slobrok/server/history.h
index 2790d467b1a..ca90c927dc0 100644
--- a/slobrok/src/vespa/slobrok/server/history.h
+++ b/slobrok/src/vespa/slobrok/server/history.h
@@ -18,12 +18,11 @@ private:
std::vector<HistoryEntry> _entries;
- typedef std::vector<HistoryEntry>::iterator iter_t;
typedef std::vector<HistoryEntry>::const_iterator citer_t;
void verify() const;
public:
- void add(const char *name, vespalib::GenCnt gen);
+ void add(const std::string &name, vespalib::GenCnt gen);
bool has(vespalib::GenCnt gen) const;
diff --git a/slobrok/src/vespa/slobrok/server/managed_rpc_server.cpp b/slobrok/src/vespa/slobrok/server/managed_rpc_server.cpp
index 925df0e9f57..065dac04304 100644
--- a/slobrok/src/vespa/slobrok/server/managed_rpc_server.cpp
+++ b/slobrok/src/vespa/slobrok/server/managed_rpc_server.cpp
@@ -12,14 +12,14 @@ namespace slobrok {
//-----------------------------------------------------------------------------
-ManagedRpcServer::ManagedRpcServer(const char *name,
- const char *spec,
+ManagedRpcServer::ManagedRpcServer(const std::string & name,
+ const std::string & spec,
IRpcServerManager &manager)
: NamedService(name, spec),
_mmanager(manager),
_monitor(*this, *manager.getSupervisor()),
- _monitoredServer(NULL),
- _checkServerReq(NULL)
+ _monitoredServer(nullptr),
+ _checkServerReq(nullptr)
{
}
@@ -27,10 +27,10 @@ ManagedRpcServer::ManagedRpcServer(const char *name,
void
ManagedRpcServer::healthCheck()
{
- if (_monitoredServer == NULL) {
+ if (_monitoredServer == nullptr) {
_monitoredServer = _mmanager.getSupervisor()->GetTarget(_spec.c_str());
}
- if (_checkServerReq == NULL) {
+ if (_checkServerReq == nullptr) {
_checkServerReq = _mmanager.getSupervisor()->AllocRPCRequest();
_checkServerReq->SetMethodName("slobrok.callback.listNamesServed");
_monitoredServer->InvokeAsync(_checkServerReq, 25.0, this);
@@ -49,14 +49,14 @@ void
ManagedRpcServer::cleanupMonitor()
{
_monitor.disable();
- if (_monitoredServer != NULL) {
+ if (_monitoredServer != nullptr) {
_monitoredServer->SubRef();
- _monitoredServer = NULL;
+ _monitoredServer = nullptr;
}
- if (_checkServerReq != NULL) {
+ if (_checkServerReq != nullptr) {
_checkServerReq->Abort();
// _checkServerReq cleared by RequestDone Method
- LOG_ASSERT(_checkServerReq == NULL);
+ LOG_ASSERT(_checkServerReq == nullptr);
}
}
@@ -90,9 +90,9 @@ ManagedRpcServer::RequestDone(FRT_RPCRequest *req)
FRT_Values &answer = *(req->GetReturn());
if (req->GetErrorCode() == FRTE_RPC_ABORT) {
- LOG(debug, "rpcserver[%s].check aborted", getName());
+ LOG(debug, "rpcserver[%s].check aborted", getName().c_str());
req->SubRef();
- _checkServerReq = NULL;
+ _checkServerReq = nullptr;
return;
}
@@ -111,18 +111,18 @@ ManagedRpcServer::RequestDone(FRT_RPCRequest *req)
errmsg = "checkServer failed validation";
}
req->SubRef();
- _checkServerReq = NULL;
+ _checkServerReq = nullptr;
cleanupMonitor();
_mmanager.notifyFailedRpcSrv(this, errmsg);
return;
}
// start monitoring connection to server
- LOG_ASSERT(_monitoredServer != NULL);
+ LOG_ASSERT(_monitoredServer != nullptr);
_monitor.enable(_monitoredServer);
req->SubRef();
- _checkServerReq = NULL;
+ _checkServerReq = nullptr;
_mmanager.notifyOkRpcSrv(this);
}
diff --git a/slobrok/src/vespa/slobrok/server/managed_rpc_server.h b/slobrok/src/vespa/slobrok/server/managed_rpc_server.h
index e8bb8b6e2d8..072aebd7850 100644
--- a/slobrok/src/vespa/slobrok/server/managed_rpc_server.h
+++ b/slobrok/src/vespa/slobrok/server/managed_rpc_server.h
@@ -25,14 +25,10 @@ class ManagedRpcServer: public NamedService,
public FRT_IRequestWait,
public IMonitoredServer
{
-private:
- ManagedRpcServer(const ManagedRpcServer&); // Not used
- ManagedRpcServer& operator=(const ManagedRpcServer&); // Not used
-
public:
- ManagedRpcServer(const char *name,
- const char *spec,
- IRpcServerManager &manager);
+ ManagedRpcServer(const ManagedRpcServer&) = delete;
+ ManagedRpcServer& operator=(const ManagedRpcServer&) = delete;
+ ManagedRpcServer(const std::string & name, const std::string & spec, IRpcServerManager &manager);
~ManagedRpcServer();
void healthCheck();
diff --git a/slobrok/src/vespa/slobrok/server/named_service.cpp b/slobrok/src/vespa/slobrok/server/named_service.cpp
index 59c2c31dbdc..c1aeb83a8a5 100644
--- a/slobrok/src/vespa/slobrok/server/named_service.cpp
+++ b/slobrok/src/vespa/slobrok/server/named_service.cpp
@@ -9,8 +9,7 @@ namespace slobrok {
//-----------------------------------------------------------------------------
-NamedService::NamedService(const char *name,
- const char *spec)
+NamedService::NamedService(const std::string & name, const std::string & spec)
: _name(name),
_spec(spec)
{
diff --git a/slobrok/src/vespa/slobrok/server/named_service.h b/slobrok/src/vespa/slobrok/server/named_service.h
index d08b5079ef2..712e340400c 100644
--- a/slobrok/src/vespa/slobrok/server/named_service.h
+++ b/slobrok/src/vespa/slobrok/server/named_service.h
@@ -25,11 +25,11 @@ public:
NamedService(const NamedService &) = delete;
NamedService &operator=(const NamedService &) = delete;
- NamedService(const char *name, const char *spec);
+ NamedService(const std::string & name, const std::string & spec);
virtual ~NamedService();
- const char *getName() const { return _name.c_str(); }
- const char *getSpec() const { return _spec.c_str(); }
+ const std::string & getName() const { return _name; }
+ const std::string & getSpec() const { return _spec; }
};
//-----------------------------------------------------------------------------
diff --git a/slobrok/src/vespa/slobrok/server/remote_slobrok.cpp b/slobrok/src/vespa/slobrok/server/remote_slobrok.cpp
index bc33fc900ec..e8569bbae28 100644
--- a/slobrok/src/vespa/slobrok/server/remote_slobrok.cpp
+++ b/slobrok/src/vespa/slobrok/server/remote_slobrok.cpp
@@ -12,57 +12,45 @@
LOG_SETUP(".rpcserver");
namespace slobrok {
-namespace {
-
-class IgnoreReqDone: public FRT_IRequestWait
-{
- void RequestDone(FRT_RPCRequest *req) override {
- req->SubRef();
- }
-};
-
-} // namespace slobrok::<unnamed>
//-----------------------------------------------------------------------------
-RemoteSlobrok::RemoteSlobrok(const char *name, const char *spec,
+RemoteSlobrok::RemoteSlobrok(const std::string &name, const std::string &spec,
ExchangeManager &manager)
: _exchanger(manager),
_rpcsrvmanager(manager._rpcsrvmanager),
- _remote(NULL),
+ _remote(nullptr),
_rpcserver(name, spec, *this),
_reconnecter(getSupervisor()->GetScheduler(), *this),
_failCnt(0),
- _remAddPeerReq(NULL),
- _remListReq(NULL),
- _remAddReq(NULL),
- _remRemReq(NULL),
+ _remAddPeerReq(nullptr),
+ _remListReq(nullptr),
+ _remAddReq(nullptr),
+ _remRemReq(nullptr),
_pending()
{
_rpcserver.healthCheck();
}
-static IgnoreReqDone ignorer;
-
RemoteSlobrok::~RemoteSlobrok()
{
_reconnecter.disable();
- if (_remote != NULL) {
+ if (_remote != nullptr) {
_remote->SubRef();
- _remote = NULL;
+ _remote = nullptr;
}
- if (_remAddPeerReq != NULL) {
+ if (_remAddPeerReq != nullptr) {
_remAddPeerReq->Abort();
}
- if (_remListReq != NULL) {
+ if (_remListReq != nullptr) {
_remListReq->Abort();
}
- if (_remAddReq != NULL) {
+ if (_remAddReq != nullptr) {
_remAddReq->Abort();
}
- if (_remRemReq != NULL) {
+ if (_remRemReq != nullptr) {
_remRemReq->Abort();
}
// _rpcserver destructor called automatically
@@ -72,32 +60,31 @@ RemoteSlobrok::~RemoteSlobrok()
void
RemoteSlobrok::doPending()
{
- LOG_ASSERT(_remAddReq == NULL);
- LOG_ASSERT(_remRemReq == NULL);
+ LOG_ASSERT(_remAddReq == nullptr);
+ LOG_ASSERT(_remRemReq == nullptr);
- if (_pending.size() > 0) {
- NamedService *todo = _pending.front();
+ if ( ! _pending.empty() ) {
+ std::unique_ptr<NamedService> todo = std::move(_pending.front());
_pending.pop_front();
- NamedService *rpcsrv = _exchanger._rpcsrvmap.lookup(todo->getName());
+ const NamedService *rpcsrv = _exchanger._rpcsrvmap.lookup(todo->getName());
- if (rpcsrv == NULL) {
+ if (rpcsrv == nullptr) {
_remRemReq = getSupervisor()->AllocRPCRequest();
_remRemReq->SetMethodName("slobrok.internal.doRemove");
- _remRemReq->GetParams()->AddString(_exchanger._env.mySpec());
- _remRemReq->GetParams()->AddString(todo->getName());
- _remRemReq->GetParams()->AddString(todo->getSpec());
+ _remRemReq->GetParams()->AddString(_exchanger._env.mySpec().c_str());
+ _remRemReq->GetParams()->AddString(todo->getName().c_str());
+ _remRemReq->GetParams()->AddString(todo->getSpec().c_str());
_remote->InvokeAsync(_remRemReq, 2.0, this);
} else {
_remAddReq = getSupervisor()->AllocRPCRequest();
_remAddReq->SetMethodName("slobrok.internal.doAdd");
- _remAddReq->GetParams()->AddString(_exchanger._env.mySpec());
- _remAddReq->GetParams()->AddString(todo->getName());
- _remAddReq->GetParams()->AddString(rpcsrv->getSpec());
+ _remAddReq->GetParams()->AddString(_exchanger._env.mySpec().c_str());
+ _remAddReq->GetParams()->AddString(todo->getName().c_str());
+ _remAddReq->GetParams()->AddString(rpcsrv->getSpec().c_str());
_remote->InvokeAsync(_remAddReq, 2.0, this);
}
// XXX should save this and pick up on RequestDone()
- delete todo;
}
}
@@ -110,8 +97,7 @@ RemoteSlobrok::pushMine()
while (mine.size() > 0) {
const NamedService *now = mine.back();
mine.pop_back();
- NamedService *copy = new NamedService(now->getName(), now->getSpec());
- _pending.push_back(copy);
+ _pending.push_back(std::make_unique<NamedService>(now->getName(), now->getSpec()));
}
doPending();
}
@@ -127,19 +113,18 @@ RemoteSlobrok::RequestDone(FRT_RPCRequest *req)
const char *myname = args[0]._string._str;
const char *myspec = args[1]._string._str;
LOG(error, "addPeer(%s, %s) on remote slobrok %s at %s: %s",
- myname, myspec, getName(), getSpec(),
- req->GetErrorMessage());
+ myname, myspec, getName().c_str(), getSpec().c_str(), req->GetErrorMessage());
req->SubRef();
- _remAddPeerReq = NULL;
+ _remAddPeerReq = nullptr;
goto retrylater;
}
req->SubRef();
- _remAddPeerReq = NULL;
+ _remAddPeerReq = nullptr;
// next step is to ask the remote to send its list of managed names:
- LOG_ASSERT(_remListReq == NULL);
+ LOG_ASSERT(_remListReq == nullptr);
_remListReq = getSupervisor()->AllocRPCRequest();
_remListReq->SetMethodName("slobrok.internal.listManagedRpcServers");
- if (_remote != NULL) {
+ if (_remote != nullptr) {
_remote->InvokeAsync(_remListReq, 3.0, this);
}
// when _remListReq is returned, our managed list is added
@@ -149,19 +134,18 @@ RemoteSlobrok::RequestDone(FRT_RPCRequest *req)
|| strcmp(answer.GetTypeString(), "SS") != 0)
{
LOG(error, "error listing remote slobrok %s at %s: %s",
- getName(), getSpec(), req->GetErrorMessage());
+ getName().c_str(), getSpec().c_str(), req->GetErrorMessage());
req->SubRef();
- _remListReq = NULL;
+ _remListReq = nullptr;
goto retrylater;
}
uint32_t numNames = answer.GetValue(0)._string_array._len;
uint32_t numSpecs = answer.GetValue(1)._string_array._len;
if (numNames != numSpecs) {
- LOG(error, "inconsistent array lengths from %s at %s",
- getName(), getSpec());
+ LOG(error, "inconsistent array lengths from %s at %s", getName().c_str(), getSpec().c_str());
req->SubRef();
- _remListReq = NULL;
+ _remListReq = nullptr;
goto retrylater;
}
FRT_StringValue *names = answer.GetValue(0)._string_array._pt;
@@ -171,7 +155,7 @@ RemoteSlobrok::RequestDone(FRT_RPCRequest *req)
_rpcsrvmanager.addRemote(names[idx]._str, specs[idx]._str);
}
req->SubRef();
- _remListReq = NULL;
+ _remListReq = nullptr;
// next step is to push the ones I own:
pushMine();
@@ -180,10 +164,9 @@ RemoteSlobrok::RequestDone(FRT_RPCRequest *req)
if (req->IsError() && (req->GetErrorCode() == FRTE_RPC_CONNECTION ||
req->GetErrorCode() == FRTE_RPC_TIMEOUT))
{
- LOG(error, "connection error adding to remote slobrok: %s",
- req->GetErrorMessage());
+ LOG(error, "connection error adding to remote slobrok: %s", req->GetErrorMessage());
req->SubRef();
- _remAddReq = NULL;
+ _remAddReq = nullptr;
goto retrylater;
}
if (req->IsError()) {
@@ -195,29 +178,27 @@ RemoteSlobrok::RequestDone(FRT_RPCRequest *req)
_rpcsrvmanager.removeLocal(rpcsrvname, rpcsrvspec);
}
req->SubRef();
- _remAddReq = NULL;
+ _remAddReq = nullptr;
doPending();
} else if (req == _remRemReq) {
// handle response after pushing some remove we had pending:
if (req->IsError() && (req->GetErrorCode() == FRTE_RPC_CONNECTION ||
req->GetErrorCode() == FRTE_RPC_TIMEOUT))
{
- LOG(error, "connection error adding to remote slobrok: %s",
- req->GetErrorMessage());
+ LOG(error, "connection error adding to remote slobrok: %s", req->GetErrorMessage());
req->SubRef();
- _remRemReq = NULL;
+ _remRemReq = nullptr;
goto retrylater;
}
if (req->IsError()) {
- LOG(warning, "error removing on remote slobrok: %s",
- req->GetErrorMessage());
+ LOG(warning, "error removing on remote slobrok: %s", req->GetErrorMessage());
}
req->SubRef();
- _remRemReq = NULL;
+ _remRemReq = nullptr;
doPending();
} else {
LOG(error, "got unknown request back in RequestDone()");
- LOG_ASSERT(req == NULL);
+ LOG_ASSERT(req == nullptr);
}
return;
@@ -232,10 +213,10 @@ RemoteSlobrok::notifyFailedRpcSrv(ManagedRpcServer *rpcsrv, std::string errmsg)
{
if (++_failCnt > 10) {
LOG(warning, "remote location broker at %s failed: %s",
- rpcsrv->getSpec(), errmsg.c_str());
+ rpcsrv->getSpec().c_str(), errmsg.c_str());
} else {
LOG(debug, "remote location broker at %s failed: %s",
- rpcsrv->getSpec(), errmsg.c_str());
+ rpcsrv->getSpec().c_str(), errmsg.c_str());
}
LOG_ASSERT(rpcsrv == &_rpcserver);
fail();
@@ -246,9 +227,9 @@ void
RemoteSlobrok::fail()
{
// disconnect
- if (_remote != NULL) {
+ if (_remote != nullptr) {
_remote->SubRef();
- _remote = NULL;
+ _remote = nullptr;
}
// schedule reconnect attempt
_reconnecter.scheduleTryConnect();
@@ -258,13 +239,13 @@ RemoteSlobrok::fail()
void
RemoteSlobrok::healthCheck()
{
- if (_remote != NULL &&
- _remAddPeerReq == NULL &&
- _remListReq == NULL &&
- _remAddReq == NULL &&
- _remRemReq == NULL)
+ if (_remote != nullptr &&
+ _remAddPeerReq == nullptr &&
+ _remListReq == nullptr &&
+ _remAddReq == nullptr &&
+ _remRemReq == nullptr)
{
- LOG(debug, "spamming remote at %s with my names", getName());
+ LOG(debug, "spamming remote at %s with my names", getName().c_str());
pushMine();
} else {
LOG(debug, "not pushing mine, as we have: remote %p r.a.p.r=%p r.l.r=%p r.a.r=%p r.r.r=%p",
@@ -282,8 +263,8 @@ RemoteSlobrok::notifyOkRpcSrv(ManagedRpcServer *rpcsrv)
// connection was OK, so disable any pending reconnect
_reconnecter.disable();
- if (_remote == NULL) {
- _remote = getSupervisor()->GetTarget(getSpec());
+ if (_remote == nullptr) {
+ _remote = getSupervisor()->GetTarget(getSpec().c_str());
}
// at this point, we will do (in sequence):
@@ -294,8 +275,8 @@ RemoteSlobrok::notifyOkRpcSrv(ManagedRpcServer *rpcsrv)
_remAddPeerReq = getSupervisor()->AllocRPCRequest();
_remAddPeerReq->SetMethodName("slobrok.admin.addPeer");
- _remAddPeerReq->GetParams()->AddString(_exchanger._env.mySpec());
- _remAddPeerReq->GetParams()->AddString(_exchanger._env.mySpec());
+ _remAddPeerReq->GetParams()->AddString(_exchanger._env.mySpec().c_str());
+ _remAddPeerReq->GetParams()->AddString(_exchanger._env.mySpec().c_str());
_remote->InvokeAsync(_remAddPeerReq, 3.0, this);
// when _remAddPeerReq is returned, our managed list is added via doAdd()
}
diff --git a/slobrok/src/vespa/slobrok/server/remote_slobrok.h b/slobrok/src/vespa/slobrok/server/remote_slobrok.h
index 1851e57c93c..a5d17e0452b 100644
--- a/slobrok/src/vespa/slobrok/server/remote_slobrok.h
+++ b/slobrok/src/vespa/slobrok/server/remote_slobrok.h
@@ -26,9 +26,6 @@ class RemoteSlobrok: public IRpcServerManager,
public FRT_IRequestWait
{
private:
- RemoteSlobrok(const RemoteSlobrok&); // not used
- RemoteSlobrok& operator= (const RemoteSlobrok&); // not used
-
class Reconnecter : public FNET_Task
{
private:
@@ -38,13 +35,12 @@ private:
Reconnecter &operator=(const Reconnecter &); // not used
public:
explicit Reconnecter(FNET_Scheduler *sched, RemoteSlobrok &owner);
- ~Reconnecter();
+ ~Reconnecter() override;
void scheduleTryConnect();
void disable();
void PerformTask() override;
};
-private:
ExchangeManager &_exchanger;
RpcServerManager &_rpcsrvmanager;
FRT_Target *_remote;
@@ -57,24 +53,23 @@ private:
FRT_RPCRequest *_remAddReq;
FRT_RPCRequest *_remRemReq;
- std::deque<NamedService *> _pending;
+ std::deque<std::unique_ptr<NamedService>> _pending;
void pushMine();
void doPending();
public:
- RemoteSlobrok(const char *name, const char *spec,
- ExchangeManager &manager);
- ~RemoteSlobrok();
+ RemoteSlobrok(const RemoteSlobrok&) = delete;
+ RemoteSlobrok& operator= (const RemoteSlobrok&) = delete;
+ RemoteSlobrok(const std::string &name, const std::string &spec, ExchangeManager &manager);
+ ~RemoteSlobrok() override;
void fail();
- bool isConnected() const { return (_remote != NULL); }
+ bool isConnected() const { return (_remote != nullptr); }
void tryConnect();
void healthCheck();
- void invokeAsync(FRT_RPCRequest *req,
- double timeout,
- FRT_IRequestWait *rwaiter);
- const char *getName() const { return _rpcserver.getName(); }
- const char *getSpec() const { return _rpcserver.getSpec(); }
+ void invokeAsync(FRT_RPCRequest *req, double timeout, FRT_IRequestWait *rwaiter);
+ const std::string & getName() const { return _rpcserver.getName(); }
+ const std::string & getSpec() const { return _rpcserver.getSpec(); }
// interfaces implemented:
void notifyFailedRpcSrv(ManagedRpcServer *rpcsrv, std::string errmsg) override;
diff --git a/slobrok/src/vespa/slobrok/server/reserved_name.h b/slobrok/src/vespa/slobrok/server/reserved_name.h
index 7761dc37918..1ebed4b94dc 100644
--- a/slobrok/src/vespa/slobrok/server/reserved_name.h
+++ b/slobrok/src/vespa/slobrok/server/reserved_name.h
@@ -22,15 +22,15 @@ private:
public:
const bool isLocal;
- ReservedName(const char *name, const char *spec, bool local)
+ ReservedName(const std::string &name, const std::string &spec, bool local)
: NamedService(name, spec), _reservedTime(), isLocal(local)
{
_reservedTime.SetNow();
}
- bool stillReserved() {
+ bool stillReserved() const {
return (_reservedTime.MilliSecsToNow() < 15000);
}
- int seconds() { return _reservedTime.MilliSecsToNow() / 1000; }
+ int seconds() const { return _reservedTime.MilliSecsToNow() / 1000; }
};
//-----------------------------------------------------------------------------
diff --git a/slobrok/src/vespa/slobrok/server/rpc_server_manager.cpp b/slobrok/src/vespa/slobrok/server/rpc_server_manager.cpp
index 293975cc82a..e63efd8089a 100644
--- a/slobrok/src/vespa/slobrok/server/rpc_server_manager.cpp
+++ b/slobrok/src/vespa/slobrok/server/rpc_server_manager.cpp
@@ -24,15 +24,15 @@ RpcServerManager::RpcServerManager(SBEnv &sbenv)
}
static OkState
-validateName(const char *rpcsrvname)
+validateName(const std::string & rpcsrvname)
{
- const char *p = rpcsrvname;
+ const char *p = rpcsrvname.c_str();
while (*p != '\0') {
// important: disallow '*'
if (strchr("+,-./:=@[]_{}~<>"
"0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "abcdefghijklmnopqrstuvwxyz", *p) == NULL)
+ "abcdefghijklmnopqrstuvwxyz", *p) == nullptr)
{
std::ostringstream tmp;
tmp << "Illegal character '" << *p << "' (";
@@ -49,22 +49,20 @@ validateName(const char *rpcsrvname)
OkState
-RpcServerManager::checkPartner(const char *remslobrok)
+RpcServerManager::checkPartner(const std::string & remslobrok)
{
- if (strcmp(remslobrok, _env.mySpec()) == 0) {
+ if (remslobrok == _env.mySpec()) {
return OkState(13, "remote slobrok using my rpcserver name");
}
- RemoteSlobrok *partner = _exchanger.lookupPartner(remslobrok);
- if (partner == NULL) {
+ const RemoteSlobrok *partner = _exchanger.lookupPartner(remslobrok);
+ if (partner == nullptr) {
return OkState(13, "remote slobrok not a partner");
}
return OkState();
}
OkState
-RpcServerManager::addRemReservation(const char *remslobrok,
- const char *name,
- const char *spec)
+RpcServerManager::addRemReservation(const std::string & remslobrok, const std::string & name, const std::string &spec)
{
OkState state = checkPartner(remslobrok);
if (state.failed()) return state;
@@ -72,31 +70,28 @@ RpcServerManager::addRemReservation(const char *remslobrok,
OkState valid = validateName(name);
if (valid.failed()) return valid;
- NamedService *old = _rpcsrvmap.lookupManaged(name);
- if (old != NULL) {
- if (strcmp(old->getSpec(), spec) == 0) {
+ const NamedService *old = _rpcsrvmap.lookupManaged(name);
+ if (old != nullptr) {
+ if (old->getSpec() == spec) {
// was alright already
return OkState(0, "already registered");
}
LOG(warning, "remote %s tried to register [%s -> %s] but we already have [%s -> %s] registered!",
- remslobrok, name, spec, old->getName(), old->getSpec());
+ remslobrok.c_str(), name.c_str(), spec.c_str(), old->getName().c_str(), old->getSpec().c_str());
return OkState(FRTE_RPC_METHOD_FAILED, "already managed by me");
}
if (_rpcsrvmap.conflictingReservation(name, spec)) {
- return OkState(FRTE_RPC_METHOD_FAILED,
- "registration for name already in progress");
+ return OkState(FRTE_RPC_METHOD_FAILED, "registration for name already in progress");
}
- ReservedName *rpcsrv = new ReservedName(name, spec, false);
- _rpcsrvmap.addReservation(rpcsrv);
+ _rpcsrvmap.addReservation(std::make_unique<ReservedName>(name, spec, false));
return OkState(0, "done");
}
OkState
-RpcServerManager::addPeer(const char *remsbname,
- const char *remsbspec)
+RpcServerManager::addPeer(const std::string & remsbname, const std::string &remsbspec)
{
- if (strcmp(remsbname, _env.mySpec()) == 0) {
+ if (remsbname == _env.mySpec()) {
return OkState(13, "cannot add remote slobrok with my rpcserver name");
}
return _exchanger.addPartner(remsbname, remsbspec);
@@ -104,17 +99,16 @@ RpcServerManager::addPeer(const char *remsbname,
OkState
-RpcServerManager::removePeer(const char *remsbname,
- const char *remsbspec)
+RpcServerManager::removePeer(const std::string & remsbname, const std::string & remsbspec)
{
- if (strcmp(remsbname, _env.mySpec()) == 0) {
+ if (remsbname == _env.mySpec()) {
return OkState(13, "cannot remove my own rpcserver name");
}
- RemoteSlobrok *partner = _exchanger.lookupPartner(remsbname);
- if (partner == NULL) {
+ const RemoteSlobrok *partner = _exchanger.lookupPartner(remsbname);
+ if (partner == nullptr) {
return OkState(0, "remote slobrok not a partner");
}
- if (strcmp(partner->getSpec(), remsbspec) != 0) {
+ if (partner->getSpec() != remsbspec) {
return OkState(13, "peer registered with different spec");
}
_exchanger.removePartner(remsbname);
@@ -123,41 +117,39 @@ RpcServerManager::removePeer(const char *remsbname,
OkState
-RpcServerManager::addMyReservation(const char *name, const char *spec)
+RpcServerManager::addMyReservation(const std::string & name, const std::string & spec)
{
OkState valid = validateName(name);
if (valid.failed()) return valid;
- NamedService *old = _rpcsrvmap.lookupManaged(name);
- if (old != NULL) {
- if (strcmp(old->getSpec(), spec) == 0) {
+ const NamedService *old = _rpcsrvmap.lookupManaged(name);
+ if (old != nullptr) {
+ if (old->getSpec() == spec) {
// was alright already
return OkState(0, "already registered");
} else {
return OkState(FRTE_RPC_METHOD_FAILED, vespalib::make_string(
"name %s registered (to %s), cannot register %s",
- name, old->getSpec(), spec));
+ name.c_str(), old->getSpec().c_str(), spec.c_str()));
}
}
// check if we already are in the progress of adding this
if (_rpcsrvmap.conflictingReservation(name, spec)) {
- ReservedName * rsv = _rpcsrvmap.getReservation(name);
+ const ReservedName * rsv = _rpcsrvmap.getReservation(name);
LOG(warning, "conflicting registrations: wanted [%s -> %s] but [%s -> %s] already reserved",
- name, spec, rsv->getName(), rsv->getSpec());
+ name.c_str(), spec.c_str(), rsv->getName().c_str(), rsv->getSpec().c_str());
return OkState(FRTE_RPC_METHOD_FAILED,
"registration for name already in progress with a different spec");
}
_rpcsrvmap.removeReservation(name);
- ReservedName *rpcsrv = new ReservedName(name, spec, true);
- _rpcsrvmap.addReservation(rpcsrv);
+ _rpcsrvmap.addReservation(std::make_unique<ReservedName>(name, spec, true));
return OkState(0, "done");
}
OkState
-RpcServerManager::addRemote(const char *name,
- const char *spec)
+RpcServerManager::addRemote(const std::string & name, const std::string &spec)
{
OkState valid = validateName(name);
if (valid.failed()) return valid;
@@ -165,13 +157,12 @@ RpcServerManager::addRemote(const char *name,
if (alreadyManaged(name, spec)) {
return OkState(0, "already correct");
}
- NamedService *old = _rpcsrvmap.lookup(name);
- if (old != NULL) {
- if (strcmp(old->getSpec(), spec) != 0) {
- LOG(warning, "collision on remote add: "
- "name %s registered to %s locally, "
+ const NamedService *old = _rpcsrvmap.lookup(name);
+ if (old != nullptr) {
+ if (old->getSpec() != spec) {
+ LOG(warning, "collision on remote add: name %s registered to %s locally, "
"but another location broker wants it registered to %s",
- name, old->getSpec(), spec);
+ name.c_str(), old->getSpec().c_str(), spec.c_str());
removeRemote(name, old->getSpec());
return OkState(13, "registered, with different spec");
}
@@ -180,16 +171,17 @@ RpcServerManager::addRemote(const char *name,
return OkState(0, "already correct");
}
_rpcsrvmap.removeReservation(name);
- ManagedRpcServer *rpcsrv = new ManagedRpcServer(name, spec, *this);
- _rpcsrvmap.addNew(rpcsrv);
- rpcsrv->healthCheck();
+ auto rpcsrv = std::make_unique<ManagedRpcServer>(name, spec, *this);
+ ManagedRpcServer & rpcServer = *rpcsrv;
+ _rpcsrvmap.addNew(std::move(rpcsrv));
+ rpcServer.healthCheck();
return OkState(0, "done");
}
OkState
RpcServerManager::remove(ManagedRpcServer *rpcsrv)
{
- NamedService *td = _rpcsrvmap.lookup(rpcsrv->getName());
+ const NamedService *td = _rpcsrvmap.lookup(rpcsrv->getName());
if (td == rpcsrv) {
return removeLocal(rpcsrv->getName(), rpcsrv->getSpec());
} else {
@@ -199,84 +191,80 @@ RpcServerManager::remove(ManagedRpcServer *rpcsrv)
OkState
-RpcServerManager::removeRemote(const char *name,
- const char *spec)
+RpcServerManager::removeRemote(const std::string &name, const std::string &spec)
{
- NamedService *old = _rpcsrvmap.lookup(name);
- if (old == NULL) {
+ const NamedService *old = _rpcsrvmap.lookup(name);
+ if (old == nullptr) {
// was alright already, remove any reservation too
_rpcsrvmap.removeReservation(name);
return OkState(0, "already done");
}
- if (strcmp(old->getSpec(), spec) != 0) {
+ if (old->getSpec() != spec) {
return OkState(1, "name registered, but with different spec");
}
- NamedService *td = _rpcsrvmap.remove(name);
- LOG_ASSERT(td == old);
- delete td;
+ std::unique_ptr<NamedService> td = _rpcsrvmap.remove(name);
+ LOG_ASSERT(td.get() == old);
return OkState(0, "done");
}
OkState
-RpcServerManager::removeLocal(const char *name, const char *spec)
+RpcServerManager::removeLocal(const std::string & name, const std::string &spec)
{
- NamedService *td = _rpcsrvmap.lookup(name);
- if (td == NULL) {
+ const NamedService *td = _rpcsrvmap.lookup(name);
+ if (td == nullptr) {
// already removed, nop
return OkState();
}
- RemoteSlobrok *partner = _exchanger.lookupPartner(name);
- if (partner != NULL) {
+ const RemoteSlobrok *partner = _exchanger.lookupPartner(name);
+ if (partner != nullptr) {
return OkState(13, "cannot unregister partner slobrok");
}
- ManagedRpcServer *rpcsrv = _rpcsrvmap.lookupManaged(name);
- if (rpcsrv == NULL) {
+ const ManagedRpcServer *rpcsrv = _rpcsrvmap.lookupManaged(name);
+ if (rpcsrv == nullptr) {
return OkState(13, "not a local rpcserver");
}
- if (strcmp(rpcsrv->getSpec(), spec) != 0) {
+ if (rpcsrv->getSpec() != spec) {
// the client can probably ignore this "error"
// or log it on level INFO?
return OkState(1, "name registered, but with different spec");
}
- td = _rpcsrvmap.remove(name);
- LOG_ASSERT(td == rpcsrv);
- delete rpcsrv;
+ auto tdUP = _rpcsrvmap.remove(name);
+ LOG_ASSERT(tdUP.get() == rpcsrv);
_exchanger.forwardRemove(name, spec);
return OkState();
}
void
-RpcServerManager::addManaged(const char *name, const char *spec,
- RegRpcSrvCommand rdc)
+RpcServerManager::addManaged(const std::string &name, const std::string &spec, RegRpcSrvCommand rdc)
{
- ManagedRpcServer *rpcsrv = new ManagedRpcServer(name, spec, *this);
- _rpcsrvmap.addNew(rpcsrv);
+ auto newRpcServer = std::make_unique<ManagedRpcServer>(name, spec, *this);
+ ManagedRpcServer & rpcsrv = *newRpcServer;
+ _rpcsrvmap.addNew(std::move(newRpcServer));
for (size_t i = 0; i < _addManageds.size(); i++) {
- if (_addManageds[i].rpcsrv == NULL) {
- _addManageds[i].rpcsrv = rpcsrv;
- _addManageds[i].handler = rdc;
- rpcsrv->healthCheck();
+ if (_addManageds[i].rpcsrv == nullptr) {
+ _addManageds[i].rpcsrv = &rpcsrv;
+ _addManageds[i].handler = std::move(rdc);
+ rpcsrv.healthCheck();
return;
}
}
- MRSandRRSC pair(rpcsrv, rdc);
- _addManageds.push_back(pair);
- rpcsrv->healthCheck();
+ _addManageds.emplace_back(&rpcsrv, std::move(rdc));
+ rpcsrv.healthCheck();
return;
}
bool
-RpcServerManager::alreadyManaged(const char *name, const char *spec)
+RpcServerManager::alreadyManaged(const std::string &name, const std::string &spec)
{
- ManagedRpcServer *rpcsrv = _rpcsrvmap.lookupManaged(name);
- if (rpcsrv != NULL) {
- if (strcmp(rpcsrv->getSpec(), spec) == 0) {
+ const ManagedRpcServer *rpcsrv = _rpcsrvmap.lookupManaged(name);
+ if (rpcsrv != nullptr) {
+ if (rpcsrv->getSpec() == spec) {
return true;
}
}
@@ -294,11 +282,8 @@ RpcServerManager::~RpcServerManager()
void
RpcServerManager::PerformTask()
{
- std::vector<ManagedRpcServer *> dl;
- std::swap(dl, _deleteList);
- for (uint32_t i = 0; i < dl.size(); ++i) {
- delete dl[i];
- }
+ std::vector<std::unique_ptr<ManagedRpcServer>> deleteAfterSwap;
+ std::swap(deleteAfterSwap, _deleteList);
}
@@ -307,12 +292,12 @@ RpcServerManager::notifyFailedRpcSrv(ManagedRpcServer *rpcsrv, std::string errms
{
_env.countFailedHeartbeat();
bool logged = false;
- NamedService *old = _rpcsrvmap.lookup(rpcsrv->getName());
+ const NamedService *old = _rpcsrvmap.lookup(rpcsrv->getName());
if (old == rpcsrv) {
- old = _rpcsrvmap.remove(rpcsrv->getName());
+ old = _rpcsrvmap.remove(rpcsrv->getName()).release();
LOG_ASSERT(old == rpcsrv);
LOG(info, "managed server %s at %s failed: %s",
- rpcsrv->getName(), rpcsrv->getSpec(), errmsg.c_str());
+ rpcsrv->getName().c_str(), rpcsrv->getSpec().c_str(), errmsg.c_str());
logged = true;
}
_exchanger.forwardRemove(rpcsrv->getName(), rpcsrv->getSpec());
@@ -322,15 +307,15 @@ RpcServerManager::notifyFailedRpcSrv(ManagedRpcServer *rpcsrv, std::string errms
.doneHandler(OkState(13, "failed check using listNames callback"));
_addManageds[i].rpcsrv = 0;
LOG(warning, "rpcserver %s at %s failed while trying to register",
- rpcsrv->getName(), rpcsrv->getSpec());
+ rpcsrv->getName().c_str(), rpcsrv->getSpec().c_str());
logged = true;
}
}
if (!logged) {
LOG(warning, "unmanaged server %s at %s failed: %s",
- rpcsrv->getName(), rpcsrv->getSpec(), errmsg.c_str());
+ rpcsrv->getName().c_str(), rpcsrv->getSpec().c_str(), errmsg.c_str());
}
- _deleteList.push_back(rpcsrv);
+ _deleteList.push_back(std::unique_ptr<ManagedRpcServer>(rpcsrv));
ScheduleNow();
}
diff --git a/slobrok/src/vespa/slobrok/server/rpc_server_manager.h b/slobrok/src/vespa/slobrok/server/rpc_server_manager.h
index a01e1592690..70ca10e480d 100644
--- a/slobrok/src/vespa/slobrok/server/rpc_server_manager.h
+++ b/slobrok/src/vespa/slobrok/server/rpc_server_manager.h
@@ -7,6 +7,7 @@
#include "named_service.h"
#include <vespa/fnet/task.h>
#include <vector>
+#include <memory>
namespace slobrok {
@@ -39,60 +40,30 @@ private:
ManagedRpcServer *rpcsrv;
RegRpcSrvCommand handler;
MRSandRRSC(ManagedRpcServer *d, RegRpcSrvCommand h)
- : rpcsrv(d), handler(h) {}
-
- MRSandRRSC(const MRSandRRSC &rhs)
- : rpcsrv(rhs.rpcsrv),
- handler(rhs.handler)
- {
- }
-
- MRSandRRSC& operator=(const MRSandRRSC &rhs)
- {
- rpcsrv = rhs.rpcsrv;
- handler = rhs.handler;
- return *this;
- }
+ : rpcsrv(d), handler(std::move(h)) {}
};
std::vector<MRSandRRSC> _addManageds;
- std::vector<ManagedRpcServer *> _deleteList;
-
- RpcServerManager(const RpcServerManager &); // Not used
- RpcServerManager &operator=(const RpcServerManager &); // Not used
-
+ std::vector<std::unique_ptr<ManagedRpcServer>> _deleteList;
public:
- OkState checkPartner(const char *remslobrok);
-
- OkState addPeer(const char *remsbname,
- const char *remsbspec);
- OkState removePeer(const char *remsbname,
- const char *remsbspec);
+ OkState checkPartner(const std::string & remslobrok);
- OkState addLocal(const char *name,
- const char *spec,
- FRT_RPCRequest *req);
- OkState addRemote(const char *name,
- const char *spec);
+ OkState addPeer(const std::string & remsbname, const std::string & remsbspec);
+ OkState removePeer(const std::string & remsbname, const std::string & remsbspec);
+ OkState addRemote(const std::string & name, const std::string & spec);
- OkState addRemReservation(const char *remslobrok,
- const char *name,
- const char *spec);
- OkState addMyReservation(const char *name,
- const char *spec);
+ OkState addRemReservation(const std::string & remslobrok, const std::string & name, const std::string & spec);
+ OkState addMyReservation(const std::string & name, const std::string & spec);
- bool alreadyManaged(const char *name,
- const char *spec);
- void addManaged(const char *name,
- const char *spec,
- RegRpcSrvCommand rdc);
+ bool alreadyManaged(const std::string & name, const std::string & spec);
+ void addManaged(const std::string & name, const std::string & spec, RegRpcSrvCommand rdc);
OkState remove(ManagedRpcServer *rpcsrv);
- OkState removeLocal(const char *name, const char *spec);
-
- OkState removeRemote(const char *name,
- const char *spec);
+ OkState removeLocal(const std::string & name, const std::string & spec);
+ OkState removeRemote(const std::string & name, const std::string & spec);
+ RpcServerManager(const RpcServerManager &) = delete;
+ RpcServerManager &operator=(const RpcServerManager &) = delete;
RpcServerManager(SBEnv &sbenv);
~RpcServerManager();
diff --git a/slobrok/src/vespa/slobrok/server/rpc_server_map.cpp b/slobrok/src/vespa/slobrok/server/rpc_server_map.cpp
index 06c5698ec09..e19a91cd78d 100644
--- a/slobrok/src/vespa/slobrok/server/rpc_server_map.cpp
+++ b/slobrok/src/vespa/slobrok/server/rpc_server_map.cpp
@@ -12,33 +12,34 @@ namespace slobrok {
//-----------------------------------------------------------------------------
-NamedService *
-RpcServerMap::lookup(const char *name) const
-{
- NamedService *d = _myrpcsrv_map[name];
- return d;
+ManagedRpcServer *
+RpcServerMap::lookupManaged(const std::string & name) const {
+ auto found = _myrpcsrv_map.find(name);
+ return (found == _myrpcsrv_map.end()) ? nullptr : found->second.get();
}
+const NamedService *
+RpcServerMap::lookup(const std::string & name) const
+{
+ return lookupManaged(name);
+}
-NamedService *
-RpcServerMap::remove(const char *name)
+std::unique_ptr<NamedService>
+RpcServerMap::remove(const std::string & name)
{
_visible_map.remove(name);
- NamedService *d = _myrpcsrv_map.remove(name);
- return d;
+ auto service = std::move(_myrpcsrv_map[name]);
+ _myrpcsrv_map.erase(name);
+ return service;
}
-
-
std::vector<const NamedService *>
RpcServerMap::lookupPattern(const char *pattern) const
{
std::vector<const NamedService *> retval;
- for (HashMap<ManagedRpcServer *>::Iterator it = _myrpcsrv_map.iterator();
- it.valid(); it.next())
- {
- if (match(it.key(), pattern)) {
- retval.push_back(it.value());
+ for (const auto & entry : _myrpcsrv_map) {
+ if (match(entry.first.c_str(), pattern)) {
+ retval.push_back(entry.second.get());
}
}
return retval;
@@ -50,10 +51,8 @@ RpcServerMap::allManaged() const
{
std::vector<const NamedService *> retval;
// get list of all names in myrpcsrv_map
- for (HashMap<ManagedRpcServer *>::Iterator it = _myrpcsrv_map.iterator();
- it.valid(); it.next())
- {
- retval.push_back(it.value());
+ for (const auto & entry : _myrpcsrv_map) {
+ retval.push_back(entry.second.get());
}
return retval;
}
@@ -62,104 +61,98 @@ RpcServerMap::allManaged() const
void
RpcServerMap::add(NamedService *rpcsrv)
{
- const char *name = rpcsrv->getName();
+ const std::string &name = rpcsrv->getName();
- LOG_ASSERT(rpcsrv != NULL);
- LOG_ASSERT(_myrpcsrv_map.isSet(name) == false);
+ LOG_ASSERT(rpcsrv != nullptr);
+ LOG_ASSERT(_myrpcsrv_map.find(name) == _myrpcsrv_map.end());
removeReservation(name);
- LOG_ASSERT(_visible_map.lookup(name) == NULL);
+ LOG_ASSERT(_visible_map.lookup(name) == nullptr);
_visible_map.addNew(rpcsrv);
}
void
-RpcServerMap::addNew(ManagedRpcServer *rpcsrv)
+RpcServerMap::addNew(std::unique_ptr<ManagedRpcServer> rpcsrv)
{
- const char *name = rpcsrv->getName();
+ const std::string &name = rpcsrv->getName();
- ManagedRpcServer *oldman = _myrpcsrv_map.remove(name);
+ auto oldman = std::move(_myrpcsrv_map[name]);
+ _myrpcsrv_map.erase(name);
- if (oldman != NULL) {
- ReservedName *oldres = _reservations[name];
- NamedService *oldvis = _visible_map.remove(name);
+ if (oldman) {
+ const ReservedName *oldres = _reservations[name].get();
+ const NamedService *oldvis = _visible_map.remove(name);
- const char *spec = rpcsrv->getSpec();
- const char *oldname = oldman->getName();
- const char *oldspec = oldman->getSpec();
- if (strcmp(spec, oldspec) != 0) {
+ const std::string &spec = rpcsrv->getSpec();
+ const std::string &oldname = oldman->getName();
+ const std::string &oldspec = oldman->getSpec();
+ if (spec != oldspec) {
LOG(warning, "internal state problem: adding [%s at %s] but already had [%s at %s]",
- name, spec, oldname, oldspec);
- if (oldvis != oldman) {
- const char *n = oldvis->getName();
- const char *s = oldvis->getSpec();
- LOG(warning, "BAD: different old visible: [%s at %s]", n, s);
+ name.c_str(), spec.c_str(), oldname.c_str(), oldspec.c_str());
+ if (oldvis != oldman.get()) {
+ const std::string &n = oldvis->getName();
+ const std::string &s = oldvis->getSpec();
+ LOG(warning, "BAD: different old visible: [%s at %s]", n.c_str(), s.c_str());
}
- if (oldres != NULL) {
- const char *n = oldres->getName();
- const char *s = oldres->getSpec();
- LOG(warning, "old reservation: [%s at %s]", n, s);
+ if (oldres != nullptr) {
+ const std::string &n = oldres->getName();
+ const std::string &s = oldres->getSpec();
+ LOG(warning, "old reservation: [%s at %s]", n.c_str(), s.c_str());
}
}
- delete oldman;
}
- add(rpcsrv);
- _myrpcsrv_map.set(name, rpcsrv);
+ add(rpcsrv.get());
+ _myrpcsrv_map[name] = std::move(rpcsrv);
}
void
-RpcServerMap::addReservation(ReservedName *rpcsrv)
+RpcServerMap::addReservation(std::unique_ptr<ReservedName> rpcsrv)
{
- LOG_ASSERT(rpcsrv != NULL);
- LOG_ASSERT(_myrpcsrv_map.isSet(rpcsrv->getName()) == false);
+ LOG_ASSERT(rpcsrv != nullptr);
+ LOG_ASSERT(_myrpcsrv_map.find(rpcsrv->getName()) == _myrpcsrv_map.end());
// must not be reserved for something else already
// this should have been checked already, so assert
LOG_ASSERT(! conflictingReservation(rpcsrv->getName(), rpcsrv->getSpec()));
- ReservedName *old = _reservations.set(rpcsrv->getName(), rpcsrv);
- LOG_ASSERT(old == NULL
- || strcmp(old->getSpec(), rpcsrv->getSpec()) == 0
+ auto old = std::move(_reservations[rpcsrv->getName()]);
+ LOG_ASSERT(!old
+ || old->getSpec() == rpcsrv->getSpec()
|| ! old->stillReserved());
- delete old;
+ _reservations[rpcsrv->getName()] = std::move(rpcsrv);
}
/** check if there is a (different) registration for this name in progress */
bool
-RpcServerMap::conflictingReservation(const char *name, const char *spec)
+RpcServerMap::conflictingReservation(const std::string &name, const std::string &spec)
{
- ReservedName *resv = _reservations[name];
- return (resv != NULL &&
+ const ReservedName *resv = _reservations[name].get();
+ return (resv != nullptr &&
resv->stillReserved() &&
- strcmp(resv->getSpec(), spec) != 0);
+ resv->getSpec() != spec);
}
+const ReservedName *
+RpcServerMap::getReservation(const std::string &name) const {
+ auto found = _reservations.find(name);
+ return (found == _reservations.end()) ? nullptr : found->second.get();
+}
-RpcServerMap::~RpcServerMap()
+RpcServerMap::RpcServerMap()
+ : _myrpcsrv_map(),
+ _reservations()
{
- // get list of names in rpcsrv_map
- std::vector<const char *> names;
- for (HashMap<ManagedRpcServer *>::Iterator it = _myrpcsrv_map.iterator();
- it.valid(); it.next())
- {
- names.push_back(it.key());
- }
-
- for (uint32_t i = 0; i < names.size(); i++) {
- NamedService *rpcsrv = _myrpcsrv_map.remove(names[i]);
- LOG_ASSERT(rpcsrv != NULL);
- delete rpcsrv;
- }
- LOG_ASSERT(_myrpcsrv_map.size() == 0);
}
+RpcServerMap::~RpcServerMap() = default;
bool
RpcServerMap::match(const char *name, const char *pattern)
{
- LOG_ASSERT(name != NULL);
- LOG_ASSERT(pattern != NULL);
+ LOG_ASSERT(name != nullptr);
+ LOG_ASSERT(pattern != nullptr);
while (*pattern != '\0') {
if (*name == *pattern) {
++name;
@@ -177,10 +170,9 @@ RpcServerMap::match(const char *name, const char *pattern)
}
void
-RpcServerMap::removeReservation(const char *name)
+RpcServerMap::removeReservation(const std::string & name)
{
- delete _reservations.remove(name);
+ _reservations.erase(name);
}
-
} // namespace slobrok
diff --git a/slobrok/src/vespa/slobrok/server/rpc_server_map.h b/slobrok/src/vespa/slobrok/server/rpc_server_map.h
index f25b9989378..2c69c1b8cde 100644
--- a/slobrok/src/vespa/slobrok/server/rpc_server_map.h
+++ b/slobrok/src/vespa/slobrok/server/rpc_server_map.h
@@ -7,7 +7,6 @@ namespace slobrok {
class NamedService;
class ManagedRpcServer;
-class RemoteRpcServer;
class ReservedName;
/**
@@ -19,22 +18,17 @@ class ReservedName;
* three seperate hashmaps.
**/
-using vespalib::HashMap;
-
class RpcServerMap
{
private:
- VisibleMap _visible_map;
-
- HashMap<ManagedRpcServer *> _myrpcsrv_map;
-
- HashMap<ReservedName *> _reservations;
+ using ManagedRpcServerMap = std::unordered_map<std::string, std::unique_ptr<ManagedRpcServer>>;
+ using ReservedNameMap = std::unordered_map<std::string, std::unique_ptr<ReservedName>>;
+ VisibleMap _visible_map;
+ ManagedRpcServerMap _myrpcsrv_map;
+ ReservedNameMap _reservations;
static bool match(const char *name, const char *pattern);
- RpcServerMap(const RpcServerMap &); // Not used
- RpcServerMap &operator=(const RpcServerMap &); // Not use
-
void add(NamedService *rpcsrv);
public:
@@ -42,31 +36,24 @@ public:
VisibleMap& visibleMap() { return _visible_map; }
- ManagedRpcServer *lookupManaged(const char *name) const {
- return _myrpcsrv_map[name];
- }
+ ManagedRpcServer *lookupManaged(const std::string & name) const;
- NamedService * lookup(const char *name) const;
+ const NamedService * lookup(const std::string & name) const;
RpcSrvlist lookupPattern(const char *pattern) const;
- RpcSrvlist allVisible() const;
RpcSrvlist allManaged() const;
- void addNew(ManagedRpcServer *rpcsrv);
- NamedService * remove(const char *name);
+ void addNew(std::unique_ptr<ManagedRpcServer> rpcsrv);
+ std::unique_ptr<NamedService> remove(const std::string & name);
- void addReservation(ReservedName *rpcsrv);
- bool conflictingReservation(const char *name, const char *spec);
+ void addReservation(std::unique_ptr<ReservedName>rpcsrv);
+ bool conflictingReservation(const std::string & name, const std::string &spec);
- ReservedName *getReservation(const char *name) const {
- return _reservations[name];
- }
- void removeReservation(const char *name);
+ const ReservedName *getReservation(const std::string & name) const;
+ void removeReservation(const std::string & name);
- RpcServerMap()
- : _myrpcsrv_map(NULL),
- _reservations(NULL)
- {
- }
+ RpcServerMap(const RpcServerMap &) = delete;
+ RpcServerMap &operator=(const RpcServerMap &) = delete;
+ RpcServerMap();
~RpcServerMap();
};
diff --git a/slobrok/src/vespa/slobrok/server/rpchooks.cpp b/slobrok/src/vespa/slobrok/server/rpchooks.cpp
index 82e30a309a1..460b060cb82 100644
--- a/slobrok/src/vespa/slobrok/server/rpchooks.cpp
+++ b/slobrok/src/vespa/slobrok/server/rpchooks.cpp
@@ -18,8 +18,6 @@ namespace slobrok {
namespace {
-
-
class MetricsReport : public FNET_Task
{
RPCHooks &_owner;
@@ -29,35 +27,29 @@ class MetricsReport : public FNET_Task
Schedule(300.0);
}
public:
- MetricsReport(FRT_Supervisor *orb,
- RPCHooks &owner)
+ MetricsReport(FRT_Supervisor *orb, RPCHooks &owner)
: FNET_Task(orb->GetScheduler()),
_owner(owner)
{
Schedule(0.0);
}
- virtual ~MetricsReport() { Kill(); }
+ ~MetricsReport() override { Kill(); }
};
} // namespace <unnamed>
//-----------------------------------------------------------------------------
-RPCHooks::RPCHooks(SBEnv &env,
- RpcServerMap& rpcsrvmap,
- RpcServerManager& rpcsrvman)
+RPCHooks::RPCHooks(SBEnv &env, RpcServerMap& rpcsrvmap, RpcServerManager& rpcsrvman)
: _env(env), _rpcsrvmap(rpcsrvmap), _rpcsrvmanager(rpcsrvman),
_cnts(Metrics::zero()),
- _m_reporter(nullptr)
+ _m_reporter()
{
}
-RPCHooks::~RPCHooks()
-{
- delete _m_reporter;
-}
+RPCHooks::~RPCHooks() = default;
void
RPCHooks::reportMetrics()
@@ -76,7 +68,7 @@ RPCHooks::reportMetrics()
void
RPCHooks::initRPC(FRT_Supervisor *supervisor)
{
- _m_reporter = new MetricsReport(supervisor, *this);
+ _m_reporter = std::make_unique<MetricsReport>(supervisor, *this);
FRT_ReflectionBuilder rb(supervisor);
@@ -236,7 +228,7 @@ RPCHooks::rpc_listNamesServed(FRT_RPCRequest *req)
{
FRT_Values &dst = *req->GetReturn();
FRT_StringValue *names = dst.AddStringArray(1);
- dst.SetString(names, _env.mySpec());
+ dst.SetString(names, _env.mySpec().c_str());
_cnts.otherReqs++;
return;
}
@@ -422,8 +414,8 @@ RPCHooks::rpc_lookupRpcServer(FRT_RPCRequest *req)
FRT_StringValue *names = dst.AddStringArray(rpcsrvlist.size());
FRT_StringValue *specs = dst.AddStringArray(rpcsrvlist.size());
for (uint32_t i = 0; i < rpcsrvlist.size(); ++i) {
- dst.SetString(&names[i], rpcsrvlist[i]->getName());
- dst.SetString(&specs[i], rpcsrvlist[i]->getSpec());
+ dst.SetString(&names[i], rpcsrvlist[i]->getName().c_str());
+ dst.SetString(&specs[i], rpcsrvlist[i]->getSpec().c_str());
}
if (rpcsrvlist.size() < 1) {
LOG(debug, "RPC: lookupRpcServers(%s) -> no match",
@@ -431,7 +423,7 @@ RPCHooks::rpc_lookupRpcServer(FRT_RPCRequest *req)
} else {
LOG(debug, "RPC: lookupRpcServers(%s) -> %u matches, first [%s,%s]",
rpcserverPattern, (unsigned int)rpcsrvlist.size(),
- rpcsrvlist[0]->getName(), rpcsrvlist[0]->getSpec());
+ rpcsrvlist[0]->getName().c_str(), rpcsrvlist[0]->getSpec().c_str());
}
return;
}
@@ -446,15 +438,15 @@ RPCHooks::rpc_listManagedRpcServers(FRT_RPCRequest *req)
FRT_StringValue *names = dst.AddStringArray(rpcsrvlist.size());
FRT_StringValue *specs = dst.AddStringArray(rpcsrvlist.size());
for (uint32_t i = 0; i < rpcsrvlist.size(); ++i) {
- dst.SetString(&names[i], rpcsrvlist[i]->getName());
- dst.SetString(&specs[i], rpcsrvlist[i]->getSpec());
+ dst.SetString(&names[i], rpcsrvlist[i]->getName().c_str());
+ dst.SetString(&specs[i], rpcsrvlist[i]->getSpec().c_str());
}
if (rpcsrvlist.size() < 1) {
LOG(debug, "RPC: listManagedRpcServers() -> 0 managed");
} else {
LOG(debug, "RPC: listManagedRpcServers() -> %u managed, first [%s,%s]",
(unsigned int)rpcsrvlist.size(),
- rpcsrvlist[0]->getName(), rpcsrvlist[0]->getSpec());
+ rpcsrvlist[0]->getName().c_str(), rpcsrvlist[0]->getSpec().c_str());
}
return;
}
@@ -466,14 +458,14 @@ RPCHooks::rpc_lookupManaged(FRT_RPCRequest *req)
FRT_Values &args = *req->GetParams();
const char *name = args[0]._string._str;
LOG(debug, "RPC: lookupManaged(%s)", name);
- ManagedRpcServer *found = _rpcsrvmap.lookupManaged(name);
+ const ManagedRpcServer *found = _rpcsrvmap.lookupManaged(name);
if (found == nullptr) {
req->SetError(FRTE_RPC_METHOD_FAILED, "Not found");
} else {
FRT_Values &dst = *req->GetReturn();
- dst.AddString(found->getName());
- dst.AddString(found->getSpec());
+ dst.AddString(found->getName().c_str());
+ dst.AddString(found->getSpec().c_str());
}
return;
}
@@ -493,9 +485,9 @@ RPCHooks::rpc_listAllRpcServers(FRT_RPCRequest *req)
int j = 0;
for (uint32_t i = 0; i < mrpcsrvlist.size(); ++i, ++j) {
- dst.SetString(&names[j], mrpcsrvlist[i]->getName());
- dst.SetString(&specs[j], mrpcsrvlist[i]->getSpec());
- dst.SetString(&owner[j], _env.mySpec());
+ dst.SetString(&names[j], mrpcsrvlist[i]->getName().c_str());
+ dst.SetString(&specs[j], mrpcsrvlist[i]->getSpec().c_str());
+ dst.SetString(&owner[j], _env.mySpec().c_str());
}
if (sz > 0) {
diff --git a/slobrok/src/vespa/slobrok/server/rpchooks.h b/slobrok/src/vespa/slobrok/server/rpchooks.h
index 1c1d6ebf411..2f7e55d8fce 100644
--- a/slobrok/src/vespa/slobrok/server/rpchooks.h
+++ b/slobrok/src/vespa/slobrok/server/rpchooks.h
@@ -2,6 +2,7 @@
#pragma once
#include <vespa/fnet/frt/invokable.h>
+#include <memory>
class FNET_Task;
class FRT_Supervisor;
@@ -41,17 +42,12 @@ private:
RpcServerMap &_rpcsrvmap;
RpcServerManager &_rpcsrvmanager;
- RPCHooks(const RPCHooks &); // Not used
- RPCHooks &operator=(const RPCHooks &); // Not used
-
Metrics _cnts;
- FNET_Task *_m_reporter;
+ std::unique_ptr<FNET_Task> _m_reporter;
public:
- explicit RPCHooks(SBEnv &env,
- RpcServerMap& rpcsrvmap,
- RpcServerManager& rpcsrvman);
- virtual ~RPCHooks();
+ RPCHooks(SBEnv &env, RpcServerMap& rpcsrvmap, RpcServerManager& rpcsrvman);
+ ~RPCHooks() override;
void initRPC(FRT_Supervisor *supervisor);
void reportMetrics();
diff --git a/slobrok/src/vespa/slobrok/server/rpcmirror.cpp b/slobrok/src/vespa/slobrok/server/rpcmirror.cpp
index af5139f043c..46d7f70288b 100644
--- a/slobrok/src/vespa/slobrok/server/rpcmirror.cpp
+++ b/slobrok/src/vespa/slobrok/server/rpcmirror.cpp
@@ -38,8 +38,8 @@ MirrorFetch::completeReq()
FRT_StringValue *names = dst.AddStringArray(sz);
FRT_StringValue *specs = dst.AddStringArray(sz);
for (uint32_t i = 0; i < rpcsrvlist.size(); ++i) {
- dst.SetString(&names[i], rpcsrvlist[i]->getName());
- dst.SetString(&specs[i], rpcsrvlist[i]->getSpec());
+ dst.SetString(&names[i], rpcsrvlist[i]->getName().c_str());
+ dst.SetString(&specs[i], rpcsrvlist[i]->getSpec().c_str());
}
if (sz > 0) {
LOG(debug, "mirrorFetch %p -> %u, last [%s,%s]",
@@ -145,8 +145,8 @@ IncrementalFetch::completeReq()
FRT_StringValue *names = dst.AddStringArray(sz);
FRT_StringValue *specs = dst.AddStringArray(sz);
for (uint32_t i = 0; i < sz; ++i) {
- dst.SetString(&names[i], diff.updated[i]->getName());
- dst.SetString(&specs[i], diff.updated[i]->getSpec());
+ dst.SetString(&names[i], diff.updated[i]->getName().c_str());
+ dst.SetString(&specs[i], diff.updated[i]->getSpec().c_str());
}
dst.AddInt32(newgen.getAsInt());
diff --git a/slobrok/src/vespa/slobrok/server/sbenv.cpp b/slobrok/src/vespa/slobrok/server/sbenv.cpp
index 35af0daf24a..163113de7b9 100644
--- a/slobrok/src/vespa/slobrok/server/sbenv.cpp
+++ b/slobrok/src/vespa/slobrok/server/sbenv.cpp
@@ -212,20 +212,18 @@ SBEnv::setup(const std::vector<std::string> &cfg)
std::string slobrok = cfg[i];
discard(oldList, slobrok);
if (slobrok != mySpec()) {
- OkState res = _rpcsrvmanager.addPeer(slobrok.c_str(), slobrok.c_str());
+ OkState res = _rpcsrvmanager.addPeer(slobrok, slobrok.c_str());
if (!res.ok()) {
- LOG(warning, "could not add peer %s: %s", slobrok.c_str(),
- res.errorMsg.c_str());
+ LOG(warning, "could not add peer %s: %s", slobrok.c_str(), res.errorMsg.c_str());
} else {
LOG(config, "added peer %s", slobrok.c_str());
}
}
}
for (uint32_t i = 0; i < oldList.size(); ++i) {
- OkState res = _rpcsrvmanager.removePeer(oldList[i].c_str(), oldList[i].c_str());
+ OkState res = _rpcsrvmanager.removePeer(oldList[i], oldList[i].c_str());
if (!res.ok()) {
- LOG(warning, "could not remove peer %s: %s", oldList[i].c_str(),
- res.errorMsg.c_str());
+ LOG(warning, "could not remove peer %s: %s", oldList[i].c_str(), res.errorMsg.c_str());
} else {
LOG(config, "removed peer %s", oldList[i].c_str());
}
@@ -252,7 +250,7 @@ SBEnv::addPeer(const std::string &name, const std::string &spec)
spec.c_str(), peers.c_str());
return OkState(FRTE_RPC_METHOD_FAILED, "configured partner list does not contain peer. configured peers = " + peers);
}
- return _rpcsrvmanager.addPeer(name.c_str(), spec.c_str());
+ return _rpcsrvmanager.addPeer(name, spec.c_str());
}
OkState
@@ -266,7 +264,7 @@ SBEnv::removePeer(const std::string &name, const std::string &spec)
return OkState(FRTE_RPC_METHOD_FAILED, "configured partner list contains peer, cannot remove");
}
}
- return _rpcsrvmanager.removePeer(name.c_str(), spec.c_str());
+ return _rpcsrvmanager.removePeer(name, spec.c_str());
}
} // namespace slobrok
diff --git a/slobrok/src/vespa/slobrok/server/sbenv.h b/slobrok/src/vespa/slobrok/server/sbenv.h
index 8c897c9c999..223a8b7e9ee 100644
--- a/slobrok/src/vespa/slobrok/server/sbenv.h
+++ b/slobrok/src/vespa/slobrok/server/sbenv.h
@@ -73,7 +73,7 @@ public:
ExchangeManager _exchanger;
RpcServerMap _rpcsrvmap;
- const char *mySpec() const { return _me->getSpec(); }
+ const std::string & mySpec() const { return _me->getSpec(); }
bool isSuspended() const { return false; }
bool isShuttingDown() const { return _shuttingDown; }
diff --git a/slobrok/src/vespa/slobrok/server/selfcheck.cpp b/slobrok/src/vespa/slobrok/server/selfcheck.cpp
index 7d1ca23957a..7fc639ec028 100644
--- a/slobrok/src/vespa/slobrok/server/selfcheck.cpp
+++ b/slobrok/src/vespa/slobrok/server/selfcheck.cpp
@@ -42,7 +42,7 @@ SelfCheck::PerformTask()
const NamedService *r = mrpcsrvlist[i];
ManagedRpcServer *m = _rpcsrvmap.lookupManaged(r->getName());
LOG_ASSERT(r == m);
- LOG(debug, "managed: %s -> %s", m->getName(), m->getSpec());
+ LOG(debug, "managed: %s -> %s", m->getName().c_str(), m->getSpec().c_str());
m->healthCheck();
}
// reschedule in 1-2 seconds:
@@ -51,5 +51,4 @@ SelfCheck::PerformTask()
Schedule(seconds);
}
-
} // namespace slobrok
diff --git a/slobrok/src/vespa/slobrok/server/visible_map.cpp b/slobrok/src/vespa/slobrok/server/visible_map.cpp
index d4487fd0884..d26bb49d874 100644
--- a/slobrok/src/vespa/slobrok/server/visible_map.cpp
+++ b/slobrok/src/vespa/slobrok/server/visible_map.cpp
@@ -13,23 +13,21 @@ VisibleMap::updated()
_genCnt.add();
WaitList waitList;
std::swap(waitList, _waitList);
- for (uint32_t i = 0; i < waitList.size(); ++i) {
- waitList[i]->updated(*this);
+ for (auto & entry : waitList) {
+ entry->updated(*this);
}
}
-
void
VisibleMap::aborted()
{
WaitList waitList;
std::swap(waitList, _waitList);
- for (uint32_t i = 0; i < waitList.size(); ++i) {
- waitList[i]->aborted(*this);
+ for (auto & entry : waitList) {
+ entry->aborted(*this);
}
}
-
void
VisibleMap::addUpdateListener(IUpdateListener *l)
{
@@ -56,28 +54,19 @@ VisibleMap::removeUpdateListener(IUpdateListener *l)
//-----------------------------------------------------------------------------
-std::vector<const NamedService *>
-VisibleMap::lookupPattern(const char *pattern) const
-{
- std::vector<const NamedService *> retval;
- for (iter_t it = _map.iterator(); it.valid(); it.next())
- {
- if (match(it.key(), pattern)) {
- retval.push_back(it.value());
- }
- }
- return retval;
+const NamedService *
+VisibleMap::lookup(const std::string &name) const {
+ auto found = _map.find(name);
+ return (found == _map.end()) ? nullptr : found->second;
}
-
std::vector<const NamedService *>
VisibleMap::allVisible() const
{
std::vector<const NamedService *> retval;
// get list of all names in myrpcsrvmap
- for (iter_t it = _map.iterator(); it.valid(); it.next())
- {
- retval.push_back(it.value());
+ for (const auto & entry : _map) {
+ retval.push_back(entry.second);
}
return retval;
}
@@ -85,22 +74,23 @@ VisibleMap::allVisible() const
void
-VisibleMap::addNew(NamedService *rpcsrv)
+VisibleMap::addNew(const NamedService *rpcsrv)
{
- LOG_ASSERT(rpcsrv != NULL);
- LOG_ASSERT(_map.isSet(rpcsrv->getName()) == false);
- _map.set(rpcsrv->getName(), rpcsrv);
+ LOG_ASSERT(rpcsrv != nullptr);
+ LOG_ASSERT(_map.find(rpcsrv->getName()) == _map.end());
+ _map[rpcsrv->getName()] = rpcsrv;
_history.add(rpcsrv->getName(), _genCnt);
updated();
}
-NamedService *
-VisibleMap::remove(const char *name) {
+const NamedService *
+VisibleMap::remove(const std::string &name) {
- NamedService *d = _map.remove(name);
- if (d != NULL) {
+ const NamedService *d = _map[name];
+ _map.erase(name);
+ if (d != nullptr) {
_history.add(name, _genCnt);
updated();
}
@@ -108,14 +98,13 @@ VisibleMap::remove(const char *name) {
}
-NamedService *
-VisibleMap::update(NamedService *rpcsrv) {
- LOG_ASSERT(rpcsrv != NULL);
-
- NamedService *d = _map.remove(rpcsrv->getName());
- LOG_ASSERT(d != NULL);
+const NamedService *
+VisibleMap::update(const NamedService *rpcsrv) {
+ LOG_ASSERT(rpcsrv != nullptr);
- _map.set(rpcsrv->getName(), rpcsrv);
+ const NamedService *d = rpcsrv;
+ std::swap(d, _map[rpcsrv->getName()]);
+ LOG_ASSERT(d != nullptr);
_history.add(rpcsrv->getName(), _genCnt);
updated();
@@ -128,13 +117,11 @@ VisibleMap::history(const vespalib::GenCnt& gen) const
{
MapDiff retval;
std::set<std::string> names = _history.since(gen);
- for (std::set<std::string>::iterator it = names.begin();
- it != names.end();
- ++it)
+ for (const auto & name : names)
{
- const NamedService *val = lookup(it->c_str());
- if (val == NULL) {
- retval.removed.push_back(*it);
+ const NamedService *val = lookup(name.c_str());
+ if (val == nullptr) {
+ retval.removed.push_back(name);
} else {
retval.updated.push_back(val);
}
@@ -142,11 +129,11 @@ VisibleMap::history(const vespalib::GenCnt& gen) const
return retval;
}
-VisibleMap::MapDiff::MapDiff() {}
-VisibleMap::MapDiff::~MapDiff() {}
+VisibleMap::MapDiff::MapDiff() = default;
+VisibleMap::MapDiff::~MapDiff() = default;
VisibleMap::VisibleMap()
- : _map(NULL),
+ : _map(),
_waitList(),
_genCnt(1)
{
@@ -160,8 +147,8 @@ VisibleMap::~VisibleMap()
bool
VisibleMap::match(const char *name, const char *pattern)
{
- LOG_ASSERT(name != NULL);
- LOG_ASSERT(pattern != NULL);
+ LOG_ASSERT(name != nullptr);
+ LOG_ASSERT(pattern != nullptr);
while (*pattern != '\0') {
if (*name == *pattern) {
++name;
diff --git a/slobrok/src/vespa/slobrok/server/visible_map.h b/slobrok/src/vespa/slobrok/server/visible_map.h
index 9ad6c13872e..6ea2d5e2a46 100644
--- a/slobrok/src/vespa/slobrok/server/visible_map.h
+++ b/slobrok/src/vespa/slobrok/server/visible_map.h
@@ -3,7 +3,9 @@
#include "history.h"
#include "named_service.h"
-#include <vespa/vespalib/util/hashmap.h>
+#include <unordered_map>
+#include <string>
+#include <memory>
namespace slobrok {
@@ -13,9 +15,6 @@ namespace slobrok {
* name->spec mappings visible to the world
**/
-using vespalib::HashMap;
-
-
class VisibleMap
{
public:
@@ -46,19 +45,16 @@ public:
};
private:
- HashMap<NamedService *> _map;
- typedef HashMap<NamedService *>::Iterator iter_t;
+ using Map = std::unordered_map<std::string, const NamedService *>;
+ using WaitList = std::vector<IUpdateListener *>;
- typedef std::vector<IUpdateListener *> WaitList;
+ Map _map;
WaitList _waitList;
vespalib::GenCnt _genCnt;
History _history;
static bool match(const char *name, const char *pattern);
- VisibleMap(const VisibleMap &); // Not used
- VisibleMap &operator=(const VisibleMap &); // Not use
-
void updated();
void aborted();
@@ -66,12 +62,11 @@ public:
void addUpdateListener(IUpdateListener *l);
void removeUpdateListener(IUpdateListener *l);
- void addNew(NamedService *rpcsrv);
- NamedService *remove(const char *name);
- NamedService *update(NamedService *rpcsrv);
+ void addNew(const NamedService *rpcsrv);
+ const NamedService *remove(const std::string &name);
+ const NamedService *update(const NamedService *rpcsrv);
- NamedService *lookup(const char *name) const { return _map[name]; }
- RpcSrvlist lookupPattern(const char *pattern) const;
+ const NamedService *lookup(const std::string &name) const;
RpcSrvlist allVisible() const;
const vespalib::GenCnt& genCnt() { return _genCnt; }
@@ -80,6 +75,8 @@ public:
MapDiff history(const vespalib::GenCnt& gen) const;
+ VisibleMap(const VisibleMap &) = delete;
+ VisibleMap &operator=(const VisibleMap &) = delete;
VisibleMap();
~VisibleMap();
};