Browse Source

Possibility to get operation by its alias

ermolovd 1 year ago
parent
commit
2d212baccf

+ 8 - 0
yt/cpp/mapreduce/client/client.cpp

@@ -1116,6 +1116,14 @@ TOperationAttributes TClient::GetOperation(
     return NRawClient::GetOperation(ClientRetryPolicy_->CreatePolicyForGenericRequest(), Context_, operationId, options);
 }
 
+TOperationAttributes TClient::GetOperation(
+    const TString& alias,
+    const TGetOperationOptions& options)
+{
+    CheckShutdown();
+    return NRawClient::GetOperation(ClientRetryPolicy_->CreatePolicyForGenericRequest(), Context_, alias, options);
+}
+
 TListOperationsResult TClient::ListOperations(
     const TListOperationsOptions& options)
 {

+ 4 - 0
yt/cpp/mapreduce/client/client.h

@@ -415,6 +415,10 @@ public:
         const TOperationId& operationId,
         const TGetOperationOptions& options) override;
 
+    TOperationAttributes GetOperation(
+        const TString& alias,
+        const TGetOperationOptions& options) override;
+
     TListOperationsResult ListOperations(
         const TListOperationsOptions& options) override;
 

+ 8 - 0
yt/cpp/mapreduce/interface/client.h

@@ -414,6 +414,14 @@ public:
         const TOperationId& operationId,
         const TGetOperationOptions& options = TGetOperationOptions()) = 0;
 
+    ///
+    /// @brief Get operation attributes.
+    ///
+    /// @see [YT doc](https://ytsaurus.tech/docs/en/api/commands.html#get_operation)
+    virtual TOperationAttributes GetOperation(
+        const TString& alias,
+        const TGetOperationOptions& options = TGetOperationOptions()) = 0;
+
     ///
     /// @brief List operations satisfying given filters.
     ///

+ 2 - 0
yt/cpp/mapreduce/interface/operation.h

@@ -2349,6 +2349,8 @@ struct TGetOperationOptions
     ///
     /// @brief What attributes to request (if omitted, the default set of attributes will be requested).
     FLUENT_FIELD_OPTION(TOperationAttributeFilter, AttributeFilter);
+
+    FLUENT_FIELD_OPTION(bool, IncludeRuntime);
 };
 
 ///

+ 17 - 17
yt/cpp/mapreduce/raw_client/raw_batch_request.cpp

@@ -69,21 +69,21 @@ public:
 
 public:
     TResponseParserBase()
-        : Result(NewPromise<TReturnType>())
+        : Result_(NewPromise<TReturnType>())
     { }
 
     void SetException(std::exception_ptr e) override
     {
-        Result.SetException(std::move(e));
+        Result_.SetException(std::move(e));
     }
 
     TFuture<TReturnType> GetFuture()
     {
-        return Result.GetFuture();
+        return Result_.GetFuture();
     }
 
 protected:
-    TPromise<TReturnType> Result;
+    TPromise<TReturnType> Result_;
 };
 
 ////////////////////////////////////////////////////////////////////
@@ -96,7 +96,7 @@ public:
     void SetResponse(TMaybe<TNode> node) override
     {
         EnsureSomething(node);
-        Result.SetValue(std::move(*node));
+        Result_.SetValue(std::move(*node));
     }
 };
 
@@ -109,7 +109,7 @@ public:
     void SetResponse(TMaybe<TNode> node) override
     {
         EnsureNothing(node);
-        Result.SetValue();
+        Result_.SetValue();
     }
 };
 
@@ -122,7 +122,7 @@ public:
     void SetResponse(TMaybe<TNode> node) override
     {
         EnsureType(node, TNode::List);
-        Result.SetValue(std::move(node->AsList()));
+        Result_.SetValue(std::move(node->AsList()));
     }
 };
 
@@ -135,7 +135,7 @@ public:
     void SetResponse(TMaybe<TNode> node) override
     {
         EnsureType(node, TNode::Bool);
-        Result.SetValue(std::move(node->AsBool()));
+        Result_.SetValue(std::move(node->AsBool()));
     }
 };
 
@@ -148,7 +148,7 @@ public:
     void SetResponse(TMaybe<TNode> node) override
     {
         EnsureType(node, TNode::String);
-        Result.SetValue(GetGuid(node->AsString()));
+        Result_.SetValue(GetGuid(node->AsString()));
     }
 };
 
@@ -173,7 +173,7 @@ public:
         TRichYPath result;
         Deserialize(result, *node);
         result.Path_ = AddPathPrefix(result.Path_, PathPrefix_);
-        Result.SetValue(result);
+        Result_.SetValue(result);
     }
 
 private:
@@ -190,7 +190,7 @@ public:
     void SetResponse(TMaybe<TNode> node) override
     {
         EnsureType(node, TNode::Map);
-        Result.SetValue(ParseOperationAttributes(*node));
+        Result_.SetValue(ParseOperationAttributes(*node));
     }
 };
 
@@ -205,7 +205,7 @@ public:
         EnsureType(node, TNode::Map);
         TVector<TTableColumnarStatistics> statistics;
         Deserialize(statistics, *node);
-        Result.SetValue(std::move(statistics));
+        Result_.SetValue(std::move(statistics));
     }
 };
 
@@ -220,7 +220,7 @@ public:
         EnsureType(node, TNode::Map);
         TMultiTablePartitions partitions;
         Deserialize(partitions, *node);
-        Result.SetValue(std::move(partitions));
+        Result_.SetValue(std::move(partitions));
     }
 };
 
@@ -234,9 +234,9 @@ public:
     {
         EnsureType(node, TNode::String);
         if (node->AsString().empty()) {
-            Result.SetValue(Nothing());
+            Result_.SetValue(Nothing());
         } else {
-            Result.SetValue(node->AsString());
+            Result_.SetValue(node->AsString());
         }
     }
 };
@@ -250,7 +250,7 @@ public:
     void SetResponse(TMaybe<TNode> node) override
     {
         EnsureType(node, TNode::String);
-        Result.SetValue(node->AsString());
+        Result_.SetValue(node->AsString());
     }
 };
 
@@ -263,7 +263,7 @@ public:
     void SetResponse(TMaybe<TNode> node) override
     {
         EnsureType(node, TNode::Map);
-        Result.SetValue(ParseCheckPermissionResponse(*node));
+        Result_.SetValue(ParseCheckPermissionResponse(*node));
     }
 };
 

+ 12 - 0
yt/cpp/mapreduce/raw_client/raw_requests.cpp

@@ -422,6 +422,18 @@ TOperationAttributes GetOperation(
     return ParseOperationAttributes(NodeFromYsonString(result.Response));
 }
 
+TOperationAttributes GetOperation(
+    const IRequestRetryPolicyPtr& retryPolicy,
+    const TClientContext& context,
+    const TString& alias,
+    const TGetOperationOptions& options)
+{
+    THttpHeader header("GET", "get_operation");
+    header.MergeParameters(SerializeParamsForGetOperation(alias, options));
+    auto result = RetryRequestWithPolicy(retryPolicy, context, header);
+    return ParseOperationAttributes(NodeFromYsonString(result.Response));
+}
+
 void AbortOperation(
     const IRequestRetryPolicyPtr& retryPolicy,
     const TClientContext& context,

+ 6 - 0
yt/cpp/mapreduce/raw_client/raw_requests.h

@@ -163,6 +163,12 @@ TOperationAttributes GetOperation(
     const TOperationId& operationId,
     const TGetOperationOptions& options = TGetOperationOptions());
 
+TOperationAttributes GetOperation(
+    const IRequestRetryPolicyPtr& retryPolicy,
+    const TClientContext& context,
+    const TString& operationId,
+    const TGetOperationOptions& options = TGetOperationOptions());
+
 void AbortOperation(
     const IRequestRetryPolicyPtr& retryPolicy,
     const TClientContext& context,

+ 25 - 4
yt/cpp/mapreduce/raw_client/rpc_parameters_serialization.cpp

@@ -32,6 +32,11 @@ static void SetOperationIdParam(TNode* node, const TOperationId& operationId)
     (*node)["operation_id"] = GetGuidAsString(operationId);
 }
 
+static void SetAliasParam(TNode* node, const TString& alias)
+{
+    (*node)["operation_alias"] = alias;
+}
+
 static void SetPathParam(TNode* node, const TString& pathPrefix, const TYPath& path)
 {
     TYPath updatedPath = AddPathPrefix(path, pathPrefix);
@@ -392,15 +397,31 @@ TNode SerializeParamsForListOperations(
     return result;
 }
 
-TNode SerializeParamsForGetOperation(
-    const TOperationId& operationId,
-    const TGetOperationOptions& options)
+TNode SerializeParamsForGetOperation(const std::variant<TString, TOperationId>& aliasOrOperationId, const TGetOperationOptions& options)
 {
+    auto includeRuntime = options.IncludeRuntime_;
     TNode result;
-    SetOperationIdParam(&result, operationId);
+    std::visit([&] (const auto& value) {
+        using TValue = std::decay_t<decltype(value)>;
+        if constexpr (std::is_same_v<TValue, TString>) {
+            SetAliasParam(&result, value);
+            if (includeRuntime.Empty()) {
+                // Getting operation by operation alias requires enabling this option.
+                // So enable it unless user explicitly set it.
+                includeRuntime = true;
+            }
+        } else if constexpr (std::is_same_v<TValue, TOperationId>) {
+            SetOperationIdParam(&result, value);
+        } else {
+            static_assert(std::is_same_v<TValue, void>, "unreachable");
+        }
+    }, aliasOrOperationId);
     if (options.AttributeFilter_) {
         result["attributes"] = SerializeAttributeFilter(*options.AttributeFilter_);
     }
+    if (includeRuntime.Defined()) {
+        result["include_runtime"] = *includeRuntime;
+    }
     return result;
 }
 

+ 1 - 3
yt/cpp/mapreduce/raw_client/rpc_parameters_serialization.h

@@ -94,9 +94,7 @@ TNode SerializeParamsForConcatenate(
 TNode SerializeParamsForPingTx(
     const TTransactionId& transactionId);
 
-TNode SerializeParamsForGetOperation(
-    const TOperationId& operationId,
-    const TGetOperationOptions& options);
+TNode SerializeParamsForGetOperation(const std::variant<TString, TOperationId>& aliasOrOperationId, const TGetOperationOptions& options);
 
 TNode SerializeParamsForAbortOperation(
     const TOperationId& operationId);