summaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@yahooinc.com>2022-04-27 14:32:10 +0000
committerHåvard Pettersen <havardpe@yahooinc.com>2022-04-27 14:32:10 +0000
commit05722858acf550c5a43f76bfe2be53ba62fa5ecc (patch)
tree95bb338c141c3d0f321aa816778ff55b3df43122 /config
parent6af60e5fbd2ef841359f62f676aab94c19206fa3 (diff)
allow atomic inspection of current config generation
Diffstat (limited to 'config')
-rw-r--r--config/src/vespa/config/subscription/configsubscriptionset.cpp12
-rw-r--r--config/src/vespa/config/subscription/configsubscriptionset.h4
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.
};