diff options
| author | Dan Engelbrecht <[email protected]> | 2022-10-13 10:40:26 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-10-13 01:40:26 -0700 |
| commit | 0c7fbe43ed582cd791191d6c0935cd8693e1208e (patch) | |
| tree | 77757d193734f8927d474c5a072ffe4af8579513 | |
| parent | disable project store GC (#179) (diff) | |
| download | zen-0c7fbe43ed582cd791191d6c0935cd8693e1208e.tar.xz zen-0c7fbe43ed582cd791191d6c0935cd8693e1208e.zip | |
Add "Accept" field in RPC request to gracefully handle requests from older instances (#180)
| -rw-r--r-- | CHANGELOG.md | 3 | ||||
| -rw-r--r-- | zenserver-test/zenserver-test.cpp | 30 | ||||
| -rw-r--r-- | zenserver/cache/structuredcache.cpp | 118 | ||||
| -rw-r--r-- | zenserver/cache/structuredcache.h | 6 | ||||
| -rw-r--r-- | zenserver/upstream/upstreamcache.cpp | 4 | ||||
| -rw-r--r-- | zenutil/cache/cacherequests.cpp | 27 | ||||
| -rw-r--r-- | zenutil/include/zenutil/cache/cacherequests.h | 5 |
7 files changed, 160 insertions, 33 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index abe22c51b..73956912c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## -- Feature: Add GC to projects store. Checks path to project file in UE side to determine when a project may be GCd on the Zen side. +- Change: Responding with new wire format for RPC requests requires the requestor to add a `Accept` field in the request. This is to allow compatability with older clients for shared instances. +- Feature: [Disabled] Add GC to projects store. Checks path to project file in UE side to determine when a project may be GCd on the Zen side. ## v0.1.7 - Change: All RPC responses are now formatted using dedicated wire format, Zen server has fallback to enable compatability with legacy upstreams diff --git a/zenserver-test/zenserver-test.cpp b/zenserver-test/zenserver-test.cpp index 61c1e2df1..82b770e3c 100644 --- a/zenserver-test/zenserver-test.cpp +++ b/zenserver-test/zenserver-test.cpp @@ -1340,7 +1340,7 @@ TEST_CASE("zcache.rpc") ((uint32_t*)(KeyHash.Hash))[0] = Key; const zen::CacheKey CacheKey = zen::CacheKey::Create(Bucket, KeyHash); - cacherequests::PutCacheRecordsRequest Request = {.Namespace = std::string(Namespace)}; + cacherequests::PutCacheRecordsRequest Request = {.AcceptMagic = kCbPkgMagic, .Namespace = std::string(Namespace)}; AppendCacheRecord(Request, CacheKey, PayloadSize, CachePolicy::Default); OutKeys.push_back(CacheKey); @@ -1369,7 +1369,9 @@ TEST_CASE("zcache.rpc") std::string_view Namespace, std::span<zen::CacheKey> Keys, zen::CachePolicy Policy) -> GetCacheRecordResult { - cacherequests::GetCacheRecordsRequest Request = {.DefaultPolicy = Policy, .Namespace = std::string(Namespace)}; + cacherequests::GetCacheRecordsRequest Request = {.AcceptMagic = kCbPkgMagic, + .DefaultPolicy = Policy, + .Namespace = std::string(Namespace)}; for (const CacheKey& Key : Keys) { Request.Requests.push_back({.Key = Key}); @@ -1592,7 +1594,7 @@ TEST_CASE("zcache.failing.upstream") size_t PayloadSize = 8192) -> std::vector<CacheKey> { std::vector<zen::CacheKey> OutKeys; - cacherequests::PutCacheRecordsRequest Request = {.Namespace = std::string(Namespace)}; + cacherequests::PutCacheRecordsRequest Request = {.AcceptMagic = kCbPkgMagic, .Namespace = std::string(Namespace)}; for (size_t Key = 1; Key <= Num; ++Key) { zen::IoHash KeyHash; @@ -1631,7 +1633,9 @@ TEST_CASE("zcache.failing.upstream") std::string_view Namespace, std::span<zen::CacheKey> Keys, zen::CachePolicy Policy) -> GetCacheRecordResult { - cacherequests::GetCacheRecordsRequest Request = {.DefaultPolicy = Policy, .Namespace = std::string(Namespace)}; + cacherequests::GetCacheRecordsRequest Request = {.AcceptMagic = kCbPkgMagic, + .DefaultPolicy = Policy, + .Namespace = std::string(Namespace)}; for (const CacheKey& Key : Keys) { Request.Requests.push_back({.Key = Key}); @@ -2008,7 +2012,9 @@ TEST_CASE("zcache.rpc.allpolicies") // PutCacheRecords { CachePolicy BatchDefaultPolicy = CachePolicy::Default; - cacherequests::PutCacheRecordsRequest Request = {.DefaultPolicy = BatchDefaultPolicy, .Namespace = std::string(TestNamespace)}; + cacherequests::PutCacheRecordsRequest Request = {.AcceptMagic = kCbPkgMagic, + .DefaultPolicy = BatchDefaultPolicy, + .Namespace = std::string(TestNamespace)}; Request.Requests.reserve(PutRequests.size()); for (CachePutRequest& PutRequest : PutRequests) { @@ -2036,7 +2042,9 @@ TEST_CASE("zcache.rpc.allpolicies") { CachePolicy BatchDefaultPolicy = CachePolicy::Default; - cacherequests::PutCacheValuesRequest Request = {.DefaultPolicy = BatchDefaultPolicy, .Namespace = std::string(TestNamespace)}; + cacherequests::PutCacheValuesRequest Request = {.AcceptMagic = kCbPkgMagic, + .DefaultPolicy = BatchDefaultPolicy, + .Namespace = std::string(TestNamespace)}; Request.Requests.reserve(PutValueRequests.size()); for (CachePutValueRequest& PutRequest : PutValueRequests) { @@ -2073,7 +2081,9 @@ TEST_CASE("zcache.rpc.allpolicies") // GetCacheRecords { CachePolicy BatchDefaultPolicy = CachePolicy::Default; - cacherequests::GetCacheRecordsRequest Request = {.DefaultPolicy = BatchDefaultPolicy, .Namespace = std::string(TestNamespace)}; + cacherequests::GetCacheRecordsRequest Request = {.AcceptMagic = kCbPkgMagic, + .DefaultPolicy = BatchDefaultPolicy, + .Namespace = std::string(TestNamespace)}; Request.Requests.reserve(GetRequests.size()); for (CacheGetRequest& GetRequest : GetRequests) { @@ -2150,7 +2160,8 @@ TEST_CASE("zcache.rpc.allpolicies") { CachePolicy BatchDefaultPolicy = CachePolicy::Default; - cacherequests::GetCacheValuesRequest GetCacheValuesRequest = {.DefaultPolicy = BatchDefaultPolicy, + cacherequests::GetCacheValuesRequest GetCacheValuesRequest = {.AcceptMagic = kCbPkgMagic, + .DefaultPolicy = BatchDefaultPolicy, .Namespace = std::string(TestNamespace)}; GetCacheValuesRequest.Requests.reserve(GetValueRequests.size()); for (CacheGetValueRequest& GetRequest : GetValueRequests) @@ -2215,7 +2226,8 @@ TEST_CASE("zcache.rpc.allpolicies") return A.Key.Hash < B.Key.Hash; }); CachePolicy BatchDefaultPolicy = CachePolicy::Default; - cacherequests::GetCacheChunksRequest GetCacheChunksRequest = {.DefaultPolicy = BatchDefaultPolicy, + cacherequests::GetCacheChunksRequest GetCacheChunksRequest = {.AcceptMagic = kCbPkgMagic, + .DefaultPolicy = BatchDefaultPolicy, .Namespace = std::string(TestNamespace)}; GetCacheChunksRequest.Requests.reserve(ChunkRequests.size()); for (CacheGetChunkRequest& ChunkRequest : ChunkRequests) diff --git a/zenserver/cache/structuredcache.cpp b/zenserver/cache/structuredcache.cpp index 75fb8ac41..0e2462a4a 100644 --- a/zenserver/cache/structuredcache.cpp +++ b/zenserver/cache/structuredcache.cpp @@ -1159,12 +1159,13 @@ HttpStructuredCacheService::HandleRpcPutCacheRecords(zen::HttpServerRequest& Req { ZEN_TRACE_CPU("Z$::RpcPutCacheRecords"); CbObjectView BatchObject = BatchRequest.GetObject(); + ZEN_ASSERT(BatchObject["Method"sv].AsString() == "PutCacheRecords"sv); + + uint32_t AcceptMagic = BatchObject["Accept"sv].AsUInt32(); CbObjectView Params = BatchObject["Params"sv].AsObjectView(); CachePolicy DefaultPolicy; - ZEN_ASSERT(BatchObject["Method"sv].AsString() == "PutCacheRecords"sv); - std::string_view PolicyText = Params["DefaultPolicy"].AsString(); std::optional<std::string> Namespace = GetRpcRequestNamespace(Params); if (!Namespace) @@ -1211,9 +1212,20 @@ HttpStructuredCacheService::HandleRpcPutCacheRecords(zen::HttpServerRequest& Req CbPackage RpcResponse; RpcResponse.SetObject(ResponseObject.Save()); - CompositeBuffer RpcResponseBuffer = FormatPackageMessageBuffer(RpcResponse); + if (AcceptMagic == kCbPkgMagic) + { + CompositeBuffer RpcResponseBuffer = FormatPackageMessageBuffer(RpcResponse); + Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kCbPackage, RpcResponseBuffer); + } + else + { + BinaryWriter MemStream; + RpcResponse.Save(MemStream); - Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kCbPackage, RpcResponseBuffer); + Request.WriteResponse(HttpResponseCode::OK, + HttpContentType::kCbPackage, + IoBuffer(IoBuffer::Wrap, MemStream.GetData(), MemStream.GetSize())); + } } HttpStructuredCacheService::PutResult @@ -1302,9 +1314,12 @@ HttpStructuredCacheService::HandleRpcGetCacheRecords(zen::HttpServerRequest& Htt { ZEN_TRACE_CPU("Z$::RpcGetCacheRecords"); - CbObjectView Params = RpcRequest["Params"sv].AsObjectView(); ZEN_ASSERT(RpcRequest["Method"sv].AsString() == "GetCacheRecords"sv); + uint32_t AcceptMagic = RpcRequest["Accept"sv].AsUInt32(); + + CbObjectView Params = RpcRequest["Params"sv].AsObjectView(); + struct ValueRequestData { Oid ValueId; @@ -1632,9 +1647,20 @@ HttpStructuredCacheService::HandleRpcGetCacheRecords(zen::HttpServerRequest& Htt ResponseObject.EndArray(); ResponsePackage.SetObject(ResponseObject.Save()); - CompositeBuffer RpcResponseBuffer = FormatPackageMessageBuffer(ResponsePackage); + if (AcceptMagic == kCbPkgMagic) + { + CompositeBuffer RpcResponseBuffer = FormatPackageMessageBuffer(ResponsePackage); + HttpRequest.WriteResponse(HttpResponseCode::OK, HttpContentType::kCbPackage, RpcResponseBuffer); + } + else + { + BinaryWriter MemStream; + ResponsePackage.Save(MemStream); - HttpRequest.WriteResponse(HttpResponseCode::OK, HttpContentType::kCbPackage, RpcResponseBuffer); + HttpRequest.WriteResponse(HttpResponseCode::OK, + HttpContentType::kCbPackage, + IoBuffer(IoBuffer::Wrap, MemStream.GetData(), MemStream.GetSize())); + } } void @@ -1642,10 +1668,11 @@ HttpStructuredCacheService::HandleRpcPutCacheValues(zen::HttpServerRequest& Requ { ZEN_TRACE_CPU("Z$::RpcPutCacheValues"); CbObjectView BatchObject = BatchRequest.GetObject(); + ZEN_ASSERT(BatchObject["Method"sv].AsString() == "PutCacheValues"sv); - CbObjectView Params = BatchObject["Params"sv].AsObjectView(); + uint32_t AcceptMagic = BatchObject["Accept"sv].AsUInt32(); - ZEN_ASSERT(BatchObject["Method"sv].AsString() == "PutCacheValues"sv); + CbObjectView Params = BatchObject["Params"sv].AsObjectView(); std::string_view PolicyText = Params["DefaultPolicy"].AsString(); CachePolicy DefaultPolicy = !PolicyText.empty() ? ParseCachePolicy(PolicyText) : CachePolicy::Default; @@ -1742,9 +1769,20 @@ HttpStructuredCacheService::HandleRpcPutCacheValues(zen::HttpServerRequest& Requ CbPackage RpcResponse; RpcResponse.SetObject(ResponseObject.Save()); - CompositeBuffer RpcResponseBuffer = FormatPackageMessageBuffer(RpcResponse); + if (AcceptMagic == kCbPkgMagic) + { + CompositeBuffer RpcResponseBuffer = FormatPackageMessageBuffer(RpcResponse); + Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kCbPackage, RpcResponseBuffer); + } + else + { + BinaryWriter MemStream; + RpcResponse.Save(MemStream); - Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kCbPackage, RpcResponseBuffer); + Request.WriteResponse(HttpResponseCode::OK, + HttpContentType::kCbPackage, + IoBuffer(IoBuffer::Wrap, MemStream.GetData(), MemStream.GetSize())); + } } void @@ -1752,6 +1790,10 @@ HttpStructuredCacheService::HandleRpcGetCacheValues(zen::HttpServerRequest& Http { ZEN_TRACE_CPU("Z$::RpcGetCacheValues"); + ZEN_ASSERT(RpcRequest["Method"sv].AsString() == "GetCacheValues"sv); + + uint32_t AcceptMagic = RpcRequest["Accept"sv].AsUInt32(); + CbObjectView Params = RpcRequest["Params"sv].AsObjectView(); std::string_view PolicyText = Params["DefaultPolicy"sv].AsString(); CachePolicy DefaultPolicy = !PolicyText.empty() ? ParseCachePolicy(PolicyText) : CachePolicy::Default; @@ -1771,8 +1813,6 @@ HttpStructuredCacheService::HandleRpcGetCacheValues(zen::HttpServerRequest& Http }; std::vector<RequestData> Requests; - ZEN_ASSERT(RpcRequest["Method"sv].AsString() == "GetCacheValues"sv); - std::vector<size_t> RemoteRequestIndexes; for (CbFieldView RequestField : Params["Requests"sv]) @@ -1934,9 +1974,21 @@ HttpStructuredCacheService::HandleRpcGetCacheValues(zen::HttpServerRequest& Http ResponseObject.EndArray(); RpcResponse.SetObject(ResponseObject.Save()); - CompositeBuffer RpcResponseBuffer = FormatPackageMessageBuffer(RpcResponse); - HttpRequest.WriteResponse(HttpResponseCode::OK, HttpContentType::kCbPackage, RpcResponseBuffer); + if (AcceptMagic == kCbPkgMagic) + { + CompositeBuffer RpcResponseBuffer = FormatPackageMessageBuffer(RpcResponse); + HttpRequest.WriteResponse(HttpResponseCode::OK, HttpContentType::kCbPackage, RpcResponseBuffer); + } + else + { + BinaryWriter MemStream; + RpcResponse.Save(MemStream); + + HttpRequest.WriteResponse(HttpResponseCode::OK, + HttpContentType::kCbPackage, + IoBuffer(IoBuffer::Wrap, MemStream.GetData(), MemStream.GetSize())); + } } namespace cache::detail { @@ -1990,9 +2042,18 @@ HttpStructuredCacheService::HandleRpcGetCacheChunks(zen::HttpServerRequest& Http std::vector<ChunkRequest*> RecordRequests; // The ChunkRequests that are requesting a subvalue from a Record Key std::vector<ChunkRequest*> ValueRequests; // The ChunkRequests that are requesting a Value Key std::vector<CacheChunkRequest*> UpstreamChunks; // ChunkRequests that we need to send to the upstream + uint32_t AcceptMagic = 0; // Parse requests from the CompactBinary body of the RpcRequest and divide it into RecordRequests and ValueRequests - if (!ParseGetCacheChunksRequest(Namespace, RecordKeys, Records, RequestKeys, Requests, RecordRequests, ValueRequests, RpcRequest)) + if (!ParseGetCacheChunksRequest(AcceptMagic, + Namespace, + RecordKeys, + Records, + RequestKeys, + Requests, + RecordRequests, + ValueRequests, + RpcRequest)) { return HttpRequest.WriteResponse(HttpResponseCode::BadRequest); } @@ -2008,11 +2069,12 @@ HttpStructuredCacheService::HandleRpcGetCacheChunks(zen::HttpServerRequest& Http GetUpstreamCacheChunks(Namespace, UpstreamChunks, RequestKeys, Requests); // Send the payload and descriptive data about each chunk to the client - WriteGetCacheChunksResponse(Namespace, Requests, HttpRequest); + WriteGetCacheChunksResponse(AcceptMagic, Namespace, Requests, HttpRequest); } bool -HttpStructuredCacheService::ParseGetCacheChunksRequest(std::string& Namespace, +HttpStructuredCacheService::ParseGetCacheChunksRequest(uint32_t& AcceptMagic, + std::string& Namespace, std::vector<CacheKeyRequest>& RecordKeys, std::vector<cache::detail::RecordBody>& Records, std::vector<CacheChunkRequest>& RequestKeys, @@ -2025,6 +2087,8 @@ HttpStructuredCacheService::ParseGetCacheChunksRequest(std::string& Nam ZEN_ASSERT(RpcRequest["Method"sv].AsString() == "GetCacheChunks"sv); + AcceptMagic = RpcRequest["Accept"sv].AsUInt32(); + CbObjectView Params = RpcRequest["Params"sv].AsObjectView(); std::string_view DefaultPolicyText = Params["DefaultPolicy"sv].AsString(); CachePolicy DefaultPolicy = !DefaultPolicyText.empty() ? ParseCachePolicy(DefaultPolicyText) : CachePolicy::Default; @@ -2375,7 +2439,8 @@ HttpStructuredCacheService::GetUpstreamCacheChunks(std::string_view Names } void -HttpStructuredCacheService::WriteGetCacheChunksResponse(std::string_view Namespace, +HttpStructuredCacheService::WriteGetCacheChunksResponse(uint32_t AcceptMagic, + std::string_view Namespace, std::vector<cache::detail::ChunkRequest>& Requests, zen::HttpServerRequest& HttpRequest) { @@ -2438,9 +2503,20 @@ HttpStructuredCacheService::WriteGetCacheChunksResponse(std::string_view RpcResponse.SetObject(Writer.Save()); - CompositeBuffer RpcResponseBuffer = FormatPackageMessageBuffer(RpcResponse); + if (AcceptMagic == kCbPkgMagic) + { + CompositeBuffer RpcResponseBuffer = FormatPackageMessageBuffer(RpcResponse); + HttpRequest.WriteResponse(HttpResponseCode::OK, HttpContentType::kCbPackage, RpcResponseBuffer); + } + else + { + BinaryWriter MemStream; + RpcResponse.Save(MemStream); - HttpRequest.WriteResponse(HttpResponseCode::OK, HttpContentType::kCbPackage, RpcResponseBuffer); + HttpRequest.WriteResponse(HttpResponseCode::OK, + HttpContentType::kCbPackage, + IoBuffer(IoBuffer::Wrap, MemStream.GetData(), MemStream.GetSize())); + } } void diff --git a/zenserver/cache/structuredcache.h b/zenserver/cache/structuredcache.h index 8eca17edc..bda838dbc 100644 --- a/zenserver/cache/structuredcache.h +++ b/zenserver/cache/structuredcache.h @@ -117,7 +117,8 @@ private: PutResult PutCacheRecord(PutRequestData& Request, const CbPackage* Package); /** HandleRpcGetCacheChunks Helper: Parse the Body object into RecordValue Requests and Value Requests. */ - bool ParseGetCacheChunksRequest(std::string& Namespace, + bool ParseGetCacheChunksRequest(uint32_t& AcceptMagic, + std::string& Namespace, std::vector<CacheKeyRequest>& RecordKeys, std::vector<cache::detail::RecordBody>& Records, std::vector<CacheChunkRequest>& RequestKeys, @@ -141,7 +142,8 @@ private: std::vector<CacheChunkRequest>& RequestKeys, std::vector<cache::detail::ChunkRequest>& Requests); /** HandleRpcGetCacheChunks Helper: Send response message containing all chunk results. */ - void WriteGetCacheChunksResponse(std::string_view Namespace, + void WriteGetCacheChunksResponse(uint32_t AcceptMagic, + std::string_view Namespace, std::vector<cache::detail::ChunkRequest>& Requests, zen::HttpServerRequest& HttpRequest); diff --git a/zenserver/upstream/upstreamcache.cpp b/zenserver/upstream/upstreamcache.cpp index ac75285c7..f9673bcd6 100644 --- a/zenserver/upstream/upstreamcache.cpp +++ b/zenserver/upstream/upstreamcache.cpp @@ -860,6 +860,7 @@ namespace detail { CbObjectWriter BatchRequest; BatchRequest << "Method"sv << "GetCacheRecords"sv; + BatchRequest << "Accept"sv << kCbPkgMagic; BatchRequest.BeginObject("Params"sv); { @@ -982,6 +983,7 @@ namespace detail { CbObjectWriter BatchRequest; BatchRequest << "Method"sv << "GetCacheValues"sv; + BatchRequest << "Accept"sv << kCbPkgMagic; BatchRequest.BeginObject("Params"sv); { @@ -1101,6 +1103,7 @@ namespace detail { CbObjectWriter BatchRequest; BatchRequest << "Method"sv << "GetCacheChunks"sv; + BatchRequest << "Accept"sv << kCbPkgMagic; BatchRequest.BeginObject("Params"sv); { @@ -1289,6 +1292,7 @@ namespace detail { CbObjectWriter BatchWriter; BatchWriter << "Method"sv << "PutCacheValues"sv; + BatchWriter << "Accept"sv << kCbPkgMagic; BatchWriter.BeginObject("Params"sv); { diff --git a/zenutil/cache/cacherequests.cpp b/zenutil/cache/cacherequests.cpp index 2c14ef35b..0ac6c35ed 100644 --- a/zenutil/cache/cacherequests.cpp +++ b/zenutil/cache/cacherequests.cpp @@ -175,6 +175,7 @@ namespace cacherequests { { CbObjectView BatchObject = Package.GetObject(); ZEN_ASSERT(BatchObject["Method"].AsString() == "PutCacheRecords"); + AcceptMagic = BatchObject["AcceptType"].AsUInt32(0); CbObjectView Params = BatchObject["Params"].AsObjectView(); std::optional<std::string> RequestNamespace = GetRequestNamespace(Params); @@ -240,6 +241,11 @@ namespace cacherequests { CbObjectWriter Writer; Writer << "Method" << "PutCacheRecords"; + if (AcceptMagic != 0) + { + Writer << "Accept" << AcceptMagic; + } + Writer.BeginObject("Params"); { Writer << "DefaultPolicy" << WriteToString<128>(DefaultPolicy); @@ -325,6 +331,7 @@ namespace cacherequests { bool GetCacheRecordsRequest::Parse(const CbObjectView& RpcRequest) { ZEN_ASSERT(RpcRequest["Method"].AsString() == "GetCacheRecords"); + AcceptMagic = RpcRequest["AcceptType"].AsUInt32(0); CbObjectView Params = RpcRequest["Params"].AsObjectView(); std::optional<std::string> RequestNamespace = GetRequestNamespace(Params); @@ -361,6 +368,11 @@ namespace cacherequests { { Writer << "Method" << "GetCacheRecords"; + if (AcceptMagic != 0) + { + Writer << "Accept" << AcceptMagic; + } + Writer.BeginObject("Params"); { Writer << "DefaultPolicy" << WriteToString<128>(DefaultPolicy); @@ -513,6 +525,7 @@ namespace cacherequests { { CbObjectView BatchObject = Package.GetObject(); ZEN_ASSERT(BatchObject["Method"].AsString() == "PutCacheValues"); + AcceptMagic = BatchObject["AcceptType"].AsUInt32(0); CbObjectView Params = BatchObject["Params"].AsObjectView(); std::optional<std::string> RequestNamespace = cacherequests::GetRequestNamespace(Params); @@ -558,6 +571,10 @@ namespace cacherequests { CbObjectWriter Writer; Writer << "Method" << "PutCacheValues"; + if (AcceptMagic != 0) + { + Writer << "Accept" << AcceptMagic; + } Writer.BeginObject("Params"); { @@ -637,6 +654,7 @@ namespace cacherequests { bool GetCacheValuesRequest::Parse(const CbObjectView& BatchObject) { ZEN_ASSERT(BatchObject["Method"].AsString() == "GetCacheValues"); + AcceptMagic = BatchObject["AcceptType"].AsUInt32(0); CbObjectView Params = BatchObject["Params"].AsObjectView(); std::optional<std::string> RequestNamespace = cacherequests::GetRequestNamespace(Params); @@ -672,6 +690,10 @@ namespace cacherequests { CbObjectWriter Writer; Writer << "Method" << "GetCacheValues"; + if (AcceptMagic != 0) + { + Writer << "Accept" << AcceptMagic; + } Writer.BeginObject("Params"); { @@ -793,6 +815,7 @@ namespace cacherequests { bool GetCacheChunksRequest::Parse(const CbObjectView& BatchObject) { ZEN_ASSERT(BatchObject["Method"].AsString() == "GetCacheChunks"); + AcceptMagic = BatchObject["AcceptType"].AsUInt32(0); CbObjectView Params = BatchObject["Params"].AsObjectView(); std::optional<std::string> RequestNamespace = cacherequests::GetRequestNamespace(Params); @@ -833,6 +856,10 @@ namespace cacherequests { CbObjectWriter Writer; Writer << "Method" << "GetCacheChunks"; + if (AcceptMagic != 0) + { + Writer << "Accept" << AcceptMagic; + } Writer.BeginObject("Params"); { diff --git a/zenutil/include/zenutil/cache/cacherequests.h b/zenutil/include/zenutil/cache/cacherequests.h index ffb0f8d5f..4eebd3121 100644 --- a/zenutil/include/zenutil/cache/cacherequests.h +++ b/zenutil/include/zenutil/cache/cacherequests.h @@ -74,6 +74,7 @@ namespace cacherequests { struct PutCacheRecordsRequest { + uint32_t AcceptMagic = 0; CachePolicy DefaultPolicy = CachePolicy::Default; std::string Namespace; std::vector<PutCacheRecordRequest> Requests; @@ -105,6 +106,7 @@ namespace cacherequests { struct GetCacheRecordsRequest { + uint32_t AcceptMagic = 0; CachePolicy DefaultPolicy = CachePolicy::Default; std::string Namespace; std::vector<GetCacheRecordRequest> Requests; @@ -150,6 +152,7 @@ namespace cacherequests { struct PutCacheValuesRequest { + uint32_t AcceptMagic = 0; CachePolicy DefaultPolicy = CachePolicy::Default; std::string Namespace; std::vector<PutCacheValueRequest> Requests; @@ -177,6 +180,7 @@ namespace cacherequests { struct GetCacheValuesRequest { + uint32_t AcceptMagic = 0; CachePolicy DefaultPolicy = CachePolicy::Default; std::string Namespace; std::vector<GetCacheValueRequest> Requests; @@ -217,6 +221,7 @@ namespace cacherequests { struct GetCacheChunksRequest { + uint32_t AcceptMagic = 0; CachePolicy DefaultPolicy = CachePolicy::Default; std::string Namespace; std::vector<GetCacheChunkRequest> Requests; |