aboutsummaryrefslogtreecommitdiff
path: root/zenserver
diff options
context:
space:
mode:
Diffstat (limited to 'zenserver')
-rw-r--r--zenserver/cache/structuredcache.cpp90
-rw-r--r--zenserver/casstore.cpp48
-rw-r--r--zenserver/compute/apply.cpp4
-rw-r--r--zenserver/projectstore.cpp10
-rw-r--r--zenserver/upstream/upstreamcache.cpp10
-rw-r--r--zenserver/upstream/zen.cpp5
-rw-r--r--zenserver/windows/service.cpp33
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;
}