transaction.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #pragma once
  2. #include "abortable_registry.h"
  3. #include <yt/cpp/mapreduce/http/requests.h>
  4. #include <yt/cpp/mapreduce/http/retry_request.h>
  5. #include <util/datetime/base.h>
  6. #include <util/generic/maybe.h>
  7. #include <util/generic/ptr.h>
  8. #include <util/system/thread.h>
  9. namespace NYT {
  10. ////////////////////////////////////////////////////////////////////////////////
  11. class TPingableTransaction
  12. {
  13. public:
  14. //
  15. // Start a new transaction.
  16. TPingableTransaction(
  17. const IRawClientPtr& rawClient,
  18. const IClientRetryPolicyPtr& retryPolicy,
  19. const TClientContext& context,
  20. const TTransactionId& parentId,
  21. ITransactionPingerPtr transactionPinger,
  22. const TStartTransactionOptions& options);
  23. //
  24. // Attach to an existing transaction.
  25. TPingableTransaction(
  26. const IRawClientPtr& rawClient,
  27. const IClientRetryPolicyPtr& retryPolicy,
  28. const TClientContext& context,
  29. const TTransactionId& transactionId,
  30. ITransactionPingerPtr transactionPinger,
  31. const TAttachTransactionOptions& options);
  32. ~TPingableTransaction();
  33. const TTransactionId GetId() const;
  34. const std::pair<TDuration, TDuration> GetPingInterval() const;
  35. const TClientContext GetContext() const;
  36. void Ping() const;
  37. void Commit();
  38. void Abort();
  39. void Detach();
  40. private:
  41. enum class EStopAction
  42. {
  43. Detach,
  44. Abort,
  45. Commit,
  46. };
  47. private:
  48. const IRawClientPtr RawClient_;
  49. IClientRetryPolicyPtr ClientRetryPolicy_;
  50. TClientContext Context_;
  51. TTransactionId TransactionId_;
  52. TDuration MinPingInterval_;
  53. TDuration MaxPingInterval_;
  54. // We have to own an IntrusivePtr to registry to prevent use-after-free.
  55. ::TIntrusivePtr<NDetail::TAbortableRegistry> AbortableRegistry_;
  56. bool AbortOnTermination_;
  57. bool AutoPingable_;
  58. bool Finalized_ = false;
  59. ITransactionPingerPtr Pinger_;
  60. private:
  61. void Init(
  62. const IRawClientPtr& rawClient,
  63. const TClientContext& context,
  64. const TTransactionId& transactionId,
  65. TDuration timeout);
  66. void Stop(EStopAction action);
  67. };
  68. ////////////////////////////////////////////////////////////////////////////////
  69. TYPath Snapshot(
  70. const IRawClientPtr& rawClient,
  71. const IClientRetryPolicyPtr& clientRetryPolicy,
  72. const TTransactionId& transactionId,
  73. const TYPath& path);
  74. ////////////////////////////////////////////////////////////////////////////////
  75. } // namespace NYT