aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2026-03-11 09:45:44 +0100
committerGitHub Enterprise <[email protected]>2026-03-11 09:45:44 +0100
commitc7212e99244ce7c4225274f4187fde4f6aecd9e3 (patch)
tree21d97a05ac89a602eb6b258482421fabb3a4444b /src
parenthub consul integration (#820) (diff)
downloadzen-c7212e99244ce7c4225274f4187fde4f6aecd9e3.tar.xz
zen-c7212e99244ce7c4225274f4187fde4f6aecd9e3.zip
block scavenge of other downloads that uses an older state file (#822)
Diffstat (limited to 'src')
-rw-r--r--src/zenremotestore/builds/buildsavedstate.cpp8
-rw-r--r--src/zenremotestore/builds/buildstorageoperations.cpp12
-rw-r--r--src/zenremotestore/include/zenremotestore/builds/buildsavedstate.h5
3 files changed, 22 insertions, 3 deletions
diff --git a/src/zenremotestore/builds/buildsavedstate.cpp b/src/zenremotestore/builds/buildsavedstate.cpp
index 0685bf679..dfc565d4a 100644
--- a/src/zenremotestore/builds/buildsavedstate.cpp
+++ b/src/zenremotestore/builds/buildsavedstate.cpp
@@ -163,6 +163,8 @@ BuildSaveState::Write(const BuildSaveState& SaveState, CbWriter& Output)
{
ZEN_ASSERT(!SaveState.LocalPath.empty());
+ Output.AddInteger("version", SaveState.Version);
+
Output.AddString("path", (const char*)SaveState.LocalPath.u8string().c_str());
BuildsSelection::Write(SaveState.State.Selection, Output);
@@ -182,6 +184,7 @@ BuildSaveState::Write(const BuildSaveState& SaveState, CbWriter& Output)
BuildSaveState
BuildSaveState::Read(CbObjectView& Input)
{
+ uint32_t Version = Input["version"].AsUInt32(BuildSaveState::NoVersion);
BuildState State = BuildState::Read(Input);
CbObjectView LocalFolderStateObject = Input["localFolderState"sv].AsObjectView();
FolderContent FolderState = LoadFolderContentToCompactBinary(LocalFolderStateObject);
@@ -191,7 +194,10 @@ BuildSaveState::Read(CbObjectView& Input)
throw std::runtime_error("BuildSaveState is invalid, 'path' field is empty");
}
- return BuildSaveState{.State = std::move(State), .FolderState = std::move(FolderState), .LocalPath = std::move(LocalPath)};
+ return BuildSaveState{.Version = Version,
+ .State = std::move(State),
+ .FolderState = std::move(FolderState),
+ .LocalPath = std::move(LocalPath)};
}
CbObject
diff --git a/src/zenremotestore/builds/buildstorageoperations.cpp b/src/zenremotestore/builds/buildstorageoperations.cpp
index f4b167b73..44d52451c 100644
--- a/src/zenremotestore/builds/buildstorageoperations.cpp
+++ b/src/zenremotestore/builds/buildstorageoperations.cpp
@@ -2622,8 +2622,16 @@ BuildsOperationUpdateFolder::FindScavengeContent(const ScavengeSource& Source,
try
{
BuildSaveState SavedState = ReadBuildSaveStateFile(Source.StateFilePath);
- OutScavengedLocalContent = std::move(SavedState.State.ChunkedContent);
- LocalFolderState = std::move(SavedState.FolderState);
+ if (SavedState.Version == BuildSaveState::NoVersion)
+ {
+ ZEN_OPERATION_LOG_DEBUG(m_LogOutput,
+ "Skipping old build state at '{}', state files before version {} can not be trusted during scavenge",
+ Source.StateFilePath,
+ BuildSaveState::kVersion1);
+ return false;
+ }
+ OutScavengedLocalContent = std::move(SavedState.State.ChunkedContent);
+ LocalFolderState = std::move(SavedState.FolderState);
}
catch (const std::exception& Ex)
{
diff --git a/src/zenremotestore/include/zenremotestore/builds/buildsavedstate.h b/src/zenremotestore/include/zenremotestore/builds/buildsavedstate.h
index f808a7a3b..2a214f196 100644
--- a/src/zenremotestore/include/zenremotestore/builds/buildsavedstate.h
+++ b/src/zenremotestore/include/zenremotestore/builds/buildsavedstate.h
@@ -44,6 +44,11 @@ struct BuildState
struct BuildSaveState
{
+ static constexpr uint32_t NoVersion = 0;
+ static constexpr uint32_t kVersion1 = 1;
+ static constexpr uint32_t kCurrentVersion = kVersion1;
+
+ uint32_t Version = kCurrentVersion;
BuildState State;
FolderContent FolderState;
std::filesystem::path LocalPath;