/* * Copyright (c) Facebook, Inc. and its affiliates. * * This software may be used and distributed according to the terms of the * GNU General Public License version 2. */ #pragma once #include #include #include #include "eden/fs/model/Blob.h" #include "eden/fs/model/Hash.h" #include "eden/fs/model/Tree.h" #include "eden/fs/store/ImportPriority.h" #include "eden/fs/telemetry/RequestMetricsScope.h" #include "eden/fs/utils/Bug.h" namespace facebook { namespace eden { /** * Represents an Hg import request. This class contains all the necessary * information needed to fulfill the request as well as a promise that will be * resolved after the requested data is imported. */ class HgImportRequest { public: struct BlobImport { using Response = std::unique_ptr; Hash hash; }; struct TreeImport { using Response = std::unique_ptr; Hash hash; }; struct Prefetch { using Response = folly::Unit; std::vector hashes; }; static std::pair>> makeBlobImportRequest( Hash hash, ImportPriority priority, std::unique_ptr metricsScope); static std::pair>> makeTreeImportRequest( Hash hash, ImportPriority priority, std::unique_ptr metricsScope); static std::pair> makePrefetchRequest( std::vector hashes, ImportPriority priority, std::unique_ptr metricsScope); template HgImportRequest( RequestType request, ImportPriority priority, folly::Promise&& promise) : request_(std::move(request)), priority_(priority), promise_(std::move(promise)) {} ~HgImportRequest() = default; HgImportRequest(HgImportRequest&&) = default; HgImportRequest& operator=(HgImportRequest&&) = default; template const T* getRequest() noexcept { return std::get_if(&request_); } template bool isType() const noexcept { return std::holds_alternative(request_); } size_t getType() const noexcept { return request_.index(); } template folly::Promise* getPromise() { auto promise = std::get_if>(&promise_); // Promise if (!promise) { EDEN_BUG() << "invalid promise type"; } return promise; } private: HgImportRequest(const HgImportRequest&) = delete; HgImportRequest& operator=(const HgImportRequest&) = delete; using Request = std::variant; using Response = std::variant< folly::Promise>, folly::Promise>, folly::Promise>; Request request_; ImportPriority priority_; Response promise_; friend bool operator<( const HgImportRequest& lhs, const HgImportRequest& rhs) { return lhs.priority_ < rhs.priority_; } }; } // namespace eden } // namespace facebook