diff options
author | gryzlov-ad <[email protected]> | 2025-04-09 13:28:31 +0300 |
---|---|---|
committer | gryzlov-ad <[email protected]> | 2025-04-09 13:58:14 +0300 |
commit | 3a93a5327c56de1d9b5df1457120d5d788068123 (patch) | |
tree | 6b0b94afddbd9eb0612990bb26737042e88ee6cf | |
parent | 2da977708b0f780fd122dd337aedefbad66ad289 (diff) |
YT-23505: Add IPrerequisite to client/api
commit_hash:7dcae50ae63844645ae306627ebeec7cc090430d
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)); |