summaryrefslogtreecommitdiffstats
path: root/logd
diff options
context:
space:
mode:
authorArne Juul <arnej@yahoo-inc.com>2017-11-23 08:34:05 +0000
committerArne Juul <arnej@yahoo-inc.com>2017-12-04 13:26:58 +0000
commitf207f5403b91df0fb9fe6679c45ba93fcc00ab5b (patch)
tree6f2a15c167a51572058fb57d7286641c6e98c07b /logd
parent1f4e8cdcec0745047e7a99a672554844d809d715 (diff)
fix config generation reporting
* check if a new generation is available, and if so do full reconfiguration including updating the generation reported via /state/v1/config API.
Diffstat (limited to 'logd')
-rw-r--r--logd/src/logd/conf.cpp28
-rw-r--r--logd/src/logd/conf.h4
-rw-r--r--logd/src/logd/watch.cpp5
3 files changed, 27 insertions, 10 deletions
diff --git a/logd/src/logd/conf.cpp b/logd/src/logd/conf.cpp
index 716ba97effd..ef1f6b73cbe 100644
--- a/logd/src/logd/conf.cpp
+++ b/logd/src/logd/conf.cpp
@@ -35,12 +35,12 @@ ConfSub::configure(std::unique_ptr<LogdConfig> cfg)
return;
}
strcpy(_logServer, newconf.logserver.host.c_str());
- _newConf = true;
+ _needToConnect = true;
}
if (newconf.logserver.use != _use_logserver)
{
_use_logserver = newconf.logserver.use;
- _newConf = true;
+ _needToConnect = true;
}
_statePort = newconf.stateport;
@@ -57,7 +57,7 @@ ConfSub::configure(std::unique_ptr<LogdConfig> cfg)
if (newconf.logserver.port != _logPort) {
_logPort = newconf.logserver.port;
- _newConf = true;
+ _needToConnect = true;
}
if (newconf.rotate.size > 0) {
_rotate_size = newconf.rotate.size;
@@ -85,12 +85,23 @@ ConfSub::configure(std::unique_ptr<LogdConfig> cfg)
}
}
+bool
+ConfSub::checkAvailable()
+{
+ if (_subscriber.nextGeneration(0)) {
+ _hasAvailable = true;
+ }
+ return _hasAvailable;
+}
+
void
ConfSub::latch()
{
- if (_subscriber.nextConfig(0))
+ if (checkAvailable()) {
configure(_handle->getConfig());
- if (_newConf) {
+ _hasAvailable = false;
+ }
+ if (_needToConnect) {
if (_use_logserver) {
connectToLogserver();
} else {
@@ -133,7 +144,7 @@ ConfSub::resetFileDescriptor(int newfd)
}
_logserverfd = newfd;
_fw.setLogserverFD(newfd);
- _newConf = false;
+ _needToConnect = false;
}
void
@@ -141,7 +152,7 @@ ConfSub::closeConn()
{
close(_logserverfd);
_logserverfd = -1;
- _newConf = true;
+ _needToConnect = true;
}
ConfSub::ConfSub(Forwarder &fw, const config::ConfigUri & configUri)
@@ -156,7 +167,8 @@ ConfSub::ConfSub(Forwarder &fw, const config::ConfigUri & configUri)
_fw(fw),
_subscriber(configUri.getContext()),
_handle(),
- _newConf(false)
+ _hasAvailable(false),
+ _needToConnect(true)
{
_logServer[0] = '\0';
_handle = _subscriber.subscribe<LogdConfig>(configUri.getConfigId());
diff --git a/logd/src/logd/conf.h b/logd/src/logd/conf.h
index 7a91630ff93..a777470efc6 100644
--- a/logd/src/logd/conf.h
+++ b/logd/src/logd/conf.h
@@ -19,7 +19,8 @@ private:
Forwarder& _fw;
config::ConfigSubscriber _subscriber;
config::ConfigHandle<cloud::config::log::LogdConfig>::UP _handle;
- bool _newConf;
+ bool _hasAvailable;
+ bool _needToConnect;
void connectToLogserver();
void connectToDevNull();
@@ -27,6 +28,7 @@ private:
ConfSub(const ConfSub& other);
ConfSub& operator=(const ConfSub& other);
public:
+ bool checkAvailable();
void latch();
void closeConn();
ConfSub(Forwarder &fw, const config::ConfigUri & configUri);
diff --git a/logd/src/logd/watch.cpp b/logd/src/logd/watch.cpp
index ad866938ab6..2adc1cbbdbb 100644
--- a/logd/src/logd/watch.cpp
+++ b/logd/src/logd/watch.cpp
@@ -332,7 +332,10 @@ Watcher::watchfile()
dcf.saveState(already, _forwarder.knownServices);
- _confsubscriber.latch();
+ if (_confsubscriber.checkAvailable()) {
+ LOG(debug, "new config available, doing reconfigure");
+ return;
+ }
if (_confsubscriber.useLogserver()) {
cmdbuf.maybeRead(_forwarder.getLogserverFD());