@@ -134,6 +134,30 @@ TAutoPtr<TEvPersQueue::TEvHasDataInfoResponse> TPartition::MakeHasDataInfoRespon
134
134
return res;
135
135
}
136
136
137
+ bool TPartition::ProcessHasDataRequest (const THasDataReq& request, const TActorContext& ctx) {
138
+ auto sendResponse = [&](ui64 lagSize, bool readingFinished) {
139
+ auto response = MakeHasDataInfoResponse (lagSize, request.Cookie , readingFinished);
140
+ ctx.Send (request.Sender , response.Release ());
141
+ };
142
+
143
+ if (!IsActive ()) {
144
+ if (request.ReadTimestamp && *request.ReadTimestamp <= EndWriteTimestamp) {
145
+ sendResponse (GetSizeLag (request.Offset ), false );
146
+ } else if (!request.ReadTimestamp && request.Offset < EndOffset) {
147
+ sendResponse (GetSizeLag (request.Offset ), false );
148
+ } else {
149
+ sendResponse (0 , true );
150
+ }
151
+ } else if (request.Offset < EndOffset) {
152
+ sendResponse (GetSizeLag (request.Offset ), false );
153
+ } else {
154
+ return false ;
155
+ }
156
+
157
+ return true ;
158
+ }
159
+
160
+
137
161
void TPartition::ProcessHasDataRequests (const TActorContext& ctx) {
138
162
if (!InitDone) {
139
163
return ;
@@ -148,13 +172,7 @@ void TPartition::ProcessHasDataRequests(const TActorContext& ctx) {
148
172
};
149
173
150
174
for (auto request = HasDataRequests.begin (); request != HasDataRequests.end ();) {
151
- if (request->Offset < EndOffset && (IsActive () || !request->ReadTimestamp || *request->ReadTimestamp < EndWriteTimestamp)) {
152
- auto response = MakeHasDataInfoResponse (GetSizeLag (request->Offset ), request->Cookie );
153
- ctx.Send (request->Sender , response.Release ());
154
- } else if (!IsActive ()) {
155
- auto response = MakeHasDataInfoResponse (0 , request->Cookie , true );
156
- ctx.Send (request->Sender , response.Release ());
157
- } else {
175
+ if (!ProcessHasDataRequest (*request, ctx)) {
158
176
break ;
159
177
}
160
178
@@ -183,32 +201,22 @@ void TPartition::Handle(TEvPersQueue::TEvHasDataInfo::TPtr& ev, const TActorCont
183
201
auto & record = ev->Get ()->Record ;
184
202
Y_ABORT_UNLESS (record.HasSender ());
185
203
204
+ auto now = ctx.Now ();
205
+
186
206
auto cookie = record.HasCookie () ? TMaybe<ui64>(record.GetCookie ()) : TMaybe<ui64>();
187
207
auto readTimestamp = GetReadFrom (record.GetMaxTimeLagMs (), record.GetReadTimestampMs (), TInstant::Zero (), ctx);
188
-
189
208
TActorId sender = ActorIdFromProto (record.GetSender ());
190
- if (InitDone && EndOffset > (ui64)record.GetOffset () && (!readTimestamp || EndWriteTimestamp >= *readTimestamp)) { // already has data, answer right now
191
- auto response = MakeHasDataInfoResponse (GetSizeLag (record.GetOffset ()), cookie);
192
- ctx.Send (sender, response.Release ());
193
- } else if (InitDone && !IsActive ()) {
194
- auto now = ctx.Now ();
195
209
196
- auto & userInfo = UsersInfoStorage-> GetOrCreate ( record.GetClientId (), ctx);
197
- userInfo. UpdateReadOffset (( i64 )EndOffset - 1 , now, now, now, true ) ;
210
+ THasDataReq req{++HasDataReqNum, (ui64) record.GetOffset (), sender, cookie,
211
+ record. HasClientId () && InitDone ? record. GetClientId () : " " , readTimestamp} ;
198
212
199
- auto response = MakeHasDataInfoResponse (0 , cookie, true );
200
- ctx.Send (sender, response.Release ());
201
- } else {
202
- THasDataReq req{++HasDataReqNum, (ui64)record.GetOffset (), sender, cookie,
203
- record.HasClientId () && InitDone ? record.GetClientId () : " " , readTimestamp};
213
+ if (InitDone && !ProcessHasDataRequest (req, ctx)) {
204
214
THasDataDeadline dl{TInstant::MilliSeconds (record.GetDeadline ()), req};
205
215
auto res = HasDataRequests.insert (req);
206
216
HasDataDeadlines.insert (dl);
207
217
Y_ABORT_UNLESS (res.second );
208
218
209
219
if (InitDone && record.HasClientId () && !record.GetClientId ().empty ()) {
210
- auto now = ctx.Now ();
211
-
212
220
auto & userInfo = UsersInfoStorage->GetOrCreate (record.GetClientId (), ctx);
213
221
++userInfo.Subscriptions ;
214
222
userInfo.UpdateReadOffset ((i64 )EndOffset - 1 , now, now, now);
0 commit comments