@@ -2343,18 +2343,20 @@ TPartition::EProcessResult TPartition::BeginTransaction(const TEvPQ::TEvTxCalcPr
2343
2343
bool isAffectedConsumer = AffectedUsers.contains (consumer);
2344
2344
TUserInfoBase& userInfo = GetOrCreatePendingUser (consumer);
2345
2345
2346
- if (!operation.GetReadSessionId ().empty () && operation.GetReadSessionId () != userInfo.Session ) {
2347
- PQ_LOG_D (" Partition " << Partition <<
2348
- " Consumer '" << consumer << " '" <<
2349
- " Bad request (session already dead) " <<
2350
- " RequestSessionId '" << operation.GetReadSessionId () <<
2351
- " CurrentSessionId '" << userInfo.Session <<
2352
- " '" );
2353
- result = false ;
2354
- } else if (operation.GetOnlyCheckCommitedToFinish ()) {
2346
+ if (operation.GetOnlyCheckCommitedToFinish ()) {
2355
2347
if (IsActive () || static_cast <ui64>(userInfo.Offset ) != EndOffset) {
2356
2348
result = false ;
2357
2349
}
2350
+ } else if (!operation.GetReadSessionId ().empty () && operation.GetReadSessionId () != userInfo.Session ) {
2351
+ if (IsActive () || operation.GetCommitOffsetsEnd () < EndOffset || userInfo.Offset != i64 (EndOffset)) {
2352
+ PQ_LOG_D (" Partition " << Partition <<
2353
+ " Consumer '" << consumer << " '" <<
2354
+ " Bad request (session already dead) " <<
2355
+ " RequestSessionId '" << operation.GetReadSessionId () <<
2356
+ " CurrentSessionId '" << userInfo.Session <<
2357
+ " '" );
2358
+ result = false ;
2359
+ }
2358
2360
} else {
2359
2361
if (!operation.GetForceCommit () && operation.GetCommitOffsetsBegin () > operation.GetCommitOffsetsEnd ()) {
2360
2362
PQ_LOG_D (" Partition " << Partition <<
@@ -2388,6 +2390,7 @@ TPartition::EProcessResult TPartition::BeginTransaction(const TEvPQ::TEvTxCalcPr
2388
2390
consumers.insert (consumer);
2389
2391
}
2390
2392
}
2393
+
2391
2394
if (result) {
2392
2395
TxAffectedConsumers.insert (consumers.begin (), consumers.end ());
2393
2396
}
@@ -2876,6 +2879,7 @@ TPartition::EProcessResult TPartition::PreProcessImmediateTx(const NKikimrPQ::TE
2876
2879
" incorrect offset range (begin > end)" );
2877
2880
return EProcessResult::ContinueDrop;
2878
2881
}
2882
+
2879
2883
consumers.insert (user);
2880
2884
}
2881
2885
SetOffsetAffectedConsumers.insert (consumers.begin (), consumers.end ());
@@ -2900,6 +2904,10 @@ void TPartition::ExecImmediateTx(TTransaction& t)
2900
2904
return ;
2901
2905
}
2902
2906
for (const auto & operation : record.GetData ().GetOperations ()) {
2907
+ if (operation.GetOnlyCheckCommitedToFinish ()) {
2908
+ continue ;
2909
+ }
2910
+
2903
2911
if (!operation.HasCommitOffsetsBegin () || !operation.HasCommitOffsetsEnd () || !operation.HasConsumer ()) {
2904
2912
continue ; // Write operation - handled separately via WriteInfo
2905
2913
}
@@ -2940,6 +2948,21 @@ void TPartition::ExecImmediateTx(TTransaction& t)
2940
2948
" incorrect offset range (commit to the future)" );
2941
2949
return ;
2942
2950
}
2951
+
2952
+ if (!operation.GetReadSessionId ().empty () && operation.GetReadSessionId () != pendingUserInfo.Session ) {
2953
+ if (IsActive () || operation.GetCommitOffsetsEnd () < EndOffset || pendingUserInfo.Offset != i64 (EndOffset)) {
2954
+ ScheduleReplyPropose (record,
2955
+ NKikimrPQ::TEvProposeTransactionResult::BAD_REQUEST,
2956
+ NKikimrPQ::TError::BAD_REQUEST,
2957
+ " session already dead" );
2958
+ return ;
2959
+ }
2960
+ }
2961
+
2962
+ if ((i64 )operation.GetCommitOffsetsEnd () < pendingUserInfo.Offset && !operation.GetReadSessionId ().empty ()) {
2963
+ continue ; // this is stale request, answer ok for it
2964
+ }
2965
+
2943
2966
pendingUserInfo.Offset = operation.GetCommitOffsetsEnd ();
2944
2967
}
2945
2968
CommitWriteOperations (t);
0 commit comments