@@ -45,7 +45,7 @@ void TColumnShardScan::PassAway() {
45
45
46
46
TColumnShardScan::TColumnShardScan (const TActorId& columnShardActorId, const TActorId& scanComputeActorId, const std::shared_ptr<IStoragesManager>& storagesManager,
47
47
const TComputeShardingPolicy& computeShardingPolicy, ui32 scanId, ui64 txId, ui32 scanGen, ui64 requestCookie,
48
- ui64 tabletId, TDuration timeout, std::vector< TReadMetadataBase::TConstPtr>&& readMetadataList ,
48
+ ui64 tabletId, TDuration timeout, const TReadMetadataBase::TConstPtr& readMetadataRange ,
49
49
NKikimrDataEvents::EDataFormat dataFormat, const NColumnShard::TScanCounters& scanCountersPool)
50
50
: StoragesManager(storagesManager)
51
51
, ColumnShardActorId(columnShardActorId)
@@ -57,15 +57,14 @@ TColumnShardScan::TColumnShardScan(const TActorId& columnShardActorId, const TAc
57
57
, RequestCookie(requestCookie)
58
58
, DataFormat(dataFormat)
59
59
, TabletId(tabletId)
60
- , ReadMetadataRanges(std::move(readMetadataList))
61
- , ReadMetadataIndex(0 )
60
+ , ReadMetadataRange(readMetadataRange)
62
61
, Deadline(TInstant::Now() + (timeout ? timeout + SCAN_HARD_TIMEOUT_GAP : SCAN_HARD_TIMEOUT))
63
62
, ScanCountersPool(scanCountersPool)
64
63
, Stats(NTracing::TTraceClient::GetLocalClient(" SHARD" , ::ToString(TabletId)/* , "SCAN_TXID:" + ::ToString(TxId)*/ ))
65
64
, ComputeShardingPolicy(computeShardingPolicy)
66
65
{
67
- AFL_VERIFY (ReadMetadataRanges. size () == 1 );
68
- KeyYqlSchema = ReadMetadataRanges[ReadMetadataIndex] ->GetKeyYqlSchema ();
66
+ AFL_VERIFY (ReadMetadataRange );
67
+ KeyYqlSchema = ReadMetadataRange ->GetKeyYqlSchema ();
69
68
}
70
69
71
70
void TColumnShardScan::Bootstrap (const TActorContext& ctx) {
@@ -81,8 +80,8 @@ void TColumnShardScan::Bootstrap(const TActorContext& ctx) {
81
80
ReadCoordinatorActorId = ctx.Register (new NBlobOperations::NRead::TReadCoordinatorActor (TabletId, SelfId ()));
82
81
83
82
std::shared_ptr<TReadContext> context = std::make_shared<TReadContext>(StoragesManager, ScanCountersPool,
84
- ReadMetadataRanges[ReadMetadataIndex] , SelfId (), ResourceSubscribeActorId, ReadCoordinatorActorId, ComputeShardingPolicy);
85
- ScanIterator = ReadMetadataRanges[ReadMetadataIndex] ->StartScan (context);
83
+ ReadMetadataRange , SelfId (), ResourceSubscribeActorId, ReadCoordinatorActorId, ComputeShardingPolicy);
84
+ ScanIterator = ReadMetadataRange ->StartScan (context);
86
85
87
86
// propagate self actor id // TODO: FlagSubscribeOnSession ?
88
87
Send (ScanComputeActorId, new NKqp::TEvKqpCompute::TEvScanInitActor (ScanId, ctx.SelfID , ScanGen, TabletId), IEventHandle::FlagTrackDelivery);
@@ -92,12 +91,6 @@ void TColumnShardScan::Bootstrap(const TActorContext& ctx) {
92
91
ContinueProcessing ();
93
92
}
94
93
95
- bool TColumnShardScan::ReadNextBlob () {
96
- while (ScanIterator->ReadNextInterval ()) {
97
- }
98
- return true ;
99
- }
100
-
101
94
void TColumnShardScan::HandleScan (NConveyor::TEvExecution::TEvTaskProcessedResult::TPtr& ev) {
102
95
--InFlightReads;
103
96
auto g = Stats->MakeGuard (" task_result" );
@@ -198,21 +191,24 @@ bool TColumnShardScan::ProduceResults() noexcept {
198
191
return false ;
199
192
}
200
193
201
- auto resultOpt = ScanIterator->GetBatch ();
202
- if (!resultOpt) {
203
- ACFL_DEBUG (" stage" , " no data is ready yet" )(" iterator" , ScanIterator->DebugString ());
194
+ auto resultConclusion = ScanIterator->GetBatch ();
195
+ if (resultConclusion.IsFail ()) {
196
+ ACFL_ERROR (" stage" , " got error" )(" iterator" , ScanIterator->DebugString ())(" message" , resultConclusion.GetErrorMessage ());
197
+ SendAbortExecution (resultConclusion.GetErrorMessage ());
198
+
199
+ ScanIterator.reset ();
200
+ Finish (NColumnShard::TScanCounters::EStatusFinish::IteratorInternalErrorResult);
204
201
return false ;
205
202
}
206
- auto & result = *resultOpt;
207
- if (!result.ErrorString .empty ()) {
208
- ACFL_ERROR (" stage" , " got error" )(" iterator" , ScanIterator->DebugString ())(" message" , result.ErrorString );
209
- SendAbortExecution (TString (result.ErrorString .data (), result.ErrorString .size ()));
210
203
211
- ScanIterator.reset ();
212
- Finish (NColumnShard::TScanCounters::EStatusFinish::IteratorInternalError);
204
+ std::optional<TPartialReadResult> resultOpt = resultConclusion.DetachResult ();
205
+ if (!resultOpt) {
206
+ ACFL_DEBUG (" stage" , " no data is ready yet" )(" iterator" , ScanIterator->DebugString ());
213
207
return false ;
214
208
}
215
209
210
+ auto & result = *resultOpt;
211
+
216
212
if (!result.GetRecordsCount ()) {
217
213
ACFL_DEBUG (" stage" , " got empty batch" )(" iterator" , ScanIterator->DebugString ());
218
214
return true ;
@@ -263,14 +259,27 @@ void TColumnShardScan::ContinueProcessing() {
263
259
while (ScanIterator && ProduceResults ()) {
264
260
}
265
261
266
- // Switch to the next range if the current one is finished
267
- if (ScanIterator && ScanIterator->Finished () && ChunksLimiter.HasMore ()) {
268
- NextReadMetadata ();
269
- }
270
-
271
262
if (ScanIterator) {
272
- // Make read-ahead requests for the subsequent blobs
273
- ReadNextBlob ();
263
+ // Switch to the next range if the current one is finished
264
+ if (ScanIterator->Finished () && ChunksLimiter.HasMore ()) {
265
+ auto g = Stats->MakeGuard (" Finish" );
266
+ MakeResult ();
267
+ SendResult (false , true );
268
+ ScanIterator.reset ();
269
+ Finish (NColumnShard::TScanCounters::EStatusFinish::Success);
270
+ } else {
271
+ while (true ) {
272
+ TConclusion<bool > hasMoreData = ScanIterator->ReadNextInterval ();
273
+ if (hasMoreData.IsFail ()) {
274
+ ACFL_ERROR (" event" , " ContinueProcessing" )(" error" , hasMoreData.GetErrorMessage ());
275
+ ScanIterator.reset ();
276
+ SendScanError (" iterator_error:" + hasMoreData.GetErrorMessage ());
277
+ return Finish (NColumnShard::TScanCounters::EStatusFinish::IteratorInternalErrorScan);
278
+ } else if (!*hasMoreData) {
279
+ break ;
280
+ }
281
+ }
282
+ }
274
283
}
275
284
AFL_VERIFY (!ScanIterator || !ChunksLimiter.HasMore () || InFlightReads || ScanCountersPool.InWaiting ())(" scan_actor_id" , ScanActorId)(" tx_id" , TxId)(" scan_id" , ScanId)(" gen" , ScanGen)(" tablet" , TabletId)
276
285
(" debug" , ScanIterator->DebugString ());
@@ -286,21 +295,6 @@ void TColumnShardScan::MakeResult(size_t reserveRows /*= 0*/) {
286
295
}
287
296
}
288
297
289
- void TColumnShardScan::NextReadMetadata () {
290
- auto g = Stats->MakeGuard (" NextReadMetadata" );
291
- if (++ReadMetadataIndex == ReadMetadataRanges.size ()) {
292
- // Send empty batch with "finished" flag
293
- MakeResult ();
294
- SendResult (false , true );
295
- ScanIterator.reset ();
296
- return Finish (NColumnShard::TScanCounters::EStatusFinish::Success);
297
- }
298
-
299
- auto context = std::make_shared<TReadContext>(StoragesManager, ScanCountersPool, ReadMetadataRanges[ReadMetadataIndex], SelfId (),
300
- ResourceSubscribeActorId, ReadCoordinatorActorId, ComputeShardingPolicy);
301
- ScanIterator = ReadMetadataRanges[ReadMetadataIndex]->StartScan (context);
302
- }
303
-
304
298
void TColumnShardScan::AddRow (const TConstArrayRef<TCell>& row) {
305
299
Result->Rows .emplace_back (TOwnedCellVec::Make (row));
306
300
++Rows;
@@ -379,11 +373,10 @@ bool TColumnShardScan::SendResult(bool pageFault, bool lastBatch) {
379
373
return true ;
380
374
}
381
375
382
- void TColumnShardScan::SendScanError (TString reason /* = {}*/ ) {
376
+ void TColumnShardScan::SendScanError (const TString& reason) {
377
+ AFL_VERIFY (reason);
383
378
TString msg = TStringBuilder () << " Scan failed at tablet " << TabletId;
384
- if (!reason.empty ()) {
385
- msg += " , reason: " + reason;
386
- }
379
+ msg += " , reason: " + reason;
387
380
388
381
auto ev = MakeHolder<NKqp::TEvKqpCompute::TEvScanError>(ScanGen, TabletId);
389
382
ev->Record .SetStatus (Ydb::StatusIds::GENERIC_ERROR);
@@ -393,12 +386,11 @@ void TColumnShardScan::SendScanError(TString reason /*= {}*/) {
393
386
Send (ScanComputeActorId, ev.Release ());
394
387
}
395
388
396
- void TColumnShardScan::SendAbortExecution (TString reason /* = {}*/ ) {
389
+ void TColumnShardScan::SendAbortExecution (const TString& reason) {
390
+ AFL_VERIFY (reason);
397
391
auto status = NYql::NDqProto::StatusIds::PRECONDITION_FAILED;
398
392
TString msg = TStringBuilder () << " Scan failed at tablet " << TabletId;
399
- if (!reason.empty ()) {
400
- msg += " , reason: " + reason;
401
- }
393
+ msg += " , reason: " + reason;
402
394
403
395
Send (ScanComputeActorId, new NKqp::TEvKqp::TEvAbortExecution (status, msg));
404
396
}
0 commit comments