From a0a4207ce2210d350d2c7bf152ba00859c78f013 Mon Sep 17 00:00:00 2001 From: sfc-gh-tclinkenbeard Date: Wed, 11 Aug 2021 23:41:19 -0700 Subject: [PATCH] Capture deep copy of machine_info in printSnapshotTeamsInfo --- fdbserver/DataDistribution.actor.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/fdbserver/DataDistribution.actor.cpp b/fdbserver/DataDistribution.actor.cpp index ef925b1f19..40a089e4d0 100644 --- a/fdbserver/DataDistribution.actor.cpp +++ b/fdbserver/DataDistribution.actor.cpp @@ -108,12 +108,24 @@ struct TCServerInfo : public ReferenceCounted { ~TCServerInfo(); }; -struct TCMachineInfo : public ReferenceCounted { +class TCMachineInfo : public ReferenceCounted { + TCMachineInfo() = default; + +public: std::vector> serversOnMachine; // SOMEDAY: change from vector to set Standalone machineID; std::vector> machineTeams; // SOMEDAY: split good and bad machine teams. LocalityEntry localityEntry; + Reference clone() const { + auto result = Reference(new TCMachineInfo); + result->serversOnMachine = serversOnMachine; + result->machineID = machineID; + result->machineTeams = machineTeams; + result->localityEntry = localityEntry; + return result; + } + explicit TCMachineInfo(Reference server, const LocalityEntry& entry) : localityEntry(entry) { ASSERT(serversOnMachine.empty()); serversOnMachine.push_back(server); @@ -3011,7 +3023,10 @@ ACTOR Future printSnapshotTeamsInfo(Reference self) { configuration = self->configuration; server_info = self->server_info; teams = self->teams; - machine_info = self->machine_info; + // Perform deep copy so we have a consistent snapshot, even if yields are performed + for (const auto& [machineId, info] : self->machine_info) { + machine_info.emplace(machineId, info->clone()); + } machineTeams = self->machineTeams; // internedLocalityRecordKeyNameStrings = self->machineLocalityMap._keymap->_lookuparray; // machineLocalityMapEntryArraySize = self->machineLocalityMap.size();