summaryrefslogtreecommitdiffstats
path: root/configd
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2021-06-01 07:16:39 +0000
committerArne Juul <arnej@verizonmedia.com>2021-06-01 07:16:39 +0000
commit7ad71781ded794e9870ee8cc4a1ea092799bf384 (patch)
treec460185e0644cae8210a3f958a0d035cd8758be2 /configd
parent82317bbcf9cb633d196888676c91ee9a69d1dd0d (diff)
add fetch of model config as a separate step
Diffstat (limited to 'configd')
-rw-r--r--configd/src/apps/sentinel/config-owner.cpp26
-rw-r--r--configd/src/apps/sentinel/config-owner.h3
-rw-r--r--configd/src/apps/sentinel/env.cpp22
3 files changed, 50 insertions, 1 deletions
diff --git a/configd/src/apps/sentinel/config-owner.cpp b/configd/src/apps/sentinel/config-owner.cpp
index 3feec70d2e5..d5f06dff76b 100644
--- a/configd/src/apps/sentinel/config-owner.cpp
+++ b/configd/src/apps/sentinel/config-owner.cpp
@@ -2,6 +2,7 @@
#include "config-owner.h"
#include <vespa/vespalib/util/exceptions.h>
+#include <vespa/config/common/exceptions.h>
#include <string>
#include <vespa/log/log.h>
@@ -41,4 +42,29 @@ ConfigOwner::checkForConfigUpdate() {
return false;
}
+std::unique_ptr<ModelConfig>
+ConfigOwner::fetchModelConfig(std::chrono::milliseconds timeout)
+{
+ std::unique_ptr<ModelConfig> modelConfig;
+ ConfigSubscriber tempSubscriber;
+ try {
+ ConfigHandle<ModelConfig>::UP modelHandle =
+ tempSubscriber.subscribe<ModelConfig>("admin/model", timeout);
+ if (tempSubscriber.nextGenerationNow()) {
+ modelConfig = modelHandle->getConfig();
+ LOG(config, "Sentinel got model info [version %s] for %zd hosts [config generation %zd",
+ modelConfig->vespaVersion.c_str(), modelConfig->hosts.size(),
+ tempSubscriber.getGeneration());
+ }
+ } catch (ConfigTimeoutException & ex) {
+ LOG(warning, "Timeout getting model config: %s [skipping connectivity checks]", ex.getMessage().c_str());
+ } catch (InvalidConfigException& ex) {
+ LOG(warning, "Invalid model config: %s [skipping connectivity checks]", ex.getMessage().c_str());
+ } catch (ConfigRuntimeException& ex) {
+ LOG(warning, "Runtime exception getting model config: %s [skipping connectivity checks]", ex.getMessage().c_str());
+
+ }
+ return modelConfig;
+}
+
}
diff --git a/configd/src/apps/sentinel/config-owner.h b/configd/src/apps/sentinel/config-owner.h
index 612db7fe9a1..2850e6b3904 100644
--- a/configd/src/apps/sentinel/config-owner.h
+++ b/configd/src/apps/sentinel/config-owner.h
@@ -3,9 +3,11 @@
#pragma once
#include <vespa/config-sentinel.h>
+#include <vespa/config-model.h>
#include <vespa/config/config.h>
using cloud::config::SentinelConfig;
+using cloud::config::ModelConfig;
using config::ConfigSubscriber;
using config::ConfigHandle;
@@ -35,6 +37,7 @@ public:
bool hasConfig() const { return _currConfig.get() != nullptr; }
const SentinelConfig& getConfig() const { return *_currConfig; }
int64_t getGeneration() const { return _currGeneration; }
+ static std::unique_ptr<ModelConfig> fetchModelConfig(std::chrono::milliseconds timeout);
};
}
diff --git a/configd/src/apps/sentinel/env.cpp b/configd/src/apps/sentinel/env.cpp
index 11ba20a18d5..c6c0b06a0ed 100644
--- a/configd/src/apps/sentinel/env.cpp
+++ b/configd/src/apps/sentinel/env.cpp
@@ -9,9 +9,12 @@
LOG_SETUP(".env");
+using namespace std::chrono_literals;
+
namespace config::sentinel {
-constexpr std::chrono::milliseconds CONFIG_TIMEOUT_MS(3 * 60 * 1000);
+constexpr std::chrono::milliseconds CONFIG_TIMEOUT_MS = 3min;
+constexpr std::chrono::milliseconds MODEL_TIMEOUT_MS = 1500ms;
Env::Env()
: _cfgOwner(),
@@ -38,6 +41,23 @@ void Env::boot(const std::string &configId) {
configId.c_str(), cfg.port.telnet, cfg.port.rpc);
rpcPort(cfg.port.rpc);
statePort(cfg.port.telnet);
+ if (auto up = ConfigOwner::fetchModelConfig(MODEL_TIMEOUT_MS)) {
+ const ModelConfig &model = *up;
+ for (const auto & h : model.hosts) {
+ LOG(info, "- Model for host %s with %zd services", h.name.c_str(), h.services.size());
+ for (const auto & s : h.services) {
+ if (s.name == "config-sentinel") {
+ LOG(info, " - Model for service %s type %s configid %s with %zd ports",
+ s.name.c_str(), s.type.c_str(), s.configid.c_str(), s.ports.size());
+ for (const auto & p : s.ports) {
+ if (p.tags.find("rpc") != p.tags.npos) {
+ LOG(info, " - Model for port %d has tags %s", p.number, p.tags.c_str());
+ }
+ }
+ }
+ }
+ }
+ }
}
void Env::rpcPort(int port) {