diff options
Diffstat (limited to 'zenserver')
| -rw-r--r-- | zenserver/cache/structuredcache.cpp | 90 | ||||
| -rw-r--r-- | zenserver/casstore.cpp | 48 | ||||
| -rw-r--r-- | zenserver/compute/apply.cpp | 4 | ||||
| -rw-r--r-- | zenserver/projectstore.cpp | 10 | ||||
| -rw-r--r-- | zenserver/upstream/upstreamcache.cpp | 10 | ||||
| -rw-r--r-- | zenserver/upstream/zen.cpp | 5 | ||||
| -rw-r--r-- | zenserver/windows/service.cpp | 33 |
7 files changed, 88 insertions, 112 deletions
diff --git a/zenserver/cache/structuredcache.cpp b/zenserver/cache/structuredcache.cpp index 3ac1ec37f..74cee6614 100644 --- a/zenserver/cache/structuredcache.cpp +++ b/zenserver/cache/structuredcache.cpp @@ -290,9 +290,7 @@ HttpStructuredCacheService::HandleGetCacheRecord(zen::HttpServerRequest& Request if (QueryUpstream) { - const ZenContentType CacheRecordType = Ref.BucketSegment == "legacy"sv ? ZenContentType::kBinary - : AcceptType == ZenContentType::kCbPackage ? ZenContentType::kCbPackage - : ZenContentType::kCbObject; + const ZenContentType CacheRecordType = AcceptType; if (auto UpstreamResult = m_UpstreamCache->GetCacheRecord({Ref.BucketSegment, Ref.HashKey}, CacheRecordType); UpstreamResult.Success) @@ -321,9 +319,10 @@ HttpStructuredCacheService::HandleGetCacheRecord(zen::HttpServerRequest& Request else { Success = false; - ZEN_WARN("Get - cache record '{}/{}' FAILED, invalid compact binary object from upstream", + ZEN_WARN("Get - '{}/{}' '{}' FAILED, invalid compact binary object from upstream", Ref.BucketSegment, - Ref.HashKey); + Ref.HashKey, + ToString(AcceptType)); } } @@ -353,9 +352,10 @@ HttpStructuredCacheService::HandleGetCacheRecord(zen::HttpServerRequest& Request } else { - ZEN_WARN("GET - cache record '{}/{}' FAILED, upstream attachment not compressed", + ZEN_WARN("Get - '{}/{}' '{}' FAILED, upstream attachment not compressed", Ref.BucketSegment, - Ref.HashKey); + Ref.HashKey, + ToString(ZenContentType::kCbPackage)); } } AttachmentCount++; @@ -370,9 +370,8 @@ HttpStructuredCacheService::HandleGetCacheRecord(zen::HttpServerRequest& Request CbPackage PackageWithoutAttachments; PackageWithoutAttachments.SetObject(CacheRecord); - MemoryOutStream MemStream; - BinaryWriter Writer(MemStream); - PackageWithoutAttachments.Save(Writer); + BinaryWriter MemStream; + PackageWithoutAttachments.Save(MemStream); Value.Value = IoBuffer(IoBuffer::Clone, MemStream.Data(), MemStream.Size()); } @@ -380,15 +379,16 @@ HttpStructuredCacheService::HandleGetCacheRecord(zen::HttpServerRequest& Request else { Success = false; - ZEN_WARN("GET - cache record '{}/{}' FAILED, attachments missing in upstream package", + ZEN_WARN("Get - '{}/{}' '{}' FAILED, attachments missing in upstream package", Ref.BucketSegment, - Ref.HashKey); + Ref.HashKey, + ToString(AcceptType)); } } else { Success = false; - ZEN_WARN("GET - cache record '{}/{}' FAILED, invalid upstream package", Ref.BucketSegment, Ref.HashKey); + ZEN_WARN("Get - '{}/{}' '{}' FAILED, invalid upstream package", Ref.BucketSegment, Ref.HashKey, ToString(AcceptType)); } } } @@ -396,8 +396,7 @@ HttpStructuredCacheService::HandleGetCacheRecord(zen::HttpServerRequest& Request if (!Success) { - ZEN_DEBUG("MISS - '{}/{}'", Ref.BucketSegment, Ref.HashKey); - + ZEN_DEBUG("MISS - '{}/{}' '{}'", Ref.BucketSegment, Ref.HashKey, ToString(AcceptType)); return Request.WriteResponse(HttpResponseCode::NotFound); } @@ -409,7 +408,7 @@ HttpStructuredCacheService::HandleGetCacheRecord(zen::HttpServerRequest& Request if (ValidationResult != CbValidateError::None) { - ZEN_WARN("GET - cache record '{}/{}' FAILED, invalid compact binary object", Ref.BucketSegment, Ref.HashKey); + ZEN_WARN("GET - '{}/{}' '{}' FAILED, invalid compact binary object", Ref.BucketSegment, Ref.HashKey, ToString(AcceptType)); return Request.WriteResponse(HttpResponseCode::NotFound, HttpContentType::kText, "Invalid cache record"sv); } @@ -435,9 +434,10 @@ HttpStructuredCacheService::HandleGetCacheRecord(zen::HttpServerRequest& Request if (ValidCount != AttachmentCount) { - ZEN_WARN("GET - cache record '{}/{}' FAILED, found '{}' of '{}' attachments", + ZEN_WARN("GET - '{}/{}' '{}' FAILED, found '{}' of '{}' attachments", Ref.BucketSegment, Ref.HashKey, + ToString(AcceptType), ValidCount, AttachmentCount); @@ -447,15 +447,15 @@ HttpStructuredCacheService::HandleGetCacheRecord(zen::HttpServerRequest& Request Package.SetObject(LoadCompactBinaryObject(Value.Value)); - ZEN_DEBUG("HIT - '{}/{}' {}, {} attachments (LOCAL)", + ZEN_DEBUG("HIT - '{}/{}' {} '{}', {} attachments (LOCAL)", Ref.BucketSegment, Ref.HashKey, NiceBytes(AttachmentBytes + Value.Value.Size()), + ToString(HttpContentType::kCbPackage), AttachmentCount); - MemoryOutStream MemStream; - BinaryWriter Writer(MemStream); - Package.Save(Writer); + BinaryWriter MemStream; + Package.Save(MemStream); IoBuffer Response(IoBuffer::Clone, MemStream.Data(), MemStream.Size()); @@ -463,10 +463,11 @@ HttpStructuredCacheService::HandleGetCacheRecord(zen::HttpServerRequest& Request } else { - ZEN_DEBUG("HIT - '{}/{}' {} ({})", + ZEN_DEBUG("HIT - '{}/{}' {} '{}' ({})", Ref.BucketSegment, Ref.HashKey, NiceBytes(Value.Value.Size()), + ToString(Value.Value.GetContentType()), InUpstreamCache ? "UPSTREAM" : "LOCAL"); Request.WriteResponse(HttpResponseCode::OK, Value.Value.GetContentType(), Value.Value); @@ -486,10 +487,12 @@ HttpStructuredCacheService::HandlePutCacheRecord(zen::HttpServerRequest& Request const HttpContentType ContentType = Request.RequestContentType(); const bool StoreUpstream = m_UpstreamCache && (CachePolicy::StoreRemote == (Policy & CachePolicy::StoreRemote)); - if (ContentType == HttpContentType::kBinary || ContentType == HttpContentType::kUnknownContentType) + Body.SetContentType(ContentType); + + if (ContentType == HttpContentType::kBinary) { + ZEN_DEBUG("PUT - '{}/{}' {} '{}'", Ref.BucketSegment, Ref.HashKey, NiceBytes(Body.Size()), ToString(ContentType)); m_CacheStore.Put(Ref.BucketSegment, Ref.HashKey, {.Value = Body}); - ZEN_DEBUG("PUT - binary '{}/{}' {}", Ref.BucketSegment, Ref.HashKey, NiceBytes(Body.Size())); if (StoreUpstream) { @@ -505,7 +508,7 @@ HttpStructuredCacheService::HandlePutCacheRecord(zen::HttpServerRequest& Request if (ValidationResult != CbValidateError::None) { - ZEN_WARN("PUT - cache record '{}/{}' ({} bytes) FAILED, invalid compact binary", Ref.BucketSegment, Ref.HashKey, Body.Size()); + ZEN_WARN("PUT - '{}/{}' '{}' FAILED, invalid compact binary", Ref.BucketSegment, Ref.HashKey, ToString(ContentType)); return Request.WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "Compact binary validation failed"sv); } @@ -527,7 +530,13 @@ HttpStructuredCacheService::HandlePutCacheRecord(zen::HttpServerRequest& Request if (ValidCacheRecord) { - ZEN_DEBUG("PUT - cache record '{}/{}' {}, {} attachments", Ref.BucketSegment, Ref.HashKey, NiceBytes(Body.Size()), ValidCount); + ZEN_DEBUG("PUT - '{}/{}' {} '{}', {} attachments", + Ref.BucketSegment, + Ref.HashKey, + NiceBytes(Body.Size()), + ToString(ContentType), + ValidCount); + m_CacheStore.Put(Ref.BucketSegment, Ref.HashKey, {.Value = Body}); if (StoreUpstream) @@ -542,9 +551,10 @@ HttpStructuredCacheService::HandlePutCacheRecord(zen::HttpServerRequest& Request } else { - ZEN_WARN("PUT - cache record '{}/{}' FAILED, found {}/{} attachments", + ZEN_WARN("PUT - '{}/{}' '{}' FAILED, found {}/{} attachments", Ref.BucketSegment, Ref.HashKey, + ToString(ContentType), ValidCount, AttachmentCount); @@ -557,7 +567,7 @@ HttpStructuredCacheService::HandlePutCacheRecord(zen::HttpServerRequest& Request if (!Package.TryLoad(Body)) { - ZEN_WARN("PUT - cache record '{}/{}' FAILED, invalid package", Ref.BucketSegment, Ref.HashKey); + ZEN_WARN("PUT - '{}/{}' '{}' FAILED, invalid package", Ref.BucketSegment, Ref.HashKey, ToString(ContentType)); return Request.WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "Invalid package"sv); } @@ -586,17 +596,19 @@ HttpStructuredCacheService::HandlePutCacheRecord(zen::HttpServerRequest& Request } else { - ZEN_WARN("PUT - cache record '{}/{}' FAILED, attachment '{}' is not compressed", + ZEN_WARN("PUT - '{}/{}' '{}' FAILED, attachment '{}' is not compressed", Ref.BucketSegment, Ref.HashKey, + ToString(HttpContentType::kCbPackage), AttachmentHash.AsHash()); } } else { - ZEN_WARN("PUT - cache record '{}/{}' FAILED, missing attachment '{}'", + ZEN_WARN("PUT - '{}/{}' '{}' FAILED, missing attachment '{}'", Ref.BucketSegment, Ref.HashKey, + ToString(HttpContentType::kCbPackage), AttachmentHash.AsHash()); } }); @@ -608,13 +620,17 @@ HttpStructuredCacheService::HandlePutCacheRecord(zen::HttpServerRequest& Request return Request.WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "Invalid attachments"sv); } - ZEN_DEBUG("PUT - cache record '{}/{}' {}, {}/{} new attachments", + ZEN_DEBUG("PUT - '{}/{}' {} '{}', {}/{} new attachments", Ref.BucketSegment, Ref.HashKey, NiceBytes(Body.GetSize()), + ToString(ContentType), NewAttachmentCount, Attachments.size()); + IoBuffer CacheRecordValue = CacheRecord.GetBuffer().AsIoBuffer(); + CacheRecordValue.SetContentType(ZenContentType::kCbObject); + m_CacheStore.Put(Ref.BucketSegment, Ref.HashKey, {.Value = CacheRecord.GetBuffer().AsIoBuffer()}); if (StoreUpstream) @@ -629,7 +645,7 @@ HttpStructuredCacheService::HandlePutCacheRecord(zen::HttpServerRequest& Request } else { - Request.WriteResponse(HttpResponseCode::BadRequest); + return Request.WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "Content-Type invalid"sv); } } @@ -692,12 +708,12 @@ HttpStructuredCacheService::HandleGetCachePayload(zen::HttpServerRequest& Reques return Request.WriteResponse(HttpResponseCode::NotFound); } - ZEN_DEBUG("HIT - '{}/{}/{}' {} (type: {}) ({})", + ZEN_DEBUG("HIT - '{}/{}/{}' {} '{}' ({})", Ref.BucketSegment, Ref.HashKey, Ref.PayloadId, NiceBytes(Payload.Size()), - Payload.GetContentType(), + ToString(Payload.GetContentType()), InUpstreamCache ? "UPSTREAM" : "LOCAL"); Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kBinary, Payload); @@ -716,6 +732,8 @@ HttpStructuredCacheService::HandlePutCachePayload(zen::HttpServerRequest& Reques return Request.WriteResponse(HttpResponseCode::BadRequest); } + Body.SetContentType(Request.RequestContentType()); + IoHash ChunkHash = IoHash::HashBuffer(Body); CompressedBuffer Compressed = CompressedBuffer::FromCompressed(SharedBuffer(Body)); @@ -733,12 +751,12 @@ HttpStructuredCacheService::HandlePutCachePayload(zen::HttpServerRequest& Reques m_CidStore.AddCompressedCid(Ref.PayloadId, ChunkHash); - ZEN_DEBUG("PUT - payload '{}/{}/{}' {} (type: {}) {}", + ZEN_DEBUG("PUT - '{}/{}/{}' {} '{}' ({})", Ref.BucketSegment, Ref.HashKey, Ref.PayloadId, NiceBytes(Body.Size()), - Body.GetContentType(), + ToString(Body.GetContentType()), Result.New ? "NEW" : "OLD"); const HttpResponseCode ResponseCode = Result.New ? HttpResponseCode::Created : HttpResponseCode::OK; diff --git a/zenserver/casstore.cpp b/zenserver/casstore.cpp index b36dcc09f..88525bd36 100644 --- a/zenserver/casstore.cpp +++ b/zenserver/casstore.cpp @@ -2,8 +2,8 @@ #include "casstore.h" +#include <zencore/fmtutils.h> #include <zencore/logging.h> -#include <zencore/streamutil.h> #include <gsl/gsl-lite.hpp> @@ -14,52 +14,6 @@ HttpCasService::HttpCasService(CasStore& Store) : m_CasStore(Store) m_Router.AddPattern("cas", "([0-9A-Fa-f]{40})"); m_Router.RegisterRoute( - "batch", - [this](HttpRouterRequest& Req) { - HttpServerRequest& ServerRequest = Req.ServerRequest(); - - IoBuffer Payload = ServerRequest.ReadPayload(); - uint64_t EntryCount = Payload.Size() / sizeof(IoHash); - - if ((EntryCount * sizeof(IoHash)) != Payload.Size()) - { - return ServerRequest.WriteResponse(HttpResponseCode::BadRequest); - } - - const IoHash* Hashes = reinterpret_cast<const IoHash*>(Payload.Data()); - std::vector<IoBuffer> Values; - - MemoryOutStream HeaderStream; - BinaryWriter HeaderWriter(HeaderStream); - - Values.emplace_back(); // Placeholder for header - - // Build response header - HeaderWriter << uint32_t(0x12340000) << uint32_t(0); - - for (uint64_t i = 0; i < EntryCount; ++i) - { - IoHash ChunkHash = Hashes[i]; - IoBuffer Value = m_CasStore.FindChunk(ChunkHash); - - if (Value) - { - Values.emplace_back(std::move(Value)); - HeaderWriter << ChunkHash << uint64_t(Value.Size()); - } - } - - // Make real header - - const_cast<uint32_t*>(reinterpret_cast<const uint32_t*>(HeaderStream.Data()))[1] = uint32_t(Values.size() - 1); - - Values[0] = IoBufferBuilder::MakeCloneFromMemory(HeaderStream.Data(), HeaderStream.Size()); - - ServerRequest.WriteResponse(HttpResponseCode::OK, HttpContentType::kBinary, Values); - }, - HttpVerb::kPost); - - m_Router.RegisterRoute( "{cas}", [this](HttpRouterRequest& Req) { IoHash Hash = IoHash::FromHexString(Req.GetCapture(1)); diff --git a/zenserver/compute/apply.cpp b/zenserver/compute/apply.cpp index 15d9e0141..a522aa35b 100644 --- a/zenserver/compute/apply.cpp +++ b/zenserver/compute/apply.cpp @@ -767,8 +767,8 @@ HttpFunctionService::ExecAction(const WorkerDesc& Worker, CbObject Action) lpThreadAttributes, bInheritHandles, dwCreationFlags, - nullptr, // (LPVOID)EnvironmentBlock.c_str(), // Environment block - SandboxPath.c_str(), // Current directory + (LPVOID)EnvironmentBlock.Data(), // Environment block + SandboxPath.c_str(), // Current directory &StartupInfo, /* out */ &ProcessInformation); diff --git a/zenserver/projectstore.cpp b/zenserver/projectstore.cpp index 1f4239b23..1a9eb2c67 100644 --- a/zenserver/projectstore.cpp +++ b/zenserver/projectstore.cpp @@ -635,8 +635,7 @@ ProjectStore::Project::Read() void ProjectStore::Project::Write() { - MemoryOutStream Mem; - BinaryWriter Writer(Mem); + BinaryWriter Mem; CbObjectWriter Cfg; Cfg << "id" << Identifier; @@ -644,7 +643,7 @@ ProjectStore::Project::Write() Cfg << "project" << ProjectRootDir; Cfg << "engine" << EngineRootDir; - Cfg.Save(Writer); + Cfg.Save(Mem); CreateDirectories(m_OplogStoragePath); @@ -951,9 +950,8 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) // Parse Request - IoBuffer Payload = HttpReq.ReadPayload(); - MemoryInStream MemIn(Payload.Data(), Payload.Size()); - BinaryReader Reader(MemIn); + IoBuffer Payload = HttpReq.ReadPayload(); + BinaryReader Reader(Payload); struct RequestHeader { diff --git a/zenserver/upstream/upstreamcache.cpp b/zenserver/upstream/upstreamcache.cpp index f056c1c76..0dd16cd06 100644 --- a/zenserver/upstream/upstreamcache.cpp +++ b/zenserver/upstream/upstreamcache.cpp @@ -172,9 +172,8 @@ namespace detail { if (Result.Success) { - MemoryOutStream MemStream; - BinaryWriter Writer(MemStream); - Package.Save(Writer); + BinaryWriter MemStream; + Package.Save(MemStream); Result.Response = IoBuffer(IoBuffer::Clone, MemStream.Data(), MemStream.Size()); } @@ -420,9 +419,8 @@ namespace detail { } } - MemoryOutStream MemStream; - BinaryWriter Writer(MemStream); - Package.Save(Writer); + BinaryWriter MemStream; + Package.Save(MemStream); IoBuffer PackagePayload(IoBuffer::Wrap, MemStream.Data(), MemStream.Size()); for (int32_t Attempt = 0; Attempt < MaxAttempts && !Result.Success; Attempt++) diff --git a/zenserver/upstream/zen.cpp b/zenserver/upstream/zen.cpp index 530bed32a..c988a6b0b 100644 --- a/zenserver/upstream/zen.cpp +++ b/zenserver/upstream/zen.cpp @@ -181,10 +181,9 @@ Mesh::BroadcastPacket(CbObjectWriter& Obj) detail::MessageHeader* Message = reinterpret_cast<detail::MessageHeader*>(MessageBuffer); *Message = {}; - MemoryOutStream MemOut; - BinaryWriter Writer(MemOut); + BinaryWriter MemOut; - Obj.Save(Writer); + Obj.Save(MemOut); // TODO: check that it fits in a packet! diff --git a/zenserver/windows/service.cpp b/zenserver/windows/service.cpp index 017b5f9a7..23cefb7b5 100644 --- a/zenserver/windows/service.cpp +++ b/zenserver/windows/service.cpp @@ -2,6 +2,7 @@ #include "service.h" +#include <zencore/except.h> #include <zencore/zencore.h> #include <stdio.h> @@ -146,26 +147,34 @@ CallMain(DWORD, LPSTR*) int WindowsService::ServiceMain() { - if (zen::IsInteractiveSession()) - { - // Not actually running as a service - return Run(); - } - else + gSvc = this; + + SERVICE_TABLE_ENTRY DispatchTable[] = {{(LPWSTR)SVCNAME, (LPSERVICE_MAIN_FUNCTION)&CallMain}, {NULL, NULL}}; + + // This call returns when the service has stopped. + // The process should simply terminate when the call returns. + + if (!StartServiceCtrlDispatcher(DispatchTable)) { - gSvc = this; + const DWORD dwError = zen::GetLastError(); - SERVICE_TABLE_ENTRY DispatchTable[] = {{(LPWSTR)SVCNAME, (LPSERVICE_MAIN_FUNCTION)&CallMain}, {NULL, NULL}}; + if (dwError == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) + { + // Not actually running as a service + gSvc = nullptr; - // This call returns when the service has stopped. - // The process should simply terminate when the call returns. + zen::SetIsInteractiveSession(true); - if (!StartServiceCtrlDispatcher(DispatchTable)) + return Run(); + } + else { - SvcReportEvent((LPTSTR)L"StartServiceCtrlDispatcher"); + zen::ThrowSystemError(dwError, "StartServiceCtrlDispatcher failed"); } } + zen::SetIsInteractiveSession(false); + return 0; } |