// 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: {}", NativeSupport::Unprefix(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: {}", NativeSupport::Unprefix(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 {}", NativeSupport::Unprefix(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 {}", NativeSupport::Unprefix(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 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(cert)), std::istreambuf_iterator()); *(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}; }