aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2026-01-28 10:32:02 +0100
committerGitHub Enterprise <[email protected]>2026-01-28 10:32:02 +0100
commit03c23e9ce6a6ba6138e10a48e810f251d53ca9f4 (patch)
tree48d07f32930e0ef65963e48e65bbd0e6dfbeda67 /src
parent5.7.19-pre1 (diff)
downloadzen-03c23e9ce6a6ba6138e10a48e810f251d53ca9f4.tar.xz
zen-03c23e9ce6a6ba6138e10a48e810f251d53ca9f4.zip
Avoid conversion from JSon to compact binary when querying for builds to avoid integer vs float conversion issues (#735)
Diffstat (limited to 'src')
-rw-r--r--src/zen/cmds/builds_cmd.cpp18
-rw-r--r--src/zenremotestore/builds/filebuildstorage.cpp5
-rw-r--r--src/zenremotestore/builds/jupiterbuildstorage.cpp10
-rw-r--r--src/zenremotestore/include/zenremotestore/builds/buildstorage.h2
-rw-r--r--src/zenremotestore/include/zenremotestore/jupiter/jupitersession.h2
-rw-r--r--src/zenremotestore/jupiter/jupitersession.cpp5
6 files changed, 24 insertions, 18 deletions
diff --git a/src/zen/cmds/builds_cmd.cpp b/src/zen/cmds/builds_cmd.cpp
index 176c2374c..f4edb65ab 100644
--- a/src/zen/cmds/builds_cmd.cpp
+++ b/src/zen/cmds/builds_cmd.cpp
@@ -3212,31 +3212,39 @@ BuildsCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
LogExecutableVersionAndPid();
}
}
- CbObject QueryObject;
+ std::string JsonQuery;
if (m_ListQueryPath.empty())
{
CbObjectWriter QueryWriter;
QueryWriter.BeginObject("query");
QueryWriter.EndObject(); // query
- QueryObject = QueryWriter.Save();
+ CbObject QueryObject = QueryWriter.Save();
+ ExtendableStringBuilder<64> SB;
+ CompactBinaryToJson(QueryObject, SB);
+ JsonQuery = SB.ToString();
}
else
{
if (ToLower(m_ListQueryPath.extension().string()) == ".cbo")
{
- QueryObject = LoadCompactBinaryObject(IoBufferBuilder::MakeFromFile(m_ListQueryPath));
+ CbObject QueryObject = LoadCompactBinaryObject(IoBufferBuilder::MakeFromFile(m_ListQueryPath));
+ ExtendableStringBuilder<64> SB;
+ CompactBinaryToJson(QueryObject, SB);
+ JsonQuery = SB.ToString();
}
else
{
IoBuffer MetaDataJson = ReadFile(m_ListQueryPath).Flatten();
std::string_view Json(reinterpret_cast<const char*>(MetaDataJson.GetData()), MetaDataJson.GetSize());
std::string JsonError;
- QueryObject = LoadCompactBinaryFromJson(Json, JsonError).AsObject();
+ CbObject QueryObject = LoadCompactBinaryFromJson(Json, JsonError)
+ .AsObject(); // We try to convert it so it is at least reaonably verified in format
if (!JsonError.empty())
{
throw std::runtime_error(
fmt::format("build metadata file '{}' is malformed. Reason: '{}'", m_ListQueryPath, JsonError));
}
+ JsonQuery = std::string(Json);
}
}
@@ -3259,7 +3267,7 @@ BuildsCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
/*RequireBucket*/ false,
/*BoostCacheBackgroundWorkerPool */ false);
- CbObject Response = Storage.BuildStorage->ListBuilds(QueryObject);
+ CbObject Response = Storage.BuildStorage->ListBuilds(JsonQuery);
ZEN_ASSERT(ValidateCompactBinary(Response.GetView(), CbValidateMode::Default) == CbValidateError::None);
if (m_ListResultPath.empty())
{
diff --git a/src/zenremotestore/builds/filebuildstorage.cpp b/src/zenremotestore/builds/filebuildstorage.cpp
index 1474fd819..55e69de61 100644
--- a/src/zenremotestore/builds/filebuildstorage.cpp
+++ b/src/zenremotestore/builds/filebuildstorage.cpp
@@ -61,13 +61,12 @@ public:
return Writer.Save();
}
- virtual CbObject ListBuilds(CbObject Query) override
+ virtual CbObject ListBuilds(std::string_view JsonQuery) override
{
ZEN_TRACE_CPU("FileBuildStorage::ListBuilds");
- ZEN_UNUSED(Query);
uint64_t ReceivedBytes = 0;
- uint64_t SentBytes = Query.GetSize();
+ uint64_t SentBytes = JsonQuery.size();
SimulateLatency(SentBytes, 0);
auto _ = MakeGuard([&]() { SimulateLatency(0, ReceivedBytes); });
diff --git a/src/zenremotestore/builds/jupiterbuildstorage.cpp b/src/zenremotestore/builds/jupiterbuildstorage.cpp
index 962ffaaed..23d0ddd4c 100644
--- a/src/zenremotestore/builds/jupiterbuildstorage.cpp
+++ b/src/zenremotestore/builds/jupiterbuildstorage.cpp
@@ -104,15 +104,13 @@ public:
return Response.Save();
}
- virtual CbObject ListBuilds(CbObject Query) override
+ virtual CbObject ListBuilds(std::string_view JsonQuery) override
{
ZEN_TRACE_CPU("Jupiter::ListBuilds");
- Stopwatch ExecutionTimer;
- auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); });
- IoBuffer Payload = Query.GetBuffer().AsIoBuffer();
- Payload.SetContentType(ZenContentType::kCbObject);
- JupiterResult ListResult = m_Session.ListBuilds(m_Namespace, m_Bucket, Payload);
+ Stopwatch ExecutionTimer;
+ auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); });
+ JupiterResult ListResult = m_Session.ListBuilds(m_Namespace, m_Bucket, JsonQuery);
AddStatistic(ListResult);
if (!ListResult.Success)
{
diff --git a/src/zenremotestore/include/zenremotestore/builds/buildstorage.h b/src/zenremotestore/include/zenremotestore/builds/buildstorage.h
index 4b7e54d85..85dabc59f 100644
--- a/src/zenremotestore/include/zenremotestore/builds/buildstorage.h
+++ b/src/zenremotestore/include/zenremotestore/builds/buildstorage.h
@@ -34,7 +34,7 @@ public:
virtual ~BuildStorageBase() {}
virtual CbObject ListNamespaces(bool bRecursive = false) = 0;
- virtual CbObject ListBuilds(CbObject Query) = 0;
+ virtual CbObject ListBuilds(std::string_view JsonQuery) = 0;
virtual CbObject PutBuild(const Oid& BuildId, const CbObject& MetaData) = 0;
virtual CbObject GetBuild(const Oid& BuildId) = 0;
virtual void FinalizeBuild(const Oid& BuildId) = 0;
diff --git a/src/zenremotestore/include/zenremotestore/jupiter/jupitersession.h b/src/zenremotestore/include/zenremotestore/jupiter/jupitersession.h
index 15077376c..eaf6962fd 100644
--- a/src/zenremotestore/include/zenremotestore/jupiter/jupitersession.h
+++ b/src/zenremotestore/include/zenremotestore/jupiter/jupitersession.h
@@ -110,7 +110,7 @@ public:
JupiterResult ListBuildNamespaces();
JupiterResult ListBuildBuckets(std::string_view Namespace);
- JupiterResult ListBuilds(std::string_view Namespace, std::string_view BucketId, const IoBuffer& Payload);
+ JupiterResult ListBuilds(std::string_view Namespace, std::string_view BucketId, std::string_view JsonQuery);
JupiterResult PutBuild(std::string_view Namespace, std::string_view BucketId, const Oid& BuildId, const IoBuffer& Payload);
JupiterResult GetBuild(std::string_view Namespace, std::string_view BucketId, const Oid& BuildId);
JupiterResult FinalizeBuild(std::string_view Namespace, std::string_view BucketId, const Oid& BuildId);
diff --git a/src/zenremotestore/jupiter/jupitersession.cpp b/src/zenremotestore/jupiter/jupitersession.cpp
index dd0e5ad1f..1bc6564ce 100644
--- a/src/zenremotestore/jupiter/jupitersession.cpp
+++ b/src/zenremotestore/jupiter/jupitersession.cpp
@@ -430,9 +430,10 @@ JupiterSession::ListBuildBuckets(std::string_view Namespace)
}
JupiterResult
-JupiterSession::ListBuilds(std::string_view Namespace, std::string_view BucketId, const IoBuffer& Payload)
+JupiterSession::ListBuilds(std::string_view Namespace, std::string_view BucketId, std::string_view JsonQuery)
{
- ZEN_ASSERT(Payload.GetContentType() == ZenContentType::kCbObject);
+ IoBuffer Payload(IoBuffer::Wrap, JsonQuery.data(), JsonQuery.size());
+ Payload.SetContentType(ZenContentType::kJSON);
std::string OptionalBucketPath = BucketId.empty() ? "" : fmt::format("/{}", BucketId);
HttpClient::Response Response = m_HttpClient.Post(fmt::format("/api/v2/builds/{}{}/search", Namespace, OptionalBucketPath),
Payload,