diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-12-07 17:48:45 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-12-07 20:05:00 +0100 |
commit | 4e0107cd88ec399517747dbe6c9060ef48dcbe1d (patch) | |
tree | 87319fd9d5718a26fe9b162569b15510a72be693 /config | |
parent | 89731416ff74bb9b7e8f94fb5a8b942aa08cabb8 (diff) |
Avoid unnecessary reconfig.
Diffstat (limited to 'config')
6 files changed, 13 insertions, 6 deletions
diff --git a/config/src/tests/configagent/configagent.cpp b/config/src/tests/configagent/configagent.cpp index f6593890975..bc90cb458db 100644 --- a/config/src/tests/configagent/configagent.cpp +++ b/config/src/tests/configagent/configagent.cpp @@ -100,6 +100,9 @@ public: void handle(std::unique_ptr<ConfigUpdate> update) override { + if (_update) { + update->merge(*_update); + } _update = std::move(update); } diff --git a/config/src/tests/configholder/configholder.cpp b/config/src/tests/configholder/configholder.cpp index 83249da3824..2c6fa2016bf 100644 --- a/config/src/tests/configholder/configholder.cpp +++ b/config/src/tests/configholder/configholder.cpp @@ -46,7 +46,7 @@ TEST("Require that polling for elements work") holder.handle(ConfigUpdate::UP(new ConfigUpdate(value, true, 0))); ASSERT_TRUE(holder.poll()); holder.provide(); - ASSERT_TRUE(holder.poll()); + ASSERT_FALSE(holder.poll()); } TEST_MT_F("Require that wait is interrupted", 2, ConfigHolder) diff --git a/config/src/vespa/config/common/configholder.cpp b/config/src/vespa/config/common/configholder.cpp index 6eeb1bd79a2..e2e6ae87688 100644 --- a/config/src/vespa/config/common/configholder.cpp +++ b/config/src/vespa/config/common/configholder.cpp @@ -16,14 +16,16 @@ ConfigUpdate::UP ConfigHolder::provide() { vespalib::MonitorGuard guard(_monitor); - ConfigUpdate::UP ret(new ConfigUpdate(*_current)); - return ret; + return std::move(_current); } void ConfigHolder::handle(ConfigUpdate::UP update) { vespalib::MonitorGuard guard(_monitor); + if (_current) { + update->merge(*_current); + } _current = std::move(update); guard.broadcast(); } diff --git a/config/src/vespa/config/common/configupdate.h b/config/src/vespa/config/common/configupdate.h index 7371d525266..9afdb9a5a40 100644 --- a/config/src/vespa/config/common/configupdate.h +++ b/config/src/vespa/config/common/configupdate.h @@ -19,6 +19,7 @@ public: const ConfigValue & getValue() const; bool hasChanged() const; int64_t getGeneration() const; + void merge(const ConfigUpdate & b) { _hasChanged = _hasChanged || b.hasChanged(); } private: ConfigValue _value; bool _hasChanged; diff --git a/config/src/vespa/config/frt/frtconfigagent.cpp b/config/src/vespa/config/frt/frtconfigagent.cpp index f475cff0a9a..c1516a7de11 100644 --- a/config/src/vespa/config/frt/frtconfigagent.cpp +++ b/config/src/vespa/config/frt/frtconfigagent.cpp @@ -61,16 +61,17 @@ FRTConfigAgent::handleUpdatedGeneration(const ConfigKey & key, const ConfigState LOG(spam, "Old config: md5:%s \n%s", _latest.getMd5().c_str(), _latest.asJson().c_str()); LOG(spam, "New config: md5:%s \n%s", configValue.getMd5().c_str(), configValue.asJson().c_str()); } + bool changed = false; if (_latest.getMd5() != configValue.getMd5()) { _latest = configValue; + changed = true; } _configState = newState; - if (LOG_WOULD_LOG(spam)) { LOG(spam, "updating holder for key %s,", key.toString().c_str()); } - _holder->handle(ConfigUpdate::UP(new ConfigUpdate(_latest, true, newState.generation))); + _holder->handle(ConfigUpdate::UP(new ConfigUpdate(_latest, changed, newState.generation))); _numConfigured++; } diff --git a/config/src/vespa/config/subscription/configsubscription.cpp b/config/src/vespa/config/subscription/configsubscription.cpp index d97ddfd57fb..b79e3dab1fd 100644 --- a/config/src/vespa/config/subscription/configsubscription.cpp +++ b/config/src/vespa/config/subscription/configsubscription.cpp @@ -30,7 +30,7 @@ ConfigSubscription::nextUpdate(int64_t generation, uint64_t timeoutInMillis) { if (_closed || !_holder->poll()) return false; - _next.reset(_holder->provide().release()); + _next = _holder->provide(); if (isGenerationNewer(_next->getGeneration(), generation)) { return true; } |