diff options
author | Håvard Pettersen <havardpe@yahooinc.com> | 2022-04-27 14:32:10 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@yahooinc.com> | 2022-04-27 14:32:10 +0000 |
commit | 05722858acf550c5a43f76bfe2be53ba62fa5ecc (patch) | |
tree | 95bb338c141c3d0f321aa816778ff55b3df43122 | |
parent | 6af60e5fbd2ef841359f62f676aab94c19206fa3 (diff) |
allow atomic inspection of current config generation
-rw-r--r-- | config/src/vespa/config/subscription/configsubscriptionset.cpp | 12 | ||||
-rw-r--r-- | config/src/vespa/config/subscription/configsubscriptionset.h | 4 |
2 files changed, 8 insertions, 8 deletions
diff --git a/config/src/vespa/config/subscription/configsubscriptionset.cpp b/config/src/vespa/config/subscription/configsubscriptionset.cpp index 1d5db778dda..48e2bdc2615 100644 --- a/config/src/vespa/config/subscription/configsubscriptionset.cpp +++ b/config/src/vespa/config/subscription/configsubscriptionset.cpp @@ -42,7 +42,7 @@ ConfigSubscriptionSet::acquireSnapshot(duration timeout, bool ignoreChange) steady_time now = steady_clock::now(); const steady_time deadline = now + timeout; - int64_t lastGeneration = _currentGeneration; + int64_t lastGeneration = getGeneration(); bool inSync = false; LOG(spam, "Going into nextConfig loop, time left is %f", vespalib::to_s(deadline - now)); @@ -55,7 +55,7 @@ ConfigSubscriptionSet::acquireSnapshot(duration timeout, bool ignoreChange) // Run nextUpdate on all subscribers to get them in sync. for (const auto & subscription : _subscriptionList) { - if (!subscription->nextUpdate(_currentGeneration, deadline) && !subscription->hasGenerationChanged()) { + if (!subscription->nextUpdate(getGeneration(), deadline) && !subscription->hasGenerationChanged()) { subscription->reset(); continue; } @@ -68,7 +68,7 @@ ConfigSubscriptionSet::acquireSnapshot(duration timeout, bool ignoreChange) LOG(spam, "Config subscription did not change, id(%s), defname(%s)", key.getConfigId().c_str(), key.getDefName().c_str()); } LOG(spam, "Previous generation is %" PRId64 ", updates is %" PRId64, lastGeneration, subscription->getGeneration()); - if (isGenerationNewer(subscription->getGeneration(), _currentGeneration)) { + if (isGenerationNewer(subscription->getGeneration(), getGeneration())) { numGenerationChanged++; } if (generation < 0) { @@ -88,10 +88,10 @@ ConfigSubscriptionSet::acquireSnapshot(duration timeout, bool ignoreChange) } } - bool updated = inSync && isGenerationNewer(lastGeneration, _currentGeneration); + bool updated = inSync && isGenerationNewer(lastGeneration, getGeneration()); if (updated) { - LOG(spam, "Config was updated from %" PRId64 " to %" PRId64, _currentGeneration, lastGeneration); - _currentGeneration = lastGeneration; + LOG(spam, "Config was updated from %" PRId64 " to %" PRId64, getGeneration(), lastGeneration); + _currentGeneration.store(lastGeneration, std::memory_order_relaxed); _state = CONFIGURED; for (const auto & subscription : _subscriptionList) { const ConfigKey & key(subscription->getKey()); diff --git a/config/src/vespa/config/subscription/configsubscriptionset.h b/config/src/vespa/config/subscription/configsubscriptionset.h index 4b6d970770d..8daf7ae91ea 100644 --- a/config/src/vespa/config/subscription/configsubscriptionset.h +++ b/config/src/vespa/config/subscription/configsubscriptionset.h @@ -39,7 +39,7 @@ public: * @return generation number */ int64_t getGeneration() const noexcept { - return _currentGeneration; + return _currentGeneration.load(std::memory_order_relaxed); } /** @@ -69,7 +69,7 @@ private: const vespalib::duration _maxNapTime; std::shared_ptr<IConfigContext> _context; // Context to keep alive managers. IConfigManager & _mgr; // The config manager that we use. - int64_t _currentGeneration; // Holds the current config generation. + std::atomic<int64_t> _currentGeneration; // Holds the current config generation. SubscriptionList _subscriptionList; // List of current subscriptions. std::atomic<SubscriberState> _state; // Current state of this subscriber. }; |