aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHÃ¥vard Pettersen <3535158+havardpe@users.noreply.github.com>2022-04-27 17:10:19 +0200
committerGitHub <noreply@github.com>2022-04-27 17:10:19 +0200
commit7c1c825b0ea3341b2e710235f2949306b6295f92 (patch)
tree8c714f62703e8a74bf863c189573e610ba804aad
parent5205caa25887e48e272241866a50eb125a4477be (diff)
parent05722858acf550c5a43f76bfe2be53ba62fa5ecc (diff)
Merge pull request #22317 from vespa-engine/havardpe/make-inspecting-config-generation-atomic
allow atomic inspection of current config generation
-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.
};