summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgryzlov-ad <[email protected]>2025-04-09 13:28:31 +0300
committergryzlov-ad <[email protected]>2025-04-09 13:58:14 +0300
commit3a93a5327c56de1d9b5df1457120d5d788068123 (patch)
tree6b0b94afddbd9eb0612990bb26737042e88ee6cf
parent2da977708b0f780fd122dd337aedefbad66ad289 (diff)
YT-23505: Add IPrerequisite to client/api
commit_hash:7dcae50ae63844645ae306627ebeec7cc090430d
-rw-r--r--yt/yt/client/api/client.h14
-rw-r--r--yt/yt/client/api/delegating_client.cpp2
-rw-r--r--yt/yt/client/api/delegating_client.h5
-rw-r--r--yt/yt/client/api/delegating_transaction.cpp2
-rw-r--r--yt/yt/client/api/delegating_transaction.h6
-rw-r--r--yt/yt/client/api/prerequisite-inl.h41
-rw-r--r--yt/yt/client/api/prerequisite.h62
-rw-r--r--yt/yt/client/api/prerequisite_client.h30
-rw-r--r--yt/yt/client/api/public.h3
-rw-r--r--yt/yt/client/api/rpc_proxy/client_impl.cpp11
-rw-r--r--yt/yt/client/api/rpc_proxy/client_impl.h4
-rw-r--r--yt/yt/client/api/rpc_proxy/transaction_impl.cpp4
-rw-r--r--yt/yt/client/api/rpc_proxy/transaction_impl.h4
-rw-r--r--yt/yt/client/api/transaction-inl.h42
-rw-r--r--yt/yt/client/api/transaction.cpp10
-rw-r--r--yt/yt/client/api/transaction.h52
-rw-r--r--yt/yt/client/api/transaction_client.h7
-rw-r--r--yt/yt/client/federated/client.cpp24
-rw-r--r--yt/yt/client/hedging/hedging.cpp1
-rw-r--r--yt/yt/client/prerequisite_client/public.h13
-rw-r--r--yt/yt/client/unittests/mock/client.h5
-rw-r--r--yt/yt/client/unittests/mock/transaction.h2
22 files changed, 238 insertions, 106 deletions
diff --git a/yt/yt/client/api/client.h b/yt/yt/client/api/client.h
index 823e37ad396..713c524a1d0 100644
--- a/yt/yt/client/api/client.h
+++ b/yt/yt/client/api/client.h
@@ -1,21 +1,22 @@
#pragma once
-#include "connection.h"
#include "accounting_client.h"
#include "admin_client.h"
+#include "connection.h"
#include "cypress_client.h"
#include "distributed_table_client.h"
#include "etc_client.h"
#include "file_client.h"
+#include "flow_client.h"
#include "journal_client.h"
#include "operation_client.h"
-#include "security_client.h"
-#include "transaction_client.h"
-#include "table_client.h"
-#include "queue_client.h"
+#include "prerequisite_client.h"
#include "query_tracker_client.h"
-#include "flow_client.h"
+#include "queue_client.h"
+#include "security_client.h"
#include "shuffle_client.h"
+#include "table_client.h"
+#include "transaction_client.h"
#include <yt/yt/client/bundle_controller_client/bundle_controller_client.h>
@@ -60,6 +61,7 @@ DEFINE_REFCOUNTED_TYPE(IClientBase)
*/
struct IClient
: public virtual IClientBase
+ , public IPrerequisiteClient
, public ITransactionClient
, public ITableClient
, public IQueueClient
diff --git a/yt/yt/client/api/delegating_client.cpp b/yt/yt/client/api/delegating_client.cpp
index d71befc4020..5e4b6f6afce 100644
--- a/yt/yt/client/api/delegating_client.cpp
+++ b/yt/yt/client/api/delegating_client.cpp
@@ -11,7 +11,7 @@ TDelegatingClient::TDelegatingClient(IClientPtr underlying)
////////////////////////////////////////////////////////////////////////////////
// Ensure that delegating client contains implementations for all
-// methods of IClient. Tthis reduces the number of PR iterations you need to
+// methods of IClient. This reduces the number of PR iterations you need to
// find that some out-of-yt/yt implementation of IClient does not compile.
void InstantiateDelegatingClient()
{
diff --git a/yt/yt/client/api/delegating_client.h b/yt/yt/client/api/delegating_client.h
index f04c2108426..81ddbc5f5b7 100644
--- a/yt/yt/client/api/delegating_client.h
+++ b/yt/yt/client/api/delegating_client.h
@@ -256,6 +256,11 @@ public:
const TTransactionAttachOptions& options),
(transactionId, options))
+ DELEGATE_METHOD(IPrerequisitePtr, AttachPrerequisite, (
+ NPrerequisiteClient::TPrerequisiteId prerequisiteId,
+ const TPrerequisiteAttachOptions& options),
+ (prerequisiteId, options))
+
// Tables
DELEGATE_METHOD(TFuture<void>, MountTable, (
const NYPath::TYPath& path,
diff --git a/yt/yt/client/api/delegating_transaction.cpp b/yt/yt/client/api/delegating_transaction.cpp
index 437c991875c..a5bed74db99 100644
--- a/yt/yt/client/api/delegating_transaction.cpp
+++ b/yt/yt/client/api/delegating_transaction.cpp
@@ -189,7 +189,7 @@ DELEGATE_METHOD(NTransactionClient::EDurability, GetDurability, () const, ())
DELEGATE_METHOD(TDuration, GetTimeout, () const, ())
DELEGATE_METHOD(TFuture<void>, Ping, (
- const NApi::TTransactionPingOptions& options),
+ const NApi::TPrerequisitePingOptions& options),
(options))
DELEGATE_METHOD(TFuture<TTransactionCommitResult>, Commit, (
diff --git a/yt/yt/client/api/delegating_transaction.h b/yt/yt/client/api/delegating_transaction.h
index 1bf742fe7bc..90591dd91d6 100644
--- a/yt/yt/client/api/delegating_transaction.h
+++ b/yt/yt/client/api/delegating_transaction.h
@@ -163,13 +163,13 @@ public:
TDuration GetTimeout() const override;
TFuture<void> Ping(
- const NApi::TTransactionPingOptions& options) override;
+ const NApi::TPrerequisitePingOptions& options) override;
TFuture<TTransactionCommitResult> Commit(
- const TTransactionCommitOptions& options = TTransactionCommitOptions()) override;
+ const TTransactionCommitOptions& options = {}) override;
TFuture<void> Abort(
- const TTransactionAbortOptions& options = TTransactionAbortOptions()) override;
+ const TTransactionAbortOptions& options) override;
void Detach() override;
TFuture<TTransactionFlushResult> Flush() override;
diff --git a/yt/yt/client/api/prerequisite-inl.h b/yt/yt/client/api/prerequisite-inl.h
new file mode 100644
index 00000000000..26fee62b733
--- /dev/null
+++ b/yt/yt/client/api/prerequisite-inl.h
@@ -0,0 +1,41 @@
+#ifndef PREREQUISITE_INL_H_
+#error "Direct inclusion of this file is not allowed, include transaction.h"
+// For the sake of sane code completion.
+#include "prerequisite.h"
+#endif
+
+namespace NYT::NApi {
+
+////////////////////////////////////////////////////////////////////////////////
+
+template <class TDerived>
+TDerived* IPrerequisite::As()
+{
+ auto* derived = dynamic_cast<TDerived*>(this);
+ YT_VERIFY(derived);
+ return derived;
+}
+
+template <class TDerived>
+TDerived* IPrerequisite::TryAs()
+{
+ return dynamic_cast<TDerived*>(this);
+}
+
+template <class TDerived>
+const TDerived* IPrerequisite::As() const
+{
+ const auto* derived = dynamic_cast<const TDerived*>(this);
+ YT_VERIFY(derived);
+ return derived;
+}
+
+template <class TDerived>
+const TDerived* IPrerequisite::TryAs() const
+{
+ return dynamic_cast<const TDerived*>(this);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NApi
diff --git a/yt/yt/client/api/prerequisite.h b/yt/yt/client/api/prerequisite.h
new file mode 100644
index 00000000000..229cca00f82
--- /dev/null
+++ b/yt/yt/client/api/prerequisite.h
@@ -0,0 +1,62 @@
+#pragma once
+
+#include "client_common.h"
+#include "public.h"
+
+#include <yt/yt/client/prerequisite_client/public.h>
+
+namespace NYT::NApi {
+
+////////////////////////////////////////////////////////////////////////////////
+
+struct TPrerequisitePingOptions
+{
+ bool EnableRetries = false;
+};
+
+struct TPrerequisiteAbortOptions
+ : public TMutatingOptions
+{
+ bool Force = false;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+struct IPrerequisite
+ : public virtual TRefCounted
+{
+ using TAbortedHandlerSignature = void(const TError& error);
+ using TAbortedHandler = TCallback<TAbortedHandlerSignature>;
+ DECLARE_INTERFACE_SIGNAL(TAbortedHandlerSignature, Aborted);
+
+ virtual IClientPtr GetClient() const = 0;
+ virtual TDuration GetTimeout() const = 0;
+
+ virtual TFuture<void> Ping(const TPrerequisitePingOptions& options = {}) = 0;
+ virtual TFuture<void> Abort(const TPrerequisiteAbortOptions& options = {}) = 0;
+
+ virtual void Detach() = 0;
+
+ virtual NPrerequisiteClient::TPrerequisiteId GetId() const = 0;
+
+ //! Verified dynamic casts to a more specific interface.
+ template <class TDerived>
+ TDerived* As();
+ template <class TDerived>
+ TDerived* TryAs();
+
+ template <class TDerived>
+ const TDerived* As() const;
+ template <class TDerived>
+ const TDerived* TryAs() const;
+};
+
+DEFINE_REFCOUNTED_TYPE(IPrerequisite)
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NApi
+
+#define PREREQUISITE_INL_H_
+#include "prerequisite-inl.h"
+#undef PREREQUISITE_INL_H_
diff --git a/yt/yt/client/api/prerequisite_client.h b/yt/yt/client/api/prerequisite_client.h
new file mode 100644
index 00000000000..dfe5be31e4c
--- /dev/null
+++ b/yt/yt/client/api/prerequisite_client.h
@@ -0,0 +1,30 @@
+#pragma once
+
+#include "public.h"
+
+namespace NYT::NApi {
+
+////////////////////////////////////////////////////////////////////////////////
+
+struct TPrerequisiteAttachOptions
+{
+ bool AutoAbort = false;
+ std::optional<TDuration> PingPeriod;
+ bool Ping = true;
+ bool PingAncestors = false;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+struct IPrerequisiteClient
+{
+ virtual ~IPrerequisiteClient() = default;
+
+ virtual IPrerequisitePtr AttachPrerequisite(
+ NPrerequisiteClient::TPrerequisiteId preqreuisiteId,
+ const TPrerequisiteAttachOptions& options = {}) = 0;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NApi
diff --git a/yt/yt/client/api/public.h b/yt/yt/client/api/public.h
index 7322d608302..7902bae0d12 100644
--- a/yt/yt/client/api/public.h
+++ b/yt/yt/client/api/public.h
@@ -6,6 +6,8 @@
#include <yt/yt/client/transaction_client/public.h>
+#include <yt/yt/client/prerequisite_client/public.h>
+
#include <yt/yt/client/bundle_controller_client/public.h>
#include <yt/yt/library/auth/authentication_options.h>
@@ -138,6 +140,7 @@ DECLARE_REFCOUNTED_STRUCT(IClientBase)
DECLARE_REFCOUNTED_STRUCT(IClient)
DECLARE_REFCOUNTED_STRUCT(IInternalClient)
DECLARE_REFCOUNTED_STRUCT(ITransaction)
+DECLARE_REFCOUNTED_STRUCT(IPrerequisite)
DECLARE_REFCOUNTED_STRUCT(IStickyTransactionPool)
DECLARE_REFCOUNTED_STRUCT(IRowBatchReader)
diff --git a/yt/yt/client/api/rpc_proxy/client_impl.cpp b/yt/yt/client/api/rpc_proxy/client_impl.cpp
index 9274e82811a..a4b77dd1832 100644
--- a/yt/yt/client/api/rpc_proxy/client_impl.cpp
+++ b/yt/yt/client/api/rpc_proxy/client_impl.cpp
@@ -12,6 +12,7 @@
#include <yt/yt/client/api/helpers.h>
#include <yt/yt/client/api/table_partition_reader.h>
+#include <yt/yt/client/api/transaction.h>
#include <yt/yt/client/chaos_client/replication_card_serialization.h>
@@ -225,6 +226,16 @@ ITransactionPtr TClient::AttachTransaction(
"Transaction attached");
}
+IPrerequisitePtr TClient::AttachPrerequisite(
+ NPrerequisiteClient::TPrerequisiteId prerequisiteId,
+ const TPrerequisiteAttachOptions& options)
+{
+ TTransactionAttachOptions attachOptions = {};
+ static_cast<TPrerequisiteAttachOptions&>(attachOptions) = options;
+
+ return AttachTransaction(prerequisiteId, attachOptions);
+}
+
TFuture<void> TClient::MountTable(
const TYPath& path,
const TMountTableOptions& options)
diff --git a/yt/yt/client/api/rpc_proxy/client_impl.h b/yt/yt/client/api/rpc_proxy/client_impl.h
index 151a2398621..41c9b79c124 100644
--- a/yt/yt/client/api/rpc_proxy/client_impl.h
+++ b/yt/yt/client/api/rpc_proxy/client_impl.h
@@ -32,6 +32,10 @@ public:
NTransactionClient::TTransactionId transactionId,
const NApi::TTransactionAttachOptions& options) override;
+ NApi::IPrerequisitePtr AttachPrerequisite(
+ NPrerequisiteClient::TPrerequisiteId prerequisiteId,
+ const NApi::TPrerequisiteAttachOptions& options) override;
+
// Tables.
TFuture<void> MountTable(
const NYPath::TYPath& path,
diff --git a/yt/yt/client/api/rpc_proxy/transaction_impl.cpp b/yt/yt/client/api/rpc_proxy/transaction_impl.cpp
index cf732951ba7..164c5234049 100644
--- a/yt/yt/client/api/rpc_proxy/transaction_impl.cpp
+++ b/yt/yt/client/api/rpc_proxy/transaction_impl.cpp
@@ -165,7 +165,7 @@ void TTransaction::RegisterAlienTransaction(const ITransactionPtr& transaction)
transaction->GetConnection()->GetLoggingTag());
}
-TFuture<void> TTransaction::Ping(const NApi::TTransactionPingOptions& /*options*/)
+TFuture<void> TTransaction::Ping(const NApi::TPrerequisitePingOptions& /*options*/)
{
return SendPing();
}
@@ -489,7 +489,7 @@ void TTransaction::ModifyRows(
.Subscribe(BIND([=, this, this_ = MakeStrong(this)] (const TError& error) {
if (!error.IsOK()) {
YT_LOG_DEBUG(error, "Error sending row modifications");
- YT_UNUSED_FUTURE(Abort());
+ YT_UNUSED_FUTURE(ITransaction::Abort());
}
}));
diff --git a/yt/yt/client/api/rpc_proxy/transaction_impl.h b/yt/yt/client/api/rpc_proxy/transaction_impl.h
index 300f3a9bd9b..968e36eabe7 100644
--- a/yt/yt/client/api/rpc_proxy/transaction_impl.h
+++ b/yt/yt/client/api/rpc_proxy/transaction_impl.h
@@ -61,10 +61,10 @@ public:
NTransactionClient::EDurability GetDurability() const override;
TDuration GetTimeout() const override;
- TFuture<void> Ping(const NApi::TTransactionPingOptions& options = {}) override;
+ TFuture<void> Ping(const NApi::TPrerequisitePingOptions& options = {}) override;
TFuture<NApi::TTransactionFlushResult> Flush() override;
TFuture<NApi::TTransactionCommitResult> Commit(const NApi::TTransactionCommitOptions&) override;
- TFuture<void> Abort(const NApi::TTransactionAbortOptions& options = {}) override;
+ TFuture<void> Abort(const NApi::TTransactionAbortOptions& options) override;
void Detach() override;
void RegisterAlienTransaction(const ITransactionPtr& transaction) override;
diff --git a/yt/yt/client/api/transaction-inl.h b/yt/yt/client/api/transaction-inl.h
deleted file mode 100644
index c2ceb5f3885..00000000000
--- a/yt/yt/client/api/transaction-inl.h
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef TRANSACTION_INL_H_
-#error "Direct inclusion of this file is not allowed, include transaction.h"
-// For the sake of sane code completion.
-#include "transaction.h"
-#endif
-
-namespace NYT::NApi {
-
-////////////////////////////////////////////////////////////////////////////////
-
-template <class TDerivedTransaction>
-TDerivedTransaction* ITransaction::As()
-{
- auto* derived = dynamic_cast<TDerivedTransaction*>(this);
- YT_VERIFY(derived);
- return derived;
-}
-
-template <class TDerivedTransaction>
-TDerivedTransaction* ITransaction::TryAs()
-{
- return dynamic_cast<TDerivedTransaction*>(this);
-}
-
-template <class TDerivedTransaction>
-const TDerivedTransaction* ITransaction::As() const
-{
- const auto* derived = dynamic_cast<const TDerivedTransaction*>(this);
- YT_VERIFY(derived);
- return derived;
-}
-
-template <class TDerivedTransaction>
-const TDerivedTransaction* ITransaction::TryAs() const
-{
- return dynamic_cast<const TDerivedTransaction*>(this);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT::NApi
-
diff --git a/yt/yt/client/api/transaction.cpp b/yt/yt/client/api/transaction.cpp
index 6287cd793c3..214317bf760 100644
--- a/yt/yt/client/api/transaction.cpp
+++ b/yt/yt/client/api/transaction.cpp
@@ -4,6 +4,16 @@ namespace NYT::NApi {
////////////////////////////////////////////////////////////////////////////////
+TFuture<void> ITransaction::Abort(const TPrerequisiteAbortOptions& options)
+{
+ TTransactionAbortOptions abortOptions = {};
+ static_cast<TPrerequisiteAbortOptions&>(abortOptions) = options;
+
+ return Abort(abortOptions);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
TFuture<ITransactionPtr> StartAlienTransaction(
const ITransactionPtr& localTransaction,
const IClientPtr& alienClient,
diff --git a/yt/yt/client/api/transaction.h b/yt/yt/client/api/transaction.h
index dac7f87be89..5a20f09c240 100644
--- a/yt/yt/client/api/transaction.h
+++ b/yt/yt/client/api/transaction.h
@@ -3,6 +3,7 @@
#include "client.h"
#include "dynamic_table_transaction.h"
#include "queue_transaction.h"
+#include "prerequisite.h"
#include <yt/yt/client/table_client/unversioned_row.h>
#include <yt/yt/client/table_client/versioned_row.h>
@@ -70,11 +71,6 @@ struct TTransactionCommitOptions
bool StronglyOrdered = false;
};
-struct TTransactionPingOptions
-{
- bool EnableRetries = false;
-};
-
struct TTransactionCommitResult
{
//! NullTimestamp for all cases when CommitTimestamps are empty.
@@ -87,12 +83,9 @@ struct TTransactionCommitResult
};
struct TTransactionAbortOptions
- : public TMutatingOptions
- , public TPrerequisiteOptions
+ : public TPrerequisiteAbortOptions
, public TTransactionalOptions
-{
- bool Force = false;
-};
+{ };
struct TTransactionFlushResult
{
@@ -113,43 +106,26 @@ struct TTransactionFlushResult
*/
struct ITransaction
: public virtual IClientBase
+ , public virtual IPrerequisite
, public virtual IDynamicTableTransaction
, public virtual IQueueTransaction
{
- virtual IClientPtr GetClient() const = 0;
+ using TCommittedHandlerSignature = void();
+ using TCommittedHandler = TCallback<TCommittedHandlerSignature>;
+ DECLARE_INTERFACE_SIGNAL(TCommittedHandlerSignature, Committed);
+
virtual NTransactionClient::ETransactionType GetType() const = 0;
- virtual NTransactionClient::TTransactionId GetId() const = 0;
virtual NTransactionClient::TTimestamp GetStartTimestamp() const = 0;
virtual NTransactionClient::EAtomicity GetAtomicity() const = 0;
virtual NTransactionClient::EDurability GetDurability() const = 0;
- virtual TDuration GetTimeout() const = 0;
- virtual TFuture<void> Ping(const NApi::TTransactionPingOptions& options = {}) = 0;
virtual TFuture<TTransactionCommitResult> Commit(const TTransactionCommitOptions& options = {}) = 0;
- virtual TFuture<void> Abort(const TTransactionAbortOptions& options = {}) = 0;
- virtual void Detach() = 0;
- virtual TFuture<TTransactionFlushResult> Flush() = 0;
- virtual void RegisterAlienTransaction(const ITransactionPtr& transaction) = 0;
-
- using TCommittedHandlerSignature = void();
- using TCommittedHandler = TCallback<TCommittedHandlerSignature>;
- DECLARE_INTERFACE_SIGNAL(TCommittedHandlerSignature, Committed);
- using TAbortedHandlerSignature = void(const TError& error);
- using TAbortedHandler = TCallback<TAbortedHandlerSignature>;
- DECLARE_INTERFACE_SIGNAL(TAbortedHandlerSignature, Aborted);
+ virtual TFuture<void> Abort(const TPrerequisiteAbortOptions& options = {}) override;
+ virtual TFuture<void> Abort(const TTransactionAbortOptions& options) = 0;
- // Verified dynamic casts to a more specific interface.
-
- template <class TDerivedTransaction>
- TDerivedTransaction* As();
- template <class TDerivedTransaction>
- TDerivedTransaction* TryAs();
-
- template <class TDerivedTransaction>
- const TDerivedTransaction* As() const;
- template <class TDerivedTransaction>
- const TDerivedTransaction* TryAs() const;
+ virtual TFuture<TTransactionFlushResult> Flush() = 0;
+ virtual void RegisterAlienTransaction(const ITransactionPtr& transaction) = 0;
};
DEFINE_REFCOUNTED_TYPE(ITransaction)
@@ -182,7 +158,3 @@ TFuture<ITransactionPtr> StartAlienTransaction(
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT::NApi
-
-#define TRANSACTION_INL_H_
-#include "transaction-inl.h"
-#undef TRANSACTION_INL_H_
diff --git a/yt/yt/client/api/transaction_client.h b/yt/yt/client/api/transaction_client.h
index 626d4eae38a..b1954e79242 100644
--- a/yt/yt/client/api/transaction_client.h
+++ b/yt/yt/client/api/transaction_client.h
@@ -1,6 +1,7 @@
#pragma once
#include "client_common.h"
+#include "prerequisite_client.h"
#include <yt/yt/core/ytree/public.h>
@@ -63,12 +64,8 @@ struct TTransactionStartOptions
};
struct TTransactionAttachOptions
+ : public TPrerequisiteAttachOptions
{
- bool AutoAbort = false;
- std::optional<TDuration> PingPeriod;
- bool Ping = true;
- bool PingAncestors = false;
-
//! If non-empty, assumes that the transaction is sticky and specifies address of the transaction manager.
//! Throws if the transaction is not sticky actually.
//! Only supported by RPC proxy client for now. Ignored by other clients.
diff --git a/yt/yt/client/federated/client.cpp b/yt/yt/client/federated/client.cpp
index 2a07474aaad..1037d2ee96b 100644
--- a/yt/yt/client/federated/client.cpp
+++ b/yt/yt/client/federated/client.cpp
@@ -116,11 +116,11 @@ public:
TFuture<TTransactionFlushResult> Flush() override;
- TFuture<void> Ping(const NApi::TTransactionPingOptions& options = {}) override;
+ TFuture<void> Ping(const TPrerequisitePingOptions& options = {}) override;
TFuture<TTransactionCommitResult> Commit(const TTransactionCommitOptions& options = TTransactionCommitOptions()) override;
- TFuture<void> Abort(const TTransactionAbortOptions& options = TTransactionAbortOptions()) override;
+ TFuture<void> Abort(const TTransactionAbortOptions& options = {}) override;
TFuture<TVersionedLookupRowsResult> VersionedLookupRows(
const NYPath::TYPath&, NTableClient::TNameTablePtr,
@@ -238,6 +238,7 @@ public:
UNIMPLEMENTED_METHOD(IJournalWriterPtr, CreateJournalWriter, (const NYPath::TYPath&, const TJournalWriterOptions&));
UNIMPLEMENTED_METHOD(TFuture<TDistributedWriteSessionWithCookies>, StartDistributedWriteSession, (const NYPath::TRichYPath&, const TDistributedWriteSessionStartOptions&));
UNIMPLEMENTED_METHOD(TFuture<void>, FinishDistributedWriteSession, (const TDistributedWriteSessionWithResults&, const TDistributedWriteSessionFinishOptions&));
+ UNIMPLEMENTED_METHOD(TFuture<void>, Abort, (const TPrerequisiteAbortOptions&));
private:
const TClientPtr Client_;
@@ -336,6 +337,8 @@ public:
ITransactionPtr AttachTransaction(NTransactionClient::TTransactionId, const TTransactionAttachOptions&) override;
+ IPrerequisitePtr AttachPrerequisite(NPrerequisiteClient::TPrerequisiteId, const TPrerequisiteAttachOptions&) override;
+
IConnectionPtr GetConnection() override
{
auto [client, _] = GetActiveClient();
@@ -552,7 +555,7 @@ TFuture<ResultType> TTransaction::MethodName(Y_METHOD_USED_ARGS_DECLARATION(Args
TRANSACTION_METHOD_IMPL(TUnversionedLookupRowsResult, LookupRows, (const NYPath::TYPath&, NTableClient::TNameTablePtr, const TSharedRange<NTableClient::TUnversionedRow>&, const TLookupRowsOptions&));
TRANSACTION_METHOD_IMPL(TSelectRowsResult, SelectRows, (const std::string&, const TSelectRowsOptions&));
-TRANSACTION_METHOD_IMPL(void, Ping, (const NApi::TTransactionPingOptions&));
+TRANSACTION_METHOD_IMPL(void, Ping, (const NApi::TPrerequisitePingOptions&));
TRANSACTION_METHOD_IMPL(TTransactionCommitResult, Commit, (const TTransactionCommitOptions&));
TRANSACTION_METHOD_IMPL(void, Abort, (const TTransactionAbortOptions&));
TRANSACTION_METHOD_IMPL(TVersionedLookupRowsResult, VersionedLookupRows, (const NYPath::TYPath&, NTableClient::TNameTablePtr, const TSharedRange<NTableClient::TUnversionedRow>&, const TVersionedLookupRowsOptions&));
@@ -762,6 +765,21 @@ ITransactionPtr TClient::AttachTransaction(
THROW_ERROR_EXCEPTION("No client is known for transaction %v", transactionId);
}
+IPrerequisitePtr TClient::AttachPrerequisite(
+ NPrerequisiteClient::TPrerequisiteId prerequisiteId,
+ const TPrerequisiteAttachOptions& options)
+{
+ TTransactionAttachOptions attachOptions = {};
+ attachOptions.AutoAbort = options.AutoAbort;
+ attachOptions.PingPeriod = options.PingPeriod;
+ attachOptions.Ping = options.Ping;
+ attachOptions.PingAncestors = options.PingAncestors;
+
+ static_assert(std::is_convertible_v<ITransaction*, IPrerequisite*>);
+
+ return AttachTransaction(prerequisiteId, attachOptions);
+}
+
void TClient::HandleError(const TErrorOr<void>& error, int clientIndex)
{
if (!NRpc::IsChannelFailureError(error) && !Config_->RetryAnyError) {
diff --git a/yt/yt/client/hedging/hedging.cpp b/yt/yt/client/hedging/hedging.cpp
index 5ea0675af6d..13e9c5471d9 100644
--- a/yt/yt/client/hedging/hedging.cpp
+++ b/yt/yt/client/hedging/hedging.cpp
@@ -120,6 +120,7 @@ public:
UNSUPPORTED_METHOD(const NChaosClient::IReplicationCardCachePtr&, GetReplicationCardCache, ());
UNSUPPORTED_METHOD(const NTransactionClient::ITimestampProviderPtr&, GetTimestampProvider, ());
UNSUPPORTED_METHOD(ITransactionPtr, AttachTransaction, (NTransactionClient::TTransactionId, const TTransactionAttachOptions&));
+ UNSUPPORTED_METHOD(IPrerequisitePtr, AttachPrerequisite, (NPrerequisiteClient::TPrerequisiteId, const TPrerequisiteAttachOptions&));
UNSUPPORTED_METHOD(TFuture<void>, MountTable, (const TYPath&, const TMountTableOptions&));
UNSUPPORTED_METHOD(TFuture<void>, UnmountTable, (const TYPath&, const TUnmountTableOptions&));
UNSUPPORTED_METHOD(TFuture<void>, RemountTable, (const TYPath&, const TRemountTableOptions&));
diff --git a/yt/yt/client/prerequisite_client/public.h b/yt/yt/client/prerequisite_client/public.h
new file mode 100644
index 00000000000..f3b5afadf9d
--- /dev/null
+++ b/yt/yt/client/prerequisite_client/public.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include <yt/yt/client/object_client/public.h>
+
+namespace NYT::NPrerequisiteClient {
+
+////////////////////////////////////////////////////////////////////////////////
+
+using TPrerequisiteId = NObjectClient::TObjectId;
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NPrerequisiteClient
diff --git a/yt/yt/client/unittests/mock/client.h b/yt/yt/client/unittests/mock/client.h
index 8a5f8b7bdf7..feac7010ccf 100644
--- a/yt/yt/client/unittests/mock/client.h
+++ b/yt/yt/client/unittests/mock/client.h
@@ -378,6 +378,11 @@ public:
const TTransactionAttachOptions& options),
(override));
+ MOCK_METHOD(IPrerequisitePtr, AttachPrerequisite, (
+ NPrerequisiteClient::TPrerequisiteId prerequisiteId,
+ const TPrerequisiteAttachOptions& options),
+ (override));
+
MOCK_METHOD(TFuture<void>, MountTable, (
const NYPath::TYPath& path,
const TMountTableOptions& options),
diff --git a/yt/yt/client/unittests/mock/transaction.h b/yt/yt/client/unittests/mock/transaction.h
index 25c6dd6cd9e..440d0ea4d0f 100644
--- a/yt/yt/client/unittests/mock/transaction.h
+++ b/yt/yt/client/unittests/mock/transaction.h
@@ -197,7 +197,7 @@ public:
return Timeout;
}
- MOCK_METHOD(TFuture<void>, Ping, (const NApi::TTransactionPingOptions& options), (override));
+ MOCK_METHOD(TFuture<void>, Ping, (const NApi::TPrerequisitePingOptions& options), (override));
MOCK_METHOD(TFuture<TTransactionCommitResult>, Commit, (const TTransactionCommitOptions& options), (override));
MOCK_METHOD(TFuture<void>, Abort, (const TTransactionAbortOptions& options), (override));
MOCK_METHOD(void, Detach, (), (override));