aboutsummaryrefslogtreecommitdiffstats
path: root/slobrok
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2021-08-16 21:02:26 +0000
committerArne Juul <arnej@verizonmedia.com>2021-08-24 08:44:18 +0000
commit7b3454d806907f2af120bc568a99a667e8c1dcdc (patch)
tree3d8b49ac8ccdf33c7f9b69030592affa92344570 /slobrok
parent6413b2676ee9b274952c537e286096bfe88e870d (diff)
serve RPC calls from global history
* instead of wiring directly to the RpcServerMap, use global history as source of data for more RPC calls. * most of these are only used for unit tests / debugging * this makes it easy to switch underlying implementation later
Diffstat (limited to 'slobrok')
-rw-r--r--slobrok/src/vespa/slobrok/server/rpchooks.cpp109
1 files changed, 54 insertions, 55 deletions
diff --git a/slobrok/src/vespa/slobrok/server/rpchooks.cpp b/slobrok/src/vespa/slobrok/server/rpchooks.cpp
index 062ec148bfb..4ed173deaa1 100644
--- a/slobrok/src/vespa/slobrok/server/rpchooks.cpp
+++ b/slobrok/src/vespa/slobrok/server/rpchooks.cpp
@@ -394,22 +394,34 @@ RPCHooks::rpc_lookupRpcServer(FRT_RPCRequest *req)
FRT_Values &args = *req->GetParams();
const char *rpcserverPattern = args[0]._string._str;
LOG(debug, "RPC: lookupRpcServers(%s)", rpcserverPattern);
- std::vector<const NamedService *> rpcsrvlist =
- _rpcsrvmap.lookupPattern(rpcserverPattern);
+ // fetch data:
+ const auto & visible = _env.globalHistory();
+ auto diff = visible.makeDiffFrom(0);
+ std::vector<ServiceMapping> matches;
+ for (const auto & entry : diff.updated) {
+ if (RpcServerMap::match(entry.name.c_str(), rpcserverPattern)) {
+ matches.push_back(entry);
+ }
+ }
+ // fill return values:
FRT_Values &dst = *req->GetReturn();
- 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().c_str());
- dst.SetString(&specs[i], rpcsrvlist[i]->getSpec().c_str());
+ size_t sz = matches.size();
+ FRT_StringValue *names = dst.AddStringArray(sz);
+ FRT_StringValue *specs = dst.AddStringArray(sz);
+ size_t j = 0;
+ for (const auto & entry : matches) {
+ dst.SetString(&names[j], entry.name.c_str());
+ dst.SetString(&specs[j], entry.spec.c_str());
+ ++j;
}
- if (rpcsrvlist.size() < 1) {
+ // debug logging:
+ if (sz < 1) {
LOG(debug, "RPC: lookupRpcServers(%s) -> no match",
rpcserverPattern);
} else {
- LOG(debug, "RPC: lookupRpcServers(%s) -> %u matches, first [%s,%s]",
- rpcserverPattern, (unsigned int)rpcsrvlist.size(),
- rpcsrvlist[0]->getName().c_str(), rpcsrvlist[0]->getSpec().c_str());
+ LOG(debug, "RPC: lookupRpcServers(%s) -> %zu matches, first [%s,%s]",
+ rpcserverPattern, sz,
+ matches[0].name.c_str(), matches[0].spec.c_str());
}
return;
}
@@ -419,21 +431,20 @@ void
RPCHooks::rpc_listManagedRpcServers(FRT_RPCRequest *req)
{
_cnts.adminReqs++;
- std::vector<const NamedService *> rpcsrvlist = _rpcsrvmap.allManaged();
+ // TODO: use local history here
+ const auto & visible = _env.globalHistory();
+ auto diff = visible.makeDiffFrom(0);
+ size_t sz = diff.updated.size();
FRT_Values &dst = *req->GetReturn();
- 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().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().c_str(), rpcsrvlist[0]->getSpec().c_str());
+ FRT_StringValue *names = dst.AddStringArray(sz);
+ FRT_StringValue *specs = dst.AddStringArray(sz);
+ size_t j = 0;
+ for (const auto & entry : diff.updated) {
+ dst.SetString(&names[j], entry.name.c_str());
+ dst.SetString(&specs[j], entry.spec.c_str());
+ ++j;
}
+ LOG(debug, "listManagedRpcServers -> %zu entries returned", sz);
return;
}
@@ -444,15 +455,17 @@ RPCHooks::rpc_lookupManaged(FRT_RPCRequest *req)
FRT_Values &args = *req->GetParams();
const char *name = args[0]._string._str;
LOG(debug, "RPC: lookupManaged(%s)", 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().c_str());
- dst.AddString(found->getSpec().c_str());
+ const auto & visible = _env.globalHistory();
+ auto diff = visible.makeDiffFrom(0);
+ for (const auto & entry : diff.updated) {
+ if (entry.name == name) {
+ FRT_Values &dst = *req->GetReturn();
+ dst.AddString(entry.name.c_str());
+ dst.AddString(entry.spec.c_str());
+ return;
+ }
}
+ req->SetError(FRTE_RPC_METHOD_FAILED, "Not found");
return;
}
@@ -460,33 +473,22 @@ void
RPCHooks::rpc_listAllRpcServers(FRT_RPCRequest *req)
{
_cnts.adminReqs++;
-
- std::vector<const NamedService *> mrpcsrvlist = _rpcsrvmap.allManaged();
-
+ const auto & visible = _env.globalHistory();
+ auto diff = visible.makeDiffFrom(0);
+ size_t sz = diff.updated.size();
FRT_Values &dst = *req->GetReturn();
- size_t sz = mrpcsrvlist.size();
FRT_StringValue *names = dst.AddStringArray(sz);
FRT_StringValue *specs = dst.AddStringArray(sz);
FRT_StringValue *owner = dst.AddStringArray(sz);
-
- int j = 0;
- for (uint32_t i = 0; i < mrpcsrvlist.size(); ++i, ++j) {
- dst.SetString(&names[j], mrpcsrvlist[i]->getName().c_str());
- dst.SetString(&specs[j], mrpcsrvlist[i]->getSpec().c_str());
+ size_t j = 0;
+ for (const auto & entry : diff.updated) {
+ dst.SetString(&names[j], entry.name.c_str());
+ dst.SetString(&specs[j], entry.spec.c_str());
dst.SetString(&owner[j], _env.mySpec().c_str());
+ ++j;
}
-
- if (sz > 0) {
- LOG(debug, "listManagedRpcServers -> %u, last [%s,%s,%s]",
- (unsigned int)mrpcsrvlist.size(),
- dst[0]._string_array._pt[sz-1]._str,
- dst[1]._string_array._pt[sz-1]._str,
- dst[2]._string_array._pt[sz-1]._str);
- } else {
- LOG(debug, "listManagedRpcServers -> %u", (unsigned int) mrpcsrvlist.size());
- }
+ LOG(debug, "listAllRpcServers -> %zu entries returned", sz);
return;
-
}
@@ -495,10 +497,8 @@ RPCHooks::rpc_incrementalFetch(FRT_RPCRequest *req)
{
_cnts.mirrorReqs++;
FRT_Values &args = *req->GetParams();
-
vespalib::GenCnt gencnt(args[0]._intval32);
uint32_t msTimeout = args[1]._intval32;
-
req->getStash().create<IncrementalFetch>(_env.getSupervisor(), req,
_globalHistory, gencnt).invoke(msTimeout);
}
@@ -577,7 +577,6 @@ RPCHooks::rpc_version(FRT_RPCRequest *req)
}
}
LOG(debug, "RPC version: %s", ver.c_str());
-
req->GetReturn()->AddString(ver.c_str());
return;
}