aboutsummaryrefslogtreecommitdiffstats
path: root/configd
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2021-06-11 14:34:51 +0000
committerArne Juul <arnej@verizonmedia.com>2021-06-11 14:42:11 +0000
commitdb8530327e2b5348239925013366665c012381d9 (patch)
tree4c333a3dbaca54f15d9d00119b26c2d89e4f1c13 /configd
parente667cf6c86959fccce07091d97950f43f418b5c9 (diff)
cleanup and add lock
Diffstat (limited to 'configd')
-rw-r--r--configd/src/apps/sentinel/config-owner.h1
-rw-r--r--configd/src/apps/sentinel/connectivity.cpp2
-rw-r--r--configd/src/apps/sentinel/env.cpp3
-rw-r--r--configd/src/apps/sentinel/manager.cpp1
-rw-r--r--configd/src/apps/sentinel/model-owner.cpp19
-rw-r--r--configd/src/apps/sentinel/model-owner.h6
-rw-r--r--configd/src/apps/sentinel/report-connectivity.cpp3
-rw-r--r--configd/src/apps/sentinel/report-connectivity.h1
8 files changed, 20 insertions, 16 deletions
diff --git a/configd/src/apps/sentinel/config-owner.h b/configd/src/apps/sentinel/config-owner.h
index 628f868a513..b72aed59271 100644
--- a/configd/src/apps/sentinel/config-owner.h
+++ b/configd/src/apps/sentinel/config-owner.h
@@ -5,7 +5,6 @@
#include <vespa/config-sentinel.h>
#include <vespa/config-model.h>
#include <vespa/config/config.h>
-#include <optional>
using cloud::config::SentinelConfig;
diff --git a/configd/src/apps/sentinel/connectivity.cpp b/configd/src/apps/sentinel/connectivity.cpp
index 7ea548ea73d..8314a090616 100644
--- a/configd/src/apps/sentinel/connectivity.cpp
+++ b/configd/src/apps/sentinel/connectivity.cpp
@@ -17,8 +17,6 @@ using namespace std::chrono_literals;
namespace config::sentinel {
-constexpr std::chrono::milliseconds MODEL_TIMEOUT_MS = 60s;
-
Connectivity::Connectivity() = default;
Connectivity::~Connectivity() = default;
diff --git a/configd/src/apps/sentinel/env.cpp b/configd/src/apps/sentinel/env.cpp
index 3fd9849023d..10f1b683cb5 100644
--- a/configd/src/apps/sentinel/env.cpp
+++ b/configd/src/apps/sentinel/env.cpp
@@ -53,7 +53,7 @@ Env::~Env() = default;
void Env::boot(const std::string &configId) {
LOG(debug, "Reading configuration for ID: %s", configId.c_str());
_cfgOwner.subscribe(configId, CONFIG_TIMEOUT_MS);
- _modelOwner.start(CONFIG_TIMEOUT_MS);
+ _modelOwner.start(CONFIG_TIMEOUT_MS, true);
// subscribe() should throw if something is not OK
Connectivity checker;
for (int retry = 0; retry < maxConnectivityRetries; ++retry) {
@@ -121,7 +121,6 @@ void Env::statePort(int port) {
void Env::notifyConfigUpdated() {
vespalib::ComponentConfigProducer::Config current("sentinel", _cfgOwner.getGeneration(), "ok");
_stateApi.myComponents.addConfig(current);
- _modelOwner.checkForUpdates();
}
void Env::respondAsEmpty() {
diff --git a/configd/src/apps/sentinel/manager.cpp b/configd/src/apps/sentinel/manager.cpp
index 6e0ed78211c..0c13292d704 100644
--- a/configd/src/apps/sentinel/manager.cpp
+++ b/configd/src/apps/sentinel/manager.cpp
@@ -116,6 +116,7 @@ Manager::doWork()
if (_env.configOwner().checkForConfigUpdate()) {
doConfigure();
}
+ _env.modelOwner().checkForUpdates();
handleRestarts();
handleCommands();
handleOutputs();
diff --git a/configd/src/apps/sentinel/model-owner.cpp b/configd/src/apps/sentinel/model-owner.cpp
index 601a57e16c9..cfa9f1f6bf5 100644
--- a/configd/src/apps/sentinel/model-owner.cpp
+++ b/configd/src/apps/sentinel/model-owner.cpp
@@ -14,7 +14,7 @@ using namespace std::chrono_literals;
namespace config::sentinel {
std::optional<ModelConfig> ModelOwner::getModelConfig() {
- checkForUpdates();
+ std::lock_guard<std::mutex> guard(_lock);
if (_modelConfig) {
return ModelConfig(*_modelConfig);
} else {
@@ -30,27 +30,34 @@ ModelOwner::ModelOwner(const std::string &configId)
ModelOwner::~ModelOwner() = default;
void
-ModelOwner::start(std::chrono::milliseconds timeout) {
+ModelOwner::start(std::chrono::milliseconds timeout, bool firstTime) {
try {
_modelHandle =_subscriber.subscribe<ModelConfig>(_configId, timeout);
} catch (ConfigTimeoutException & ex) {
- LOG(warning, "Timeout getting model config: %s [skipping connectivity checks]", ex.getMessage().c_str());
+ if (firstTime) {
+ LOG(warning, "Timeout getting model config: %s [skipping connectivity checks]", ex.message());
+ }
} catch (InvalidConfigException& ex) {
- LOG(warning, "Invalid model config: %s [skipping connectivity checks]", ex.getMessage().c_str());
+ if (firstTime) {
+ LOG(warning, "Invalid model config: %s [skipping connectivity checks]", ex.message());
+ }
} catch (ConfigRuntimeException& ex) {
- LOG(warning, "Runtime exception getting model config: %s [skipping connectivity checks]", ex.getMessage().c_str());
+ if (firstTime) {
+ LOG(warning, "Runtime exception getting model config: %s [skipping connectivity checks]", ex.message());
+ }
}
}
void
ModelOwner::checkForUpdates() {
if (! _modelHandle) {
- start(5ms);
+ start(250ms, false);
}
if (_modelHandle && _subscriber.nextGenerationNow()) {
if (auto newModel = _modelHandle->getConfig()) {
LOG(config, "Sentinel got model info [version %s] for %zd hosts [config generation %" PRId64 "]",
newModel->vespaVersion.c_str(), newModel->hosts.size(), _subscriber.getGeneration());
+ std::lock_guard<std::mutex> guard(_lock);
_modelConfig = std::move(newModel);
}
}
diff --git a/configd/src/apps/sentinel/model-owner.h b/configd/src/apps/sentinel/model-owner.h
index d03e7dec06d..0513463e955 100644
--- a/configd/src/apps/sentinel/model-owner.h
+++ b/configd/src/apps/sentinel/model-owner.h
@@ -5,6 +5,7 @@
#include <vespa/config-model.h>
#include <vespa/config/config.h>
#include <optional>
+#include <mutex>
using cloud::config::ModelConfig;
@@ -18,11 +19,12 @@ private:
std::string _configId;
config::ConfigSubscriber _subscriber;
config::ConfigHandle<ModelConfig>::UP _modelHandle;
+ std::mutex _lock;
std::unique_ptr<ModelConfig> _modelConfig;
public:
ModelOwner(const std::string &configId);
- virtual ~ModelOwner();
- void start(std::chrono::milliseconds timeout);
+ ~ModelOwner();
+ void start(std::chrono::milliseconds timeout, bool firstTime);
void checkForUpdates();
std::optional<ModelConfig> getModelConfig();
};
diff --git a/configd/src/apps/sentinel/report-connectivity.cpp b/configd/src/apps/sentinel/report-connectivity.cpp
index eceb2cf64aa..c1e519a4a9a 100644
--- a/configd/src/apps/sentinel/report-connectivity.cpp
+++ b/configd/src/apps/sentinel/report-connectivity.cpp
@@ -15,7 +15,6 @@ namespace config::sentinel {
ReportConnectivity::ReportConnectivity(FRT_RPCRequest *req, int timeout_ms, FRT_Supervisor &orb, ModelOwner &modelOwner)
: _parentRequest(req),
- _orb(orb),
_checks()
{
auto cfg = modelOwner.getModelConfig();
@@ -24,7 +23,7 @@ ReportConnectivity::ReportConnectivity(FRT_RPCRequest *req, int timeout_ms, FRT_
LOG(debug, "making connectivity report for %zd peers", map.size());
_remaining = map.size();
for (const auto & [ hostname, port ] : map) {
- _checks.emplace_back(std::make_unique<PeerCheck>(*this, hostname, port, _orb, timeout_ms));
+ _checks.emplace_back(std::make_unique<PeerCheck>(*this, hostname, port, orb, timeout_ms));
}
} else {
_parentRequest->SetError(FRTE_RPC_METHOD_FAILED, "failed getting model config");
diff --git a/configd/src/apps/sentinel/report-connectivity.h b/configd/src/apps/sentinel/report-connectivity.h
index 057a374a387..1f243b73028 100644
--- a/configd/src/apps/sentinel/report-connectivity.h
+++ b/configd/src/apps/sentinel/report-connectivity.h
@@ -26,7 +26,6 @@ public:
private:
void finish() const;
FRT_RPCRequest *_parentRequest;
- FRT_Supervisor &_orb;
std::vector<std::unique_ptr<PeerCheck>> _checks;
std::atomic<size_t> _remaining;
};