@@ -462,10 +462,16 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
462
462
NYql::TIssues issues;
463
463
NYql::IssuesFromMessage (res->Record .GetIssues (), issues);
464
464
465
- LOG_D (" Recv EvWriteResult from ShardID=" << shardId
465
+ LOG_D (" Recv EvWriteResult (prepare) from ShardID=" << shardId
466
466
<< " , Status=" << NKikimrDataEvents::TEvWriteResult::EStatus_Name (ev->Get ()->GetStatus ())
467
467
<< " , TxId=" << ev->Get ()->Record .GetTxId ()
468
- << " , LocksCount= " << ev->Get ()->Record .GetTxLocks ().size ()
468
+ << " , Locks= " << [&]() {
469
+ TStringBuilder builder;
470
+ for (const auto & lock : ev->Get ()->Record .GetTxLocks ()) {
471
+ builder << lock.ShortDebugString ();
472
+ }
473
+ return builder;
474
+ }()
469
475
<< " , Cookie=" << ev->Cookie
470
476
<< " , error=" << issues.ToString ());
471
477
@@ -486,6 +492,18 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
486
492
case NKikimrDataEvents::TEvWriteResult::STATUS_COMPLETED: {
487
493
YQL_ENSURE (false );
488
494
}
495
+ case NKikimrDataEvents::TEvWriteResult::STATUS_LOCKS_BROKEN: {
496
+ LOG_D (" Broken locks: " << res->Record .DebugString ());
497
+ YQL_ENSURE (shardState->State == TShardState::EState::Preparing);
498
+ Counters->TxProxyMon ->TxResultAborted ->Inc ();
499
+ LocksBroken = true ;
500
+
501
+ YQL_ENSURE (!res->Record .GetTxLocks ().empty ());
502
+ ResponseEv->BrokenLockPathId = NYql::TKikimrPathId (
503
+ res->Record .GetTxLocks (0 ).GetSchemeShard (),
504
+ res->Record .GetTxLocks (0 ).GetPathId ());
505
+ ReplyErrorAndDie (Ydb::StatusIds::ABORTED, {});
506
+ }
489
507
default :
490
508
{
491
509
return ShardError (res->Record );
@@ -863,6 +881,7 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
863
881
return ReplyErrorAndDie (Ydb::StatusIds::SCHEME_ERROR, issues);
864
882
}
865
883
case NKikimrDataEvents::TEvWriteResult::STATUS_LOCKS_BROKEN: {
884
+ issues.AddIssue (NYql::YqlIssue ({}, TIssuesIds::KIKIMR_LOCKS_INVALIDATED, " Transaction locks invalidated." ));
866
885
return ReplyErrorAndDie (Ydb::StatusIds::ABORTED, issues);
867
886
}
868
887
}
@@ -923,6 +942,7 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
923
942
}
924
943
925
944
void ExecutePlanned () {
945
+ YQL_ENSURE (!LocksBroken);
926
946
YQL_ENSURE (TxCoordinator);
927
947
auto ev = MakeHolder<TEvTxProxy::TEvProposeTransaction>();
928
948
ev->Record .SetCoordinatorID (TxCoordinator);
@@ -1133,10 +1153,16 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
1133
1153
NYql::TIssues issues;
1134
1154
NYql::IssuesFromMessage (res->Record .GetIssues (), issues);
1135
1155
1136
- LOG_D (" Recv EvWriteResult from ShardID=" << shardId
1156
+ LOG_D (" Recv EvWriteResult (execute) from ShardID=" << shardId
1137
1157
<< " , Status=" << NKikimrDataEvents::TEvWriteResult::EStatus_Name (ev->Get ()->GetStatus ())
1138
1158
<< " , TxId=" << ev->Get ()->Record .GetTxId ()
1139
- << " , LocksCount= " << ev->Get ()->Record .GetTxLocks ().size ()
1159
+ << " , Locks= " << [&]() {
1160
+ TStringBuilder builder;
1161
+ for (const auto & lock : ev->Get ()->Record .GetTxLocks ()) {
1162
+ builder << lock.ShortDebugString ();
1163
+ }
1164
+ return builder;
1165
+ }()
1140
1166
<< " , Cookie=" << ev->Cookie
1141
1167
<< " , error=" << issues.ToString ());
1142
1168
@@ -1167,16 +1193,11 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
1167
1193
shardState->State = TShardState::EState::Finished;
1168
1194
Counters->TxProxyMon ->TxResultAborted ->Inc ();
1169
1195
LocksBroken = true ;
1170
-
1171
- if (!res->Record .GetTxLocks ().empty ()) {
1172
- ResponseEv->BrokenLockPathId = NYql::TKikimrPathId (
1173
- res->Record .GetTxLocks (0 ).GetSchemeShard (),
1174
- res->Record .GetTxLocks (0 ).GetPathId ());
1175
- return ReplyErrorAndDie (Ydb::StatusIds::ABORTED, {});
1176
- }
1177
-
1178
- CheckExecutionComplete ();
1179
- return ;
1196
+ YQL_ENSURE (!res->Record .GetTxLocks ().empty ());
1197
+ ResponseEv->BrokenLockPathId = NYql::TKikimrPathId (
1198
+ res->Record .GetTxLocks (0 ).GetSchemeShard (),
1199
+ res->Record .GetTxLocks (0 ).GetPathId ());
1200
+ ReplyErrorAndDie (Ydb::StatusIds::ABORTED, {});
1180
1201
}
1181
1202
default :
1182
1203
{
@@ -1722,7 +1743,13 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
1722
1743
<< " , LocksOp=" << NKikimrDataEvents::TKqpLocks::ELocksOp_Name (evWriteTransaction->Record .GetLocks ().GetOp ())
1723
1744
<< " , SendingShards=" << shardsToString (evWriteTransaction->Record .GetLocks ().GetSendingShards ())
1724
1745
<< " , ReceivingShards=" << shardsToString (evWriteTransaction->Record .GetLocks ().GetReceivingShards ())
1725
- << " , LocksCount= " << evWriteTransaction->Record .GetLocks ().LocksSize ());
1746
+ << " , Locks= " << [&]() {
1747
+ TStringBuilder builder;
1748
+ for (const auto & lock : evWriteTransaction->Record .GetLocks ().GetLocks ()) {
1749
+ builder << lock.ShortDebugString ();
1750
+ }
1751
+ return builder;
1752
+ }());
1726
1753
1727
1754
LOG_D (" ExecuteEvWriteTransaction traceId.verbosity: " << std::to_string (traceId.GetVerbosity ()));
1728
1755
0 commit comments