diff options
Diffstat (limited to 'src/buildtool/execution_api/execution_service/cas_server.cpp')
-rw-r--r-- | src/buildtool/execution_api/execution_service/cas_server.cpp | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/src/buildtool/execution_api/execution_service/cas_server.cpp b/src/buildtool/execution_api/execution_service/cas_server.cpp new file mode 100644 index 00000000..025a6757 --- /dev/null +++ b/src/buildtool/execution_api/execution_service/cas_server.cpp @@ -0,0 +1,132 @@ +// Copyright 2023 Huawei Cloud Computing Technology Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "src/buildtool/execution_api/execution_service/cas_server.hpp" + +#include "fmt/format.h" +#include "src/buildtool/compatibility/native_support.hpp" +#include "src/buildtool/execution_api/local/garbage_collector.hpp" + +auto CASServiceImpl::FindMissingBlobs( + ::grpc::ServerContext* /*context*/, + const ::build::bazel::remote::execution::v2::FindMissingBlobsRequest* + request, + ::build::bazel::remote::execution::v2::FindMissingBlobsResponse* response) + -> ::grpc::Status { + auto lock = GarbageCollector::SharedLock(); + if (!lock) { + auto str = fmt::format("Could not acquire SharedLock"); + logger_.Emit(LogLevel::Error, str); + return grpc::Status{grpc::StatusCode::INTERNAL, str}; + } + for (auto const& x : request->blob_digests()) { + auto const& hash = x.hash(); + logger_.Emit(LogLevel::Trace, "FindMissingBlobs: {}", hash); + if (NativeSupport::IsTree(hash)) { + if (!storage_.TreePath(x)) { + auto* d = response->add_missing_blob_digests(); + d->CopyFrom(x); + } + } + else if (!storage_.BlobPath(x, false)) { + auto* d = response->add_missing_blob_digests(); + d->CopyFrom(x); + } + } + return ::grpc::Status::OK; +} + +auto CASServiceImpl::BatchUpdateBlobs( + ::grpc::ServerContext* /*context*/, + const ::build::bazel::remote::execution::v2::BatchUpdateBlobsRequest* + request, + ::build::bazel::remote::execution::v2::BatchUpdateBlobsResponse* response) + -> ::grpc::Status { + auto lock = GarbageCollector::SharedLock(); + if (!lock) { + auto str = fmt::format("Could not acquire SharedLock"); + logger_.Emit(LogLevel::Error, str); + return grpc::Status{grpc::StatusCode::INTERNAL, str}; + } + for (auto const& x : request->requests()) { + auto const& hash = x.digest().hash(); + logger_.Emit(LogLevel::Trace, "BatchUpdateBlobs: {}", hash); + auto* r = response->add_responses(); + r->mutable_digest()->CopyFrom(x.digest()); + if (NativeSupport::IsTree(hash)) { + if (!storage_.StoreTree(x.data())) { + auto const& str = fmt::format( + "BatchUpdateBlobs: could not upload tree {}", hash); + logger_.Emit(LogLevel::Error, str); + return ::grpc::Status{grpc::StatusCode::INTERNAL, str}; + } + } + else if (!storage_.StoreBlob(x.data(), false)) { + auto const& str = + fmt::format("BatchUpdateBlobs: could not upload blob {}", hash); + logger_.Emit(LogLevel::Error, str); + return ::grpc::Status{grpc::StatusCode::INTERNAL, str}; + } + } + return ::grpc::Status::OK; +} + +auto CASServiceImpl::BatchReadBlobs( + ::grpc::ServerContext* /*context*/, + const ::build::bazel::remote::execution::v2::BatchReadBlobsRequest* request, + ::build::bazel::remote::execution::v2::BatchReadBlobsResponse* response) + -> ::grpc::Status { + auto lock = GarbageCollector::SharedLock(); + if (!lock) { + auto str = fmt::format("Could not acquire SharedLock"); + logger_.Emit(LogLevel::Error, str); + return grpc::Status{grpc::StatusCode::INTERNAL, str}; + } + for (auto const& digest : request->digests()) { + auto* r = response->add_responses(); + r->mutable_digest()->CopyFrom(digest); + std::optional<std::filesystem::path> path; + if (NativeSupport::IsTree(digest.hash())) { + path = storage_.TreePath(digest); + } + else { + path = storage_.BlobPath(digest, false); + } + if (!path) { + google::rpc::Status status; + status.set_code(grpc::StatusCode::NOT_FOUND); + r->mutable_status()->CopyFrom(status); + + continue; + } + std::ifstream cert{*path}; + std::string tmp((std::istreambuf_iterator<char>(cert)), + std::istreambuf_iterator<char>()); + *(r->mutable_data()) = std::move(tmp); + + r->mutable_status()->CopyFrom(google::rpc::Status{}); + } + return ::grpc::Status::OK; +} + +auto CASServiceImpl::GetTree( + ::grpc::ServerContext* /*context*/, + const ::build::bazel::remote::execution::v2::GetTreeRequest* /*request*/, + ::grpc::ServerWriter< + ::build::bazel::remote::execution::v2::GetTreeResponse>* /*writer*/) + -> ::grpc::Status { + auto const* str = "GetTree not implemented"; + logger_.Emit(LogLevel::Error, str); + return ::grpc::Status{grpc::StatusCode::UNIMPLEMENTED, str}; +} |