From 202f4de0eca209671860d617d76303fbe67e8301 Mon Sep 17 00:00:00 2001 From: Anson Strauch Date: Mon, 19 Jan 2026 12:16:44 -0500 Subject: [PATCH] prevent GRAVITY_SETTINGS publish attempts before registered as data product --- src/api/cpp/GravityNode.cpp | 43 ++++++++++++++++++++++++++++++------- src/api/cpp/GravityNode.h | 2 ++ 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/api/cpp/GravityNode.cpp b/src/api/cpp/GravityNode.cpp index a446a894e..0f02b8fb4 100644 --- a/src/api/cpp/GravityNode.cpp +++ b/src/api/cpp/GravityNode.cpp @@ -427,6 +427,7 @@ GravityNode::GravityNode() // Default to no metrics metricsEnabled = false; settingsPubEnabled = false; + collectSettings = false; initialized = false; logInitialized = false; listenerEnabled = false; @@ -450,6 +451,7 @@ GravityNode::GravityNode(std::string componentID) // Default to no metrics metricsEnabled = false; settingsPubEnabled = false; + collectSettings = false; initialized = false; logInitialized = false; heartbeatStarted = false; @@ -714,6 +716,7 @@ GravityReturnCode GravityNode::init(std::string componentID) initLock.Lock(); + // Setup zmq context if (!initialized) { @@ -728,6 +731,9 @@ GravityReturnCode GravityNode::init(std::string componentID) parser->ParseConfigFile(config_file_name.c_str()); } + + collectSettings = getBoolParam("GravitySettingsPublishEnabled", false); + // Setup Logging as soon as config parser is available. if (!logInitialized) { @@ -987,9 +993,10 @@ GravityReturnCode GravityNode::init(std::string componentID) if (settingsPubEnabled) { registerDataProductInternal(gravity::constants::GRAVITY_SETTINGS_DPID, GravityTransportTypes::TCP, - false, false, false, true); + false, false, false, true); + collectSettings = false; } - + // Enable metrics (if configured) metricsEnabled = getBoolParam("GravityMetricsEnabled", false); if (metricsEnabled) @@ -1047,6 +1054,20 @@ GravityReturnCode GravityNode::init(std::string componentID) { logger->warn("Gravity.ini specifies both Domain and URL. Using URL."); } + if (settingsPubEnabled) { + for (const GravityConfigParamPB& configParamPB : settings_to_publish) + { + + if (!(publishedSettings.count(configParamPB.key()) == 1 && + publishedSettings.at(configParamPB.key()) == configParamPB.value())) + { + settingsGDP.setData(configParamPB); + publish(settingsGDP, componentID); + publishedSettings[configParamPB.key()] = configParamPB.value(); + } + } + settings_to_publish.clear(); + } initLock.Unlock(); @@ -2835,15 +2856,21 @@ std::string GravityNode::getStringParam(std::string key, std::string default_val configParamPB.set_is_default(false); } - if (settingsPubEnabled && initialized && + if (settingsPubEnabled && !(publishedSettings.count(configParamPB.key()) == 1 && - publishedSettings.at(configParamPB.key()) == configParamPB.value())) + publishedSettings.at(configParamPB.key()) == configParamPB.value())) { - settingsGDP.setData(configParamPB); - publish(settingsGDP, componentID); - publishedSettings[configParamPB.key()] = configParamPB.value(); + // setting good to be published at some point + if (collectSettings) { + settings_to_publish.push_back(configParamPB); // store for publish after initialization + } + else if (initialized) { // initialized, so go ahead and publish right now + settingsGDP.setData(configParamPB); + publish(settingsGDP, componentID); + publishedSettings[configParamPB.key()] = configParamPB.value(); + } } - + return configParamPB.value(); } diff --git a/src/api/cpp/GravityNode.h b/src/api/cpp/GravityNode.h index 783fe9bd1..8b592bde7 100644 --- a/src/api/cpp/GravityNode.h +++ b/src/api/cpp/GravityNode.h @@ -194,6 +194,7 @@ class GRAVITY_API GravityNode static Semaphore initLock; bool settingsPubEnabled; + bool collectSettings; bool metricsEnabled; bool initialized; bool logInitialized; @@ -241,6 +242,7 @@ class GRAVITY_API GravityNode GravityConfigParser* parser; GravityConfigParamPB configParamPB; + std::vector settings_to_publish; GravityDataProduct settingsGDP = GravityDataProduct(gravity::constants::GRAVITY_SETTINGS_DPID); GravityReturnCode ServiceDirectoryServiceLookup(std::string serviceOrDPID, std::string& url, std::string& domain,