From 728d1294fa718717dffe078860a2f5d3e9fe788d Mon Sep 17 00:00:00 2001 From: sfc-gh-tclinkenbeard Date: Sun, 4 Dec 2022 12:47:00 -0800 Subject: [PATCH] Avoid race between ConfigNodeImpl::getChanges and ConfigNodeImpl::commitMutations --- fdbserver/ConfigNode.actor.cpp | 5 +++++ fdbserver/SimpleConfigConsumer.actor.cpp | 2 ++ 2 files changed, 7 insertions(+) diff --git a/fdbserver/ConfigNode.actor.cpp b/fdbserver/ConfigNode.actor.cpp index 82ce05e590..3c34bc0a93 100644 --- a/fdbserver/ConfigNode.actor.cpp +++ b/fdbserver/ConfigNode.actor.cpp @@ -113,6 +113,7 @@ TEST_CASE("/fdbserver/ConfigDB/ConfigNode/Internal/versionedMutationKeyOrdering" class ConfigNodeImpl { UID id; + FlowLock lock; OnDemandStore kvStore; CounterCollection cc; @@ -218,6 +219,8 @@ class ConfigNodeImpl { } ACTOR static Future getChanges(ConfigNodeImpl* self, ConfigFollowerGetChangesRequest req) { + wait(self->lock.take()); + state FlowLock::Releaser releaser(self->lock); Version lastCompactedVersion = wait(getLastCompactedVersion(self)); if (req.lastSeenVersion < lastCompactedVersion) { ++self->failedChangeRequests; @@ -413,6 +416,8 @@ class ConfigNodeImpl { Standalone> annotations, Version commitVersion, Version liveVersion = ::invalidVersion) { + wait(self->lock.take()); + state FlowLock::Releaser releaser(self->lock); Version latestVersion = 0; int index = 0; for (const auto& mutation : mutations) { diff --git a/fdbserver/SimpleConfigConsumer.actor.cpp b/fdbserver/SimpleConfigConsumer.actor.cpp index 769bdf142f..972584cb1c 100644 --- a/fdbserver/SimpleConfigConsumer.actor.cpp +++ b/fdbserver/SimpleConfigConsumer.actor.cpp @@ -111,6 +111,8 @@ class SimpleConfigConsumerImpl { if (e.code() == error_code_version_already_compacted) { CODE_PROBE(true, "SimpleConfigConsumer get version_already_compacted error"); wait(getSnapshotAndChanges(self, broadcaster)); + } else if (e.code() == error_code_broken_promise) { + CODE_PROBE(true, "SimpleConfigConsumer::fetchChanges retrying on broken promise"); } else { throw e; }