summaryrefslogtreecommitdiffstats
path: root/slobrok
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2021-06-23 10:41:30 +0000
committerArne Juul <arnej@verizonmedia.com>2021-06-23 10:41:30 +0000
commit31c9d28b02ca301839915d977c0027b7dd185865 (patch)
treee56b8f23678a391811685fc3f284bf403647caf9 /slobrok
parentf373071a994860a3b9cbb0d494bf0bd6dd917c1e (diff)
make each ManagedRpcServer its own Task
Diffstat (limited to 'slobrok')
-rw-r--r--slobrok/src/vespa/slobrok/server/managed_rpc_server.cpp17
-rw-r--r--slobrok/src/vespa/slobrok/server/managed_rpc_server.h2
-rw-r--r--slobrok/src/vespa/slobrok/server/selfcheck.cpp19
-rw-r--r--slobrok/src/vespa/slobrok/server/selfcheck.h2
4 files changed, 23 insertions, 17 deletions
diff --git a/slobrok/src/vespa/slobrok/server/managed_rpc_server.cpp b/slobrok/src/vespa/slobrok/server/managed_rpc_server.cpp
index 065dac04304..3220a9e5d69 100644
--- a/slobrok/src/vespa/slobrok/server/managed_rpc_server.cpp
+++ b/slobrok/src/vespa/slobrok/server/managed_rpc_server.cpp
@@ -2,6 +2,7 @@
#include "managed_rpc_server.h"
#include "i_rpc_server_manager.h"
+#include "random.h"
#include <vespa/fnet/frt/supervisor.h>
#include <vespa/fnet/frt/target.h>
@@ -16,17 +17,18 @@ ManagedRpcServer::ManagedRpcServer(const std::string & name,
const std::string & spec,
IRpcServerManager &manager)
: NamedService(name, spec),
+ FNET_Task(manager.getSupervisor()->GetScheduler()),
_mmanager(manager),
_monitor(*this, *manager.getSupervisor()),
_monitoredServer(nullptr),
_checkServerReq(nullptr)
{
+ double seconds = randomIn(0.2, 0.8);
+ LOG(debug, "first healthcheck for %s in %g seconds", name.c_str(), seconds);
+ Schedule(seconds);
}
-
-void
-ManagedRpcServer::healthCheck()
-{
+void ManagedRpcServer::PerformTask() {
if (_monitoredServer == nullptr) {
_monitoredServer = _mmanager.getSupervisor()->GetTarget(_spec.c_str());
}
@@ -35,12 +37,19 @@ ManagedRpcServer::healthCheck()
_checkServerReq->SetMethodName("slobrok.callback.listNamesServed");
_monitoredServer->InvokeAsync(_checkServerReq, 25.0, this);
}
+ double seconds = randomIn(2.5, 2.9);
+ LOG(debug, "next healthcheck for %s in %g seconds", getName().c_str(), seconds);
+ Schedule(seconds);
}
+void ManagedRpcServer::healthCheck() {
+ ScheduleNow();
+}
ManagedRpcServer::~ManagedRpcServer()
{
LOG(debug, "(role[%s].~ManagedRpcServer)", _name.c_str());
+ Kill();
cleanupMonitor();
}
diff --git a/slobrok/src/vespa/slobrok/server/managed_rpc_server.h b/slobrok/src/vespa/slobrok/server/managed_rpc_server.h
index 072aebd7850..13bf2ba8686 100644
--- a/slobrok/src/vespa/slobrok/server/managed_rpc_server.h
+++ b/slobrok/src/vespa/slobrok/server/managed_rpc_server.h
@@ -23,6 +23,7 @@ class IRpcServerManager;
class ManagedRpcServer: public NamedService,
public FRT_IRequestWait,
+ public FNET_Task,
public IMonitoredServer
{
public:
@@ -32,6 +33,7 @@ public:
~ManagedRpcServer();
void healthCheck();
+ void PerformTask() override;
private:
IRpcServerManager &_mmanager;
diff --git a/slobrok/src/vespa/slobrok/server/selfcheck.cpp b/slobrok/src/vespa/slobrok/server/selfcheck.cpp
index 075db42e0d6..a9fab650772 100644
--- a/slobrok/src/vespa/slobrok/server/selfcheck.cpp
+++ b/slobrok/src/vespa/slobrok/server/selfcheck.cpp
@@ -18,8 +18,7 @@ SelfCheck::SelfCheck(FNET_Scheduler *sched,
RpcServerMap& rpcsrvmap,
RpcServerManager& rpcsrvman)
: FNET_Task(sched),
- _rpcsrvmap(rpcsrvmap), _rpcsrvmanager(rpcsrvman),
- _checkIndex(0)
+ _rpcsrvmap(rpcsrvmap), _rpcsrvmanager(rpcsrvman)
{
// start within 1 second
double seconds = randomIn(0.123, 1.000);
@@ -38,18 +37,16 @@ void
SelfCheck::PerformTask()
{
std::vector<const NamedService *> mrpcsrvlist = _rpcsrvmap.allManaged();
- if (_checkIndex < mrpcsrvlist.size()) {
- const NamedService *r = mrpcsrvlist[_checkIndex++];
+
+ for (size_t i = 0; i < mrpcsrvlist.size(); ++i) {
+ const NamedService *r = mrpcsrvlist[i];
ManagedRpcServer *m = _rpcsrvmap.lookupManaged(r->getName());
- LOG(debug, "managed: %s -> %s", m->getName().c_str(), m->getSpec().c_str());
LOG_ASSERT(r == m);
- m->healthCheck();
- } else {
- _checkIndex = 0;
+ LOG(debug, "managed: %s -> %s", m->getName().c_str(), m->getSpec().c_str());
}
- // reschedule more often with more services, on average 1s per loop:
- double seconds = randomIn(0.5, 1.5) / (1 + mrpcsrvlist.size());
- LOG(debug, "next selfcheck in %g seconds", seconds);
+ // reschedule in 1-2 seconds:
+ double seconds = randomIn(0.987, 2.000);
+ LOG(debug, "selfcheck AGAIN in %g seconds", seconds);
Schedule(seconds);
}
diff --git a/slobrok/src/vespa/slobrok/server/selfcheck.h b/slobrok/src/vespa/slobrok/server/selfcheck.h
index 9bb96808666..52eced4700b 100644
--- a/slobrok/src/vespa/slobrok/server/selfcheck.h
+++ b/slobrok/src/vespa/slobrok/server/selfcheck.h
@@ -2,7 +2,6 @@
#pragma once
#include <vespa/fnet/task.h>
-#include <vector>
namespace slobrok {
@@ -23,7 +22,6 @@ class SelfCheck : public FNET_Task
private:
RpcServerMap &_rpcsrvmap;
RpcServerManager &_rpcsrvmanager;
- size_t _checkIndex;
SelfCheck(const SelfCheck &); // Not used
SelfCheck &operator=(const SelfCheck &); // Not used