@@ -2335,18 +2335,20 @@ TPartition::EProcessResult TPartition::BeginTransaction(const TEvPQ::TEvTxCalcPr
2335
2335
bool isAffectedConsumer = AffectedUsers.contains (consumer);
2336
2336
TUserInfoBase& userInfo = GetOrCreatePendingUser (consumer);
2337
2337
2338
- if (!operation.GetReadSessionId ().empty () && operation.GetReadSessionId () != userInfo.Session ) {
2339
- PQ_LOG_D (" Partition " << Partition <<
2340
- " Consumer '" << consumer << " '" <<
2341
- " Bad request (session already dead) " <<
2342
- " RequestSessionId '" << operation.GetReadSessionId () <<
2343
- " CurrentSessionId '" << userInfo.Session <<
2344
- " '" );
2345
- result = false ;
2346
- } else if (operation.GetOnlyCheckCommitedToFinish ()) {
2338
+ if (operation.GetOnlyCheckCommitedToFinish ()) {
2347
2339
if (IsActive () || static_cast <ui64>(userInfo.Offset ) != EndOffset) {
2348
2340
result = false ;
2349
2341
}
2342
+ } else if (!operation.GetReadSessionId ().empty () && operation.GetReadSessionId () != userInfo.Session ) {
2343
+ if (IsActive () || operation.GetCommitOffsetsEnd () < EndOffset || userInfo.Offset != i64 (EndOffset)) {
2344
+ PQ_LOG_D (" Partition " << Partition <<
2345
+ " Consumer '" << consumer << " '" <<
2346
+ " Bad request (session already dead) " <<
2347
+ " RequestSessionId '" << operation.GetReadSessionId () <<
2348
+ " CurrentSessionId '" << userInfo.Session <<
2349
+ " '" );
2350
+ result = false ;
2351
+ }
2350
2352
} else {
2351
2353
if (!operation.GetForceCommit () && operation.GetCommitOffsetsBegin () > operation.GetCommitOffsetsEnd ()) {
2352
2354
PQ_LOG_D (" Partition " << Partition <<
@@ -2380,6 +2382,7 @@ TPartition::EProcessResult TPartition::BeginTransaction(const TEvPQ::TEvTxCalcPr
2380
2382
consumers.insert (consumer);
2381
2383
}
2382
2384
}
2385
+
2383
2386
if (result) {
2384
2387
TxAffectedConsumers.insert (consumers.begin (), consumers.end ());
2385
2388
}
@@ -2868,6 +2871,7 @@ TPartition::EProcessResult TPartition::PreProcessImmediateTx(const NKikimrPQ::TE
2868
2871
" incorrect offset range (begin > end)" );
2869
2872
return EProcessResult::ContinueDrop;
2870
2873
}
2874
+
2871
2875
consumers.insert (user);
2872
2876
}
2873
2877
SetOffsetAffectedConsumers.insert (consumers.begin (), consumers.end ());
@@ -2892,6 +2896,10 @@ void TPartition::ExecImmediateTx(TTransaction& t)
2892
2896
return ;
2893
2897
}
2894
2898
for (const auto & operation : record.GetData ().GetOperations ()) {
2899
+ if (operation.GetOnlyCheckCommitedToFinish ()) {
2900
+ continue ;
2901
+ }
2902
+
2895
2903
if (!operation.HasCommitOffsetsBegin () || !operation.HasCommitOffsetsEnd () || !operation.HasConsumer ()) {
2896
2904
continue ; // Write operation - handled separately via WriteInfo
2897
2905
}
@@ -2932,6 +2940,21 @@ void TPartition::ExecImmediateTx(TTransaction& t)
2932
2940
" incorrect offset range (commit to the future)" );
2933
2941
return ;
2934
2942
}
2943
+
2944
+ if (!operation.GetReadSessionId ().empty () && operation.GetReadSessionId () != pendingUserInfo.Session ) {
2945
+ if (IsActive () || operation.GetCommitOffsetsEnd () < EndOffset || pendingUserInfo.Offset != i64 (EndOffset)) {
2946
+ ScheduleReplyPropose (record,
2947
+ NKikimrPQ::TEvProposeTransactionResult::BAD_REQUEST,
2948
+ NKikimrPQ::TError::BAD_REQUEST,
2949
+ " session already dead" );
2950
+ return ;
2951
+ }
2952
+ }
2953
+
2954
+ if ((i64 )operation.GetCommitOffsetsEnd () < pendingUserInfo.Offset && !operation.GetReadSessionId ().empty ()) {
2955
+ continue ; // this is stale request, answer ok for it
2956
+ }
2957
+
2935
2958
pendingUserInfo.Offset = operation.GetCommitOffsetsEnd ();
2936
2959
}
2937
2960
CommitWriteOperations (t);
0 commit comments