aboutsummaryrefslogtreecommitdiff
path: root/src/zenremotestore
diff options
context:
space:
mode:
authorzousar <[email protected]>2025-12-19 00:49:38 -0700
committerzousar <[email protected]>2025-12-19 00:49:38 -0700
commit774d39bf193dd84b76437abcd41df2478e3431c0 (patch)
treeaf6550d5f2f0e292775843473260df1e2872e63a /src/zenremotestore
parentChange default limit-overwrite behavior to true (diff)
downloadzen-774d39bf193dd84b76437abcd41df2478e3431c0.tar.xz
zen-774d39bf193dd84b76437abcd41df2478e3431c0.zip
Ensure upstream put propagation includes overwrite
When changing the default limit-overwrite behavior, a unit test surfaced a bug where an put of data with overwrite cache policy would not get propagated via zen's built-in upstream mechanism with a matching overwrite cache policy to the upstream. This change ensures that it does and leaves the unit test configured to exercise this scenario.
Diffstat (limited to 'src/zenremotestore')
-rw-r--r--src/zenremotestore/include/zenremotestore/jupiter/jupitersession.h7
-rw-r--r--src/zenremotestore/jupiter/jupitersession.cpp17
-rw-r--r--src/zenremotestore/projectstore/jupiterremoteprojectstore.cpp2
3 files changed, 20 insertions, 6 deletions
diff --git a/src/zenremotestore/include/zenremotestore/jupiter/jupitersession.h b/src/zenremotestore/include/zenremotestore/jupiter/jupitersession.h
index 1945f6cff..15077376c 100644
--- a/src/zenremotestore/include/zenremotestore/jupiter/jupitersession.h
+++ b/src/zenremotestore/include/zenremotestore/jupiter/jupitersession.h
@@ -81,7 +81,12 @@ public:
IoHash& OutPayloadHash,
std::filesystem::path TempFolderPath = {});
- PutRefResult PutRef(std::string_view Namespace, std::string_view BucketId, const IoHash& Key, IoBuffer Ref, ZenContentType RefType);
+ PutRefResult PutRef(std::string_view Namespace,
+ std::string_view BucketId,
+ const IoHash& Key,
+ bool Overwrite,
+ IoBuffer Ref,
+ ZenContentType RefType);
JupiterResult PutBlob(std::string_view Namespace, const IoHash& Key, IoBuffer Blob);
JupiterResult PutCompressedBlob(std::string_view Namespace, const IoHash& Key, IoBuffer Blob);
JupiterResult PutCompressedBlob(std::string_view Namespace, const IoHash& Key, const CompositeBuffer& Blob);
diff --git a/src/zenremotestore/jupiter/jupitersession.cpp b/src/zenremotestore/jupiter/jupitersession.cpp
index 3dac87d96..dd0e5ad1f 100644
--- a/src/zenremotestore/jupiter/jupitersession.cpp
+++ b/src/zenremotestore/jupiter/jupitersession.cpp
@@ -184,7 +184,12 @@ JupiterSession::GetObject(std::string_view Namespace, const IoHash& Key)
}
PutRefResult
-JupiterSession::PutRef(std::string_view Namespace, std::string_view BucketId, const IoHash& Key, IoBuffer Ref, ZenContentType RefType)
+JupiterSession::PutRef(std::string_view Namespace,
+ std::string_view BucketId,
+ const IoHash& Key,
+ bool Overwrite,
+ IoBuffer Ref,
+ ZenContentType RefType)
{
ZEN_TRACE_CPU("JupiterClient::PutRef");
@@ -192,9 +197,13 @@ JupiterSession::PutRef(std::string_view Namespace, std::string_view BucketId, co
IoHash Hash = IoHash::HashBuffer(Ref.Data(), Ref.Size());
- HttpClient::Response Response = m_HttpClient.Put(fmt::format("/api/v1/refs/{}/{}/{}", Namespace, BucketId, Key.ToHexString()),
- Ref,
- {{"X-Jupiter-IoHash", Hash.ToHexString()}});
+ HttpClient::KeyValueMap AdditionalHeaders({{"X-Jupiter-IoHash", Hash.ToHexString()}});
+ if (Overwrite)
+ {
+ AdditionalHeaders.Entries.emplace("X-Jupiter-Allow-Overwrite", "True");
+ }
+ HttpClient::Response Response =
+ m_HttpClient.Put(fmt::format("/api/v1/refs/{}/{}/{}", Namespace, BucketId, Key.ToHexString()), Ref, AdditionalHeaders);
PutRefResult Result = {detail::ConvertResponse(Response)};
if (Result.Success)
diff --git a/src/zenremotestore/projectstore/jupiterremoteprojectstore.cpp b/src/zenremotestore/projectstore/jupiterremoteprojectstore.cpp
index 6d888ea01..462de2988 100644
--- a/src/zenremotestore/projectstore/jupiterremoteprojectstore.cpp
+++ b/src/zenremotestore/projectstore/jupiterremoteprojectstore.cpp
@@ -80,7 +80,7 @@ public:
virtual SaveResult SaveContainer(const IoBuffer& Payload) override
{
JupiterSession Session(m_JupiterClient->Logger(), m_JupiterClient->Client(), m_AllowRedirect);
- PutRefResult PutResult = Session.PutRef(m_Namespace, m_Bucket, m_Key, Payload, ZenContentType::kCbObject);
+ PutRefResult PutResult = Session.PutRef(m_Namespace, m_Bucket, m_Key, /*Overwrite*/ false, Payload, ZenContentType::kCbObject);
AddStats(PutResult);
SaveResult Result{ConvertResult(PutResult), {PutResult.Needs.begin(), PutResult.Needs.end()}, PutResult.RawHash};