4646
4747namespace doris ::pipeline {
4848
49+ Status OlapScanLocalState::init (RuntimeState* state, LocalStateInfo& info) {
50+ RETURN_IF_ERROR (Base::init (state, info));
51+ RETURN_IF_ERROR (_sync_cloud_tablets (state));
52+ return Status::OK ();
53+ }
54+
4955Status OlapScanLocalState::_init_profile () {
5056 RETURN_IF_ERROR (ScanLocalState<OlapScanLocalState>::_init_profile ());
5157 // Rows read from storage.
@@ -359,7 +365,6 @@ Status OlapScanLocalState::_init_scanners(std::list<vectorized::VScannerSPtr>* s
359365 bool has_cpu_limit = state ()->query_options ().__isset .resource_limit &&
360366 state ()->query_options ().resource_limit .__isset .cpu_limit ;
361367
362- RETURN_IF_ERROR (hold_tablets ());
363368 if (enable_parallel_scan && !p._should_run_serial && !has_cpu_limit &&
364369 p._push_down_agg_type == TPushAggOp::NONE &&
365370 (_storage_no_merge () || p._olap_scan_node .is_preaggregation )) {
@@ -453,30 +458,34 @@ Status OlapScanLocalState::_init_scanners(std::list<vectorized::VScannerSPtr>* s
453458 return Status::OK ();
454459}
455460
456- Status OlapScanLocalState::hold_tablets () {
457- if (!_tablets.empty ()) {
458- return Status::OK ();
459- }
460-
461- MonotonicStopWatch timer;
462- timer.start ();
463- _tablets.resize (_scan_ranges.size ());
464- _read_sources.resize (_scan_ranges.size ());
465-
466- if (config::is_cloud_mode ()) {
467- std::vector<SyncRowsetStats> sync_statistics (_scan_ranges.size ());
468- std::vector<std::function<Status ()>> tasks {};
469- tasks.reserve (_scan_ranges.size ());
470- int64_t duration_ns {0 };
471- {
472- SCOPED_RAW_TIMER (&duration_ns);
461+ Status OlapScanLocalState::_sync_cloud_tablets (RuntimeState* state) {
462+ if (config::is_cloud_mode () && !_sync_tablet) {
463+ _pending_tablets_num = _scan_ranges.size ();
464+ if (_pending_tablets_num > 0 ) {
465+ _sync_cloud_tablets_watcher.start ();
466+ _cloud_tablet_dependency = Dependency::create_shared (
467+ _parent->operator_id (), _parent->node_id (), " CLOUD_TABLET_DEP" );
468+ _tablets.resize (_scan_ranges.size ());
469+ _tasks.reserve (_scan_ranges.size ());
470+ _sync_statistics.resize (_scan_ranges.size ());
473471 for (size_t i = 0 ; i < _scan_ranges.size (); i++) {
474- auto * sync_stats = &sync_statistics [i];
472+ auto * sync_stats = &_sync_statistics [i];
475473 int64_t version = 0 ;
476474 std::from_chars (_scan_ranges[i]->version .data (),
477475 _scan_ranges[i]->version .data () + _scan_ranges[i]->version .size (),
478476 version);
479- tasks.emplace_back ([this , sync_stats, version, i]() {
477+ auto task_ctx = state->get_task_execution_context ();
478+ _tasks.emplace_back ([this , sync_stats, version, i, task_ctx]() {
479+ auto task_lock = task_ctx.lock ();
480+ if (task_lock == nullptr ) {
481+ return Status::OK ();
482+ }
483+ Defer defer ([&] {
484+ if (_pending_tablets_num.fetch_sub (1 ) == 1 ) {
485+ _cloud_tablet_dependency->set_ready ();
486+ _sync_cloud_tablets_watcher.stop ();
487+ }
488+ });
480489 auto tablet =
481490 DORIS_TRY (ExecEnv::get_tablet (_scan_ranges[i]->tablet_id , sync_stats));
482491 _tablets[i] = {std::move (tablet), version};
@@ -488,17 +497,37 @@ Status OlapScanLocalState::hold_tablets() {
488497 return Status::OK ();
489498 });
490499 }
491- RETURN_IF_ERROR (
492- cloud::bthread_fork_join (tasks, config::init_scanner_sync_rowsets_parallelism));
500+ RETURN_IF_ERROR (cloud::bthread_fork_join (
501+ _tasks, config::init_scanner_sync_rowsets_parallelism, &_cloud_tablet_future));
502+ }
503+ _sync_tablet = true ;
504+ }
505+ return Status::OK ();
506+ }
507+
508+ Status OlapScanLocalState::prepare (RuntimeState* state) {
509+ if (_prepared) {
510+ return Status::OK ();
511+ }
512+ MonotonicStopWatch timer;
513+ timer.start ();
514+ _read_sources.resize (_scan_ranges.size ());
515+
516+ if (config::is_cloud_mode ()) {
517+ if (!_cloud_tablet_dependency ||
518+ _cloud_tablet_dependency->is_blocked_by (nullptr ) != nullptr ) {
519+ // Remote tablet still in-flight.
520+ return Status::OK ();
493521 }
494- COUNTER_UPDATE (_sync_rowset_timer, duration_ns);
522+ DCHECK (_cloud_tablet_future.valid () && _cloud_tablet_future.get ().ok ());
523+ COUNTER_UPDATE (_sync_rowset_timer, _sync_cloud_tablets_watcher.elapsed_time ());
495524 auto total_rowsets = std::accumulate (
496525 _tablets.cbegin (), _tablets.cend (), 0LL ,
497526 [](long long acc, const auto & tabletWithVersion) {
498527 return acc + tabletWithVersion.tablet ->tablet_meta ()->all_rs_metas ().size ();
499528 });
500529 COUNTER_UPDATE (_sync_rowset_tablets_rowsets_total_num, total_rowsets);
501- for (const auto & sync_stats : sync_statistics ) {
530+ for (const auto & sync_stats : _sync_statistics ) {
502531 COUNTER_UPDATE (_sync_rowset_tablet_meta_cache_hit, sync_stats.tablet_meta_cache_hit );
503532 COUNTER_UPDATE (_sync_rowset_tablet_meta_cache_miss, sync_stats.tablet_meta_cache_miss );
504533 COUNTER_UPDATE (_sync_rowset_get_remote_tablet_meta_rpc_timer,
@@ -518,6 +547,7 @@ Status OlapScanLocalState::hold_tablets() {
518547 sync_stats.get_remote_delete_bitmap_rpc_ns );
519548 }
520549 } else {
550+ _tablets.resize (_scan_ranges.size ());
521551 for (size_t i = 0 ; i < _scan_ranges.size (); i++) {
522552 int64_t version = 0 ;
523553 std::from_chars (_scan_ranges[i]->version .data (),
@@ -553,6 +583,7 @@ Status OlapScanLocalState::hold_tablets() {
553583 cost_secs, print_id (PipelineXLocalState<>::_state->query_id ()), _parent->node_id (),
554584 _scan_ranges.size ());
555585 }
586+ _prepared = true ;
556587 return Status::OK ();
557588}
558589
@@ -765,9 +796,4 @@ OlapScanOperatorX::OlapScanOperatorX(ObjectPool* pool, const TPlanNode& tnode, i
765796 }
766797}
767798
768- Status OlapScanOperatorX::hold_tablets (RuntimeState* state) {
769- auto & local_state = ScanOperatorX<OlapScanLocalState>::get_local_state (state);
770- return local_state.hold_tablets ();
771- }
772-
773799} // namespace doris::pipeline
0 commit comments