diff options
| author | Stefan Boberg <[email protected]> | 2021-10-03 17:02:10 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-10-03 17:02:10 +0200 |
| commit | 4695fd893e5ad2d793c79e8cde9cb0673760893b (patch) | |
| tree | 98e35749ab4047c804dbb95fbbd81e7efd31c356 | |
| parent | structurec cache: Added ad hoc special case for /z$/stats.json request (diff) | |
| parent | Added support for SkipData cache policy. (diff) | |
| download | zen-4695fd893e5ad2d793c79e8cde9cb0673760893b.tar.xz zen-4695fd893e5ad2d793c79e8cde9cb0673760893b.zip | |
Merged from upstream
| -rw-r--r-- | zenhttp/httpserver.cpp | 4 | ||||
| -rw-r--r-- | zenserver-test/zenserver-test.cpp | 106 | ||||
| -rw-r--r-- | zenserver/cache/structuredcache.cpp | 27 |
3 files changed, 122 insertions, 15 deletions
diff --git a/zenhttp/httpserver.cpp b/zenhttp/httpserver.cpp index 58f6858a8..193426ed2 100644 --- a/zenhttp/httpserver.cpp +++ b/zenhttp/httpserver.cpp @@ -76,6 +76,7 @@ static constinit uint32_t HashCompactBinaryPackageOffer = HashStringDjb2("applic static constinit uint32_t HashCompressedBinary = HashStringDjb2("application/x-ue-comp"sv); static constinit uint32_t HashJson = HashStringDjb2("json"sv); static constinit uint32_t HashYaml = HashStringDjb2("yaml"sv); +static constinit uint32_t HashHtml = HashStringDjb2("text/html"sv); std::once_flag InitContentTypeLookup; @@ -94,7 +95,8 @@ struct HashedTypeEntry {HashYaml, HttpContentType::kYAML}, {HashApplicationYaml, HttpContentType::kYAML}, {HashText, HttpContentType::kText}, - {HashCompressedBinary, HttpContentType::kCompressedBinary} + {HashCompressedBinary, HttpContentType::kCompressedBinary}, + {HashHtml, HttpContentType::kHTML}, // clang-format on }; diff --git a/zenserver-test/zenserver-test.cpp b/zenserver-test/zenserver-test.cpp index 0e5e73ffc..fe21aa834 100644 --- a/zenserver-test/zenserver-test.cpp +++ b/zenserver-test/zenserver-test.cpp @@ -1448,16 +1448,21 @@ TEST_CASE("zcache.policy") return Buf; }; - auto GeneratePackage = [](zen::IoHash& OutAttachmentKey) -> zen::CbPackage { + auto GeneratePackage = [](zen::IoHash& OutRecordKey, zen::IoHash& OutAttachmentKey) -> zen::CbPackage { auto Data = zen::SharedBuffer::Clone(zen::MakeMemoryView<uint8_t>({1, 2, 3, 4, 5, 6, 7, 8, 9})); auto CompressedData = zen::CompressedBuffer::Compress(Data); OutAttachmentKey = zen::IoHash::FromBLAKE3(CompressedData.GetRawHash()); - zen::CbWriter Obj; - Obj.BeginObject("obj"sv); - Obj.AddBinaryAttachment("data", OutAttachmentKey); - Obj.EndObject(); + + zen::CbWriter Writer; + Writer.BeginObject("obj"sv); + Writer.AddBinaryAttachment("data", OutAttachmentKey); + Writer.EndObject(); + CbObject CacheRecord = Writer.Save().AsObject(); + + OutRecordKey = IoHash::HashBuffer(CacheRecord.GetBuffer().GetView()); + zen::CbPackage Package; - Package.SetObject(Obj.Save().AsObject()); + Package.SetObject(CacheRecord); Package.AddAttachment(zen::CbAttachment(CompressedData)); return Package; @@ -1587,7 +1592,8 @@ TEST_CASE("zcache.policy") LocalCfg.Spawn(LocalInst); zen::IoHash Key; - zen::CbPackage Package = GeneratePackage(Key); + zen::IoHash PayloadId; + zen::CbPackage Package = GeneratePackage(Key, PayloadId); auto Buf = ToBuffer(Package); // Store package upstream @@ -1623,7 +1629,8 @@ TEST_CASE("zcache.policy") LocalCfg.Spawn(LocalInst); zen::IoHash Key; - zen::CbPackage Package = GeneratePackage(Key); + zen::IoHash PayloadId; + zen::CbPackage Package = GeneratePackage(Key, PayloadId); auto Buf = ToBuffer(Package); // Store packge locally @@ -1659,7 +1666,8 @@ TEST_CASE("zcache.policy") LocalCfg.Spawn(LocalInst); zen::IoHash Key; - zen::CbPackage Package = GeneratePackage(Key); + zen::IoHash PayloadId; + zen::CbPackage Package = GeneratePackage(Key, PayloadId); auto Buf = ToBuffer(Package); // Store package locally and upstream @@ -1692,7 +1700,8 @@ TEST_CASE("zcache.policy") LocalCfg.Spawn(LocalInst); zen::IoHash Key; - zen::CbPackage Package = GeneratePackage(Key); + zen::IoHash PayloadId; + zen::CbPackage Package = GeneratePackage(Key, PayloadId); auto Buf = ToBuffer(Package); // Store package locally @@ -1748,7 +1757,8 @@ TEST_CASE("zcache.policy") LocalCfg.Spawn(LocalInst); zen::IoHash Key; - zen::CbPackage Package = GeneratePackage(Key); + zen::IoHash PayloadId; + zen::CbPackage Package = GeneratePackage(Key, PayloadId); auto Buf = ToBuffer(Package); // Store package upstream @@ -1791,6 +1801,80 @@ TEST_CASE("zcache.policy") CHECK(Package.GetAttachments().size() != 0); } } + + SUBCASE("skip - 'data' returns empty cache record/payload") + { + ZenConfig Cfg = ZenConfig::New(); + ZenServerInstance Instance(TestEnv); + const auto Bucket = "test"sv; + + Cfg.Spawn(Instance); + + zen::IoHash Key; + zen::IoHash PayloadId; + zen::CbPackage Package = GeneratePackage(Key, PayloadId); + auto Buf = ToBuffer(Package); + + // Store package + { + cpr::Response Result = cpr::Put(cpr::Url{"{}/{}/{}"_format(Cfg.BaseUri, Bucket, Key)}, + cpr::Body{(const char*)Buf.GetData(), Buf.GetSize()}, + cpr::Header{{"Content-Type", "application/x-ue-cbpkg"}}); + CHECK(Result.status_code == 201); + } + + // Get package + { + cpr::Response Result = cpr::Get(cpr::Url{"{}/{}/{}?skip=data"_format(Cfg.BaseUri, Bucket, Key)}, + cpr::Header{{"Accept", "application/x-ue-cbpkg"}}); + CHECK(Result.status_code == 200); + CHECK(Result.text.size() == 0); + } + + // Get record + { + cpr::Response Result = cpr::Get(cpr::Url{"{}/{}/{}?skip=data"_format(Cfg.BaseUri, Bucket, Key)}, + cpr::Header{{"Accept", "application/x-ue-cbobject"}}); + CHECK(Result.status_code == 200); + CHECK(Result.text.size() == 0); + } + + // Get payload + { + cpr::Response Result = cpr::Get(cpr::Url{"{}/{}/{}/{}?skip=data"_format(Cfg.BaseUri, Bucket, Key, PayloadId)}, + cpr::Header{{"Accept", "application/x-ue-comp"}}); + CHECK(Result.status_code == 200); + CHECK(Result.text.size() == 0); + } + } + + SUBCASE("skip - 'data' returns empty binary value") + { + ZenConfig Cfg = ZenConfig::New(); + ZenServerInstance Instance(TestEnv); + const auto Bucket = "test"sv; + + Cfg.Spawn(Instance); + + zen::IoHash Key; + auto BinaryValue = GenerateData(1024, Key); + + // Store binary cache value + { + cpr::Response Result = cpr::Put(cpr::Url{"{}/{}/{}"_format(Cfg.BaseUri, Bucket, Key)}, + cpr::Body{(const char*)BinaryValue.GetData(), BinaryValue.GetSize()}, + cpr::Header{{"Content-Type", "application/octet-stream"}}); + CHECK(Result.status_code == 201); + } + + // Get package + { + cpr::Response Result = cpr::Get(cpr::Url{"{}/{}/{}?skip=data"_format(Cfg.BaseUri, Bucket, Key)}, + cpr::Header{{"Accept", "application/octet-stream"}}); + CHECK(Result.status_code == 200); + CHECK(Result.text.size() == 0); + } + } } struct RemoteExecutionRequest diff --git a/zenserver/cache/structuredcache.cpp b/zenserver/cache/structuredcache.cpp index d7b409c6c..42e1d93dd 100644 --- a/zenserver/cache/structuredcache.cpp +++ b/zenserver/cache/structuredcache.cpp @@ -420,10 +420,17 @@ HttpStructuredCacheService::HandleGetCacheRecord(zen::HttpServerRequest& Request if (ValidationResult != CbValidateError::None) { ZEN_WARN("GET - '{}/{}' '{}' FAILED, invalid compact binary object", Ref.BucketSegment, Ref.HashKey, ToString(AcceptType)); + m_CacheStats.MissCount++; return Request.WriteResponse(HttpResponseCode::NotFound, HttpContentType::kText, "Invalid cache record"sv); } - const bool SkipAttachments = zen::CachePolicy::SkipAttachments == (Policy & zen::CachePolicy::SkipAttachments); + if ((Policy & CachePolicy::SkipData) == CachePolicy::SkipData) + { + m_CacheStats.HitCount++; + return Request.WriteResponse(HttpResponseCode::OK); + } + + const bool SkipAttachments = (Policy & CachePolicy::SkipAttachments) == CachePolicy::SkipAttachments; uint32_t AttachmentCount = 0; uint32_t ValidCount = 0; uint64_t AttachmentBytes = 0ull; @@ -489,7 +496,14 @@ HttpStructuredCacheService::HandleGetCacheRecord(zen::HttpServerRequest& Request m_CacheStats.UpstreamHitCount++; } - Request.WriteResponse(HttpResponseCode::OK, Value.Value.GetContentType(), Value.Value); + if ((Policy & CachePolicy::SkipData) == CachePolicy::SkipData) + { + Request.WriteResponse(HttpResponseCode::OK); + } + else + { + Request.WriteResponse(HttpResponseCode::OK, Value.Value.GetContentType(), Value.Value); + } } } @@ -742,7 +756,14 @@ HttpStructuredCacheService::HandleGetCachePayload(zen::HttpServerRequest& Reques m_CacheStats.UpstreamHitCount++; } - Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kBinary, Payload); + if ((Policy & CachePolicy::SkipData) == CachePolicy::SkipData) + { + Request.WriteResponse(HttpResponseCode::OK); + } + else + { + Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kBinary, Payload); + } } void |