Skip to content

Commit 9184024

Browse files
authored
[C++ SDK] Fixed race on precommit callback add (#20733)
1 parent 9817b91 commit 9184024

File tree

3 files changed

+16
-0
lines changed

3 files changed

+16
-0
lines changed

ydb/public/sdk/cpp/src/client/query/client.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -834,6 +834,8 @@ class TTransaction::TImpl : public std::enable_shared_from_this<TImpl> {
834834
}
835835

836836
void AddPrecommitCallback(TPrecommitTransactionCallback cb) {
837+
std::lock_guard lock(PrecommitCallbacksMutex);
838+
837839
if (!ChangesAreAccepted) {
838840
ythrow TContractViolation("Changes are no longer accepted");
839841
}
@@ -842,6 +844,8 @@ class TTransaction::TImpl : public std::enable_shared_from_this<TImpl> {
842844
}
843845

844846
void AddOnFailureCallback(TOnFailureTransactionCallback cb) {
847+
std::lock_guard lock(OnFailureCallbacksMutex);
848+
845849
if (!ChangesAreAccepted) {
846850
ythrow TContractViolation("Changes are no longer accepted");
847851
}
@@ -856,6 +860,9 @@ class TTransaction::TImpl : public std::enable_shared_from_this<TImpl> {
856860
bool ChangesAreAccepted = true; // haven't called Commit or Rollback yet
857861
std::vector<TPrecommitTransactionCallback> PrecommitCallbacks;
858862
std::vector<TOnFailureTransactionCallback> OnFailureCallbacks;
863+
864+
std::mutex PrecommitCallbacksMutex;
865+
std::mutex OnFailureCallbacksMutex;
859866
};
860867

861868
TTransaction::TTransaction(const TSession& session, const std::string& txId)

ydb/public/sdk/cpp/src/client/table/impl/transaction.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ TAsyncStatus TTransaction::TImpl::Rollback(const TRollbackTxSettings& settings)
9292

9393
void TTransaction::TImpl::AddPrecommitCallback(TPrecommitTransactionCallback cb)
9494
{
95+
std::lock_guard lock(PrecommitCallbacksMutex);
96+
9597
if (!ChangesAreAccepted) {
9698
ythrow TContractViolation("Changes are no longer accepted");
9799
}
@@ -101,6 +103,8 @@ void TTransaction::TImpl::AddPrecommitCallback(TPrecommitTransactionCallback cb)
101103

102104
void TTransaction::TImpl::AddOnFailureCallback(TOnFailureTransactionCallback cb)
103105
{
106+
std::lock_guard lock(OnFailureCallbacksMutex);
107+
104108
if (!ChangesAreAccepted) {
105109
ythrow TContractViolation("Changes are no longer accepted");
106110
}

ydb/public/sdk/cpp/src/client/table/impl/transaction.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
#include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/table/table.h>
44

5+
#include <mutex>
6+
57
namespace NYdb::inline Dev::NTable {
68

79
class TTransaction::TImpl : public std::enable_shared_from_this<TImpl> {
@@ -40,6 +42,9 @@ class TTransaction::TImpl : public std::enable_shared_from_this<TImpl> {
4042
bool ChangesAreAccepted = true; // haven't called Commit or Rollback yet
4143
mutable std::vector<TPrecommitTransactionCallback> PrecommitCallbacks;
4244
mutable std::vector<TOnFailureTransactionCallback> OnFailureCallbacks;
45+
46+
std::mutex PrecommitCallbacksMutex;
47+
std::mutex OnFailureCallbacksMutex;
4348
};
4449

4550
}

0 commit comments

Comments
 (0)