@@ -105,6 +105,9 @@ void TFederatedWriteSessionImpl::Start() {
105
105
106
106
void TFederatedWriteSessionImpl::OpenSubsessionImpl (std::shared_ptr<TDbInfo> db) {
107
107
Y_ABORT_UNLESS (Lock.IsLocked ());
108
+
109
+ ++SubsessionGeneration;
110
+
108
111
if (Subsession) {
109
112
PendingToken.reset ();
110
113
OldSubsession = std::move (Subsession);
@@ -119,14 +122,20 @@ void TFederatedWriteSessionImpl::OpenSubsessionImpl(std::shared_ptr<TDbInfo> db)
119
122
120
123
auto handlers = NTopic::TWriteSessionSettings::TEventHandlers ()
121
124
.HandlersExecutor (Settings.EventHandlers_ .HandlersExecutor_ )
122
- .ReadyToAcceptHandler ([selfCtx = SelfContext](NTopic::TWriteSessionEvent::TReadyToAcceptEvent& ev) {
125
+ .ReadyToAcceptHandler ([selfCtx = SelfContext, generation = SubsessionGeneration ](NTopic::TWriteSessionEvent::TReadyToAcceptEvent& ev) {
123
126
if (auto self = selfCtx->LockShared ()) {
124
- TDeferredWrite deferred (self->Subsession );
127
+ TDeferredWrite deferred;
128
+
125
129
with_lock (self->Lock ) {
130
+ if (generation != self->SubsessionGeneration ) {
131
+ return ;
132
+ }
133
+
126
134
Y_ABORT_UNLESS (!self->PendingToken .has_value ());
127
135
self->PendingToken = std::move (ev.ContinuationToken );
128
136
self->PrepareDeferredWriteImpl (deferred);
129
137
}
138
+
130
139
deferred.DoWrite ();
131
140
}
132
141
})
@@ -149,14 +158,17 @@ void TFederatedWriteSessionImpl::OpenSubsessionImpl(std::shared_ptr<TDbInfo> db)
149
158
self->IssueTokenIfAllowed ();
150
159
}
151
160
})
152
- .SessionClosedHandler ([selfCtx = SelfContext](const NTopic::TSessionClosedEvent & ev) {
161
+ .SessionClosedHandler ([selfCtx = SelfContext, generation = SubsessionGeneration ](const NTopic::TSessionClosedEvent & ev) {
153
162
if (ev.IsSuccess ()) {
154
163
// The subsession was closed by the federated write session itself while creating a new subsession.
155
164
// In this case we get SUCCESS status and don't need to propagate it further.
156
165
return ;
157
166
}
158
167
if (auto self = selfCtx->LockShared ()) {
159
168
with_lock (self->Lock ) {
169
+ if (generation != self->SubsessionGeneration ) {
170
+ return ;
171
+ }
160
172
self->CloseImpl (ev);
161
173
}
162
174
}
@@ -391,6 +403,7 @@ bool TFederatedWriteSessionImpl::PrepareDeferredWriteImpl(TDeferredWrite& deferr
391
403
}
392
404
OriginalMessagesToGetAck.push_back (std::move (OriginalMessagesToPassDown.front ()));
393
405
OriginalMessagesToPassDown.pop_front ();
406
+ deferred.Writer = Subsession;
394
407
deferred.Token .emplace (std::move (*PendingToken));
395
408
deferred.Message .emplace (std::move (OriginalMessagesToGetAck.back ().Message ));
396
409
PendingToken.reset ();
0 commit comments