diff options
| author | Dan Engelbrecht <[email protected]> | 2026-03-11 09:45:44 +0100 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2026-03-11 09:45:44 +0100 |
| commit | c7212e99244ce7c4225274f4187fde4f6aecd9e3 (patch) | |
| tree | 21d97a05ac89a602eb6b258482421fabb3a4444b /src | |
| parent | hub consul integration (#820) (diff) | |
| download | zen-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.cpp | 8 | ||||
| -rw-r--r-- | src/zenremotestore/builds/buildstorageoperations.cpp | 12 | ||||
| -rw-r--r-- | src/zenremotestore/include/zenremotestore/builds/buildsavedstate.h | 5 |
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; |