@@ -2378,18 +2378,20 @@ TPartition::EProcessResult TPartition::BeginTransaction(const TEvPQ::TEvTxCalcPr
2378
2378
bool isAffectedConsumer = AffectedUsers.contains (consumer);
2379
2379
TUserInfoBase& userInfo = GetOrCreatePendingUser (consumer);
2380
2380
2381
- if (!operation.GetReadSessionId ().empty () && operation.GetReadSessionId () != userInfo.Session ) {
2382
- PQ_LOG_D (" Partition " << Partition <<
2383
- " Consumer '" << consumer << " '" <<
2384
- " Bad request (session already dead) " <<
2385
- " RequestSessionId '" << operation.GetReadSessionId () <<
2386
- " CurrentSessionId '" << userInfo.Session <<
2387
- " '" );
2388
- result = false ;
2389
- } else if (operation.GetOnlyCheckCommitedToFinish ()) {
2381
+ if (operation.GetOnlyCheckCommitedToFinish ()) {
2390
2382
if (IsActive () || static_cast <ui64>(userInfo.Offset ) != EndOffset) {
2391
2383
result = false ;
2392
2384
}
2385
+ } else if (!operation.GetReadSessionId ().empty () && operation.GetReadSessionId () != userInfo.Session ) {
2386
+ if (IsActive () || operation.GetCommitOffsetsEnd () < EndOffset || userInfo.Offset != i64 (EndOffset)) {
2387
+ PQ_LOG_D (" Partition " << Partition <<
2388
+ " Consumer '" << consumer << " '" <<
2389
+ " Bad request (session already dead) " <<
2390
+ " RequestSessionId '" << operation.GetReadSessionId () <<
2391
+ " CurrentSessionId '" << userInfo.Session <<
2392
+ " '" );
2393
+ result = false ;
2394
+ }
2393
2395
} else {
2394
2396
if (!operation.GetForceCommit () && operation.GetCommitOffsetsBegin () > operation.GetCommitOffsetsEnd ()) {
2395
2397
PQ_LOG_D (" Partition " << Partition <<
@@ -2423,6 +2425,7 @@ TPartition::EProcessResult TPartition::BeginTransaction(const TEvPQ::TEvTxCalcPr
2423
2425
consumers.insert (consumer);
2424
2426
}
2425
2427
}
2428
+
2426
2429
if (result) {
2427
2430
TxAffectedConsumers.insert (consumers.begin (), consumers.end ());
2428
2431
}
@@ -2913,6 +2916,7 @@ TPartition::EProcessResult TPartition::PreProcessImmediateTx(const NKikimrPQ::TE
2913
2916
" incorrect offset range (begin > end)" );
2914
2917
return EProcessResult::ContinueDrop;
2915
2918
}
2919
+
2916
2920
consumers.insert (user);
2917
2921
}
2918
2922
SetOffsetAffectedConsumers.insert (consumers.begin (), consumers.end ());
@@ -2937,6 +2941,10 @@ void TPartition::ExecImmediateTx(TTransaction& t)
2937
2941
return ;
2938
2942
}
2939
2943
for (const auto & operation : record.GetData ().GetOperations ()) {
2944
+ if (operation.GetOnlyCheckCommitedToFinish ()) {
2945
+ continue ;
2946
+ }
2947
+
2940
2948
if (!operation.HasCommitOffsetsBegin () || !operation.HasCommitOffsetsEnd () || !operation.HasConsumer ()) {
2941
2949
continue ; // Write operation - handled separately via WriteInfo
2942
2950
}
@@ -2977,6 +2985,21 @@ void TPartition::ExecImmediateTx(TTransaction& t)
2977
2985
" incorrect offset range (commit to the future)" );
2978
2986
return ;
2979
2987
}
2988
+
2989
+ if (!operation.GetReadSessionId ().empty () && operation.GetReadSessionId () != pendingUserInfo.Session ) {
2990
+ if (IsActive () || operation.GetCommitOffsetsEnd () < EndOffset || pendingUserInfo.Offset != i64 (EndOffset)) {
2991
+ ScheduleReplyPropose (record,
2992
+ NKikimrPQ::TEvProposeTransactionResult::BAD_REQUEST,
2993
+ NKikimrPQ::TError::BAD_REQUEST,
2994
+ " session already dead" );
2995
+ return ;
2996
+ }
2997
+ }
2998
+
2999
+ if ((i64 )operation.GetCommitOffsetsEnd () < pendingUserInfo.Offset && !operation.GetReadSessionId ().empty ()) {
3000
+ continue ; // this is stale request, answer ok for it
3001
+ }
3002
+
2980
3003
pendingUserInfo.Offset = operation.GetCommitOffsetsEnd ();
2981
3004
}
2982
3005
CommitWriteOperations (t);
0 commit comments