aboutsummaryrefslogtreecommitdiff
path: root/zenstore/CAS.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-10-19 16:33:27 +0200
committerStefan Boberg <[email protected]>2021-10-19 16:33:27 +0200
commit3c817d5bb997a3aaf906be6a5b249a58f3afedfe (patch)
treea7ad3792dbc75103904797350378b1fd1a09e523 /zenstore/CAS.cpp
parentMerge branch 'main' into gc (diff)
downloadzen-3c817d5bb997a3aaf906be6a5b249a58f3afedfe.tar.xz
zen-3c817d5bb997a3aaf906be6a5b249a58f3afedfe.zip
cas: implemented manifest update/upgrade
Diffstat (limited to 'zenstore/CAS.cpp')
-rw-r--r--zenstore/CAS.cpp80
1 files changed, 56 insertions, 24 deletions
diff --git a/zenstore/CAS.cpp b/zenstore/CAS.cpp
index a43759283..a71e251e5 100644
--- a/zenstore/CAS.cpp
+++ b/zenstore/CAS.cpp
@@ -5,6 +5,9 @@
#include "compactcas.h"
#include "filecas.h"
+#include <zencore/compactbinary.h>
+#include <zencore/compactbinarybuilder.h>
+#include <zencore/compactbinaryvalidation.h>
#include <zencore/except.h>
#include <zencore/fmtutils.h>
#include <zencore/logging.h>
@@ -14,9 +17,6 @@
#include <zencore/testutils.h>
#include <zencore/thread.h>
#include <zencore/uid.h>
-#include <zencore/compactbinary.h>
-#include <zencore/compactbinarybuilder.h>
-#include <zencore/compactbinaryvalidation.h>
#include <gsl/gsl-lite.hpp>
@@ -108,15 +108,17 @@ private:
CasContainerStrategy m_TinyStrategy;
CasContainerStrategy m_SmallStrategy;
FileCasStrategy m_LargeStrategy;
- CbObject m_ManifestObject;
-
+ CbObject m_ManifestObject;
+
enum class StorageScheme
{
- Legacy = 0,
+ Legacy = 0,
WithCbManifest = 1
};
- StorageScheme m_StorageScheme = StorageScheme::Legacy;
+ StorageScheme m_StorageScheme = StorageScheme::Legacy;
+
+ void UpdateManifest(bool IsNewStore);
};
CasImpl::CasImpl() : m_TinyStrategy(m_Config), m_SmallStrategy(m_Config), m_LargeStrategy(m_Config)
@@ -150,49 +152,55 @@ CasImpl::Initialize(const CasStoreConfiguration& InConfig)
ManifestPath /= ".ucas_root";
std::error_code Ec;
- BasicFile Marker;
- Marker.Open(ManifestPath.c_str(), /* IsCreate */ false, Ec);
+ BasicFile ManifestFile;
+ ManifestFile.Open(ManifestPath.c_str(), /* IsCreate */ false, Ec);
+
+ bool ManifestIsOk = false;
if (Ec)
{
if (Ec == std::errc::no_such_file_or_directory)
{
IsNewStore = true;
-
- CbObjectWriter Cbo;
-
- Cbo << "id" << zen::Oid::NewOid();
-
- Marker.Open(ManifestPath.c_str(), /* IsCreate */ true);
- m_ManifestObject = Cbo.Save();
-
- Marker.Write(m_ManifestObject.GetBuffer(), 0);
}
}
else
{
- IoBuffer ManifestBuffer = Marker.ReadAll();
+ IoBuffer ManifestBuffer = ManifestFile.ReadAll();
+ ManifestFile.Close();
if (ManifestBuffer.Size() > 0 && ManifestBuffer.Data<uint8_t>()[0] == '#')
{
- // Old-style manifest, does not contain any useful information (so we may as well update it?)
- m_StorageScheme = StorageScheme::Legacy;
+ // Old-style manifest, does not contain any useful information, so we may as well update it
}
else
{
- CbObject Manifest{SharedBuffer(ManifestBuffer)};
+ CbObject Manifest{SharedBuffer(ManifestBuffer)};
CbValidateError ValidationResult = ValidateCompactBinary(ManifestBuffer, CbValidateMode::All);
if (ValidationResult == CbValidateError::None)
{
- m_ManifestObject = std::move(Manifest);
+ if (Manifest["id"])
+ {
+ ManifestIsOk = true;
+ }
}
else
{
- ZEN_ERROR("Store manifest validation failed: {:#x}", ValidationResult);
+ ZEN_ERROR("Store manifest validation failed: {:#x}, will generate new manifest to recover", ValidationResult);
+ }
+
+ if (ManifestIsOk)
+ {
+ m_ManifestObject = std::move(Manifest);
}
}
}
+
+ if (!ManifestIsOk)
+ {
+ UpdateManifest(true);
+ }
}
// Initialize payload storage
@@ -201,6 +209,30 @@ CasImpl::Initialize(const CasStoreConfiguration& InConfig)
m_SmallStrategy.Initialize("sobs", 4096, IsNewStore);
}
+void
+CasImpl::UpdateManifest(bool IsNewStore)
+{
+ if (!m_ManifestObject)
+ {
+ CbObjectWriter Cbo;
+ Cbo << "id" << zen::Oid::NewOid() << "created" << DateTime::Now();
+ m_ManifestObject = Cbo.Save();
+ }
+
+ // Write manifest to file
+
+ std::filesystem::path ManifestPath = m_Config.RootDirectory;
+ ManifestPath /= ".ucas_root";
+
+ // This will throw on failure
+
+ ZEN_TRACE("Writing new manifest to '{}'", ManifestPath);
+
+ BasicFile Marker;
+ Marker.Open(ManifestPath.c_str(), /* IsCreate */ true);
+ Marker.Write(m_ManifestObject.GetBuffer(), 0);
+}
+
CasStore::InsertResult
CasImpl::InsertChunk(IoBuffer Chunk, const IoHash& ChunkHash)
{