@@ -64,14 +64,6 @@ bool ScanOperator::can_read() {
6464 }
6565}
6666
67- bool ScanOperator::is_pending_finish () const {
68- return _node->_scanner_ctx && !_node->_scanner_ctx ->no_schedule ();
69- }
70-
71- Status ScanOperator::try_close (RuntimeState* state) {
72- return _node->try_close (state);
73- }
74-
7567bool ScanOperator::runtime_filters_are_ready_or_timeout () {
7668 return _node->runtime_filters_are_ready_or_timeout ();
7769}
@@ -81,9 +73,8 @@ std::string ScanOperator::debug_string() const {
8173 fmt::format_to (debug_string_buffer, " {}, scanner_ctx is null: {} " ,
8274 SourceOperator::debug_string (), _node->_scanner_ctx == nullptr );
8375 if (_node->_scanner_ctx ) {
84- fmt::format_to (debug_string_buffer, " , num_running_scanners = {}, num_scheduling_ctx = {} " ,
85- _node->_scanner_ctx ->get_num_running_scanners (),
86- _node->_scanner_ctx ->get_num_scheduling_ctx ());
76+ fmt::format_to (debug_string_buffer, " , num_running_scanners = {}" ,
77+ _node->_scanner_ctx ->get_num_running_scanners ());
8778 }
8879 return fmt::to_string (debug_string_buffer);
8980}
@@ -101,9 +92,6 @@ std::string ScanOperator::debug_string() const {
10192template <typename Derived>
10293ScanLocalState<Derived>::ScanLocalState(RuntimeState* state, OperatorXBase* parent)
10394 : ScanLocalStateBase(state, parent) {
104- _finish_dependency = std::make_shared<FinishDependency>(
105- parent->operator_id (), parent->node_id (), parent->get_name () + " _FINISH_DEPENDENCY" ,
106- state->get_query_ctx ());
10795 _filter_dependency = std::make_shared<RuntimeFilterDependency>(
10896 parent->operator_id (), parent->node_id (), parent->get_name () + " _FILTER_DEPENDENCY" ,
10997 state->get_query_ctx ());
@@ -177,7 +165,6 @@ Status ScanLocalState<Derived>::open(RuntimeState* state) {
177165
178166 auto status = _eos ? Status::OK () : _prepare_scanners ();
179167 if (_scanner_ctx) {
180- _finish_dependency->block ();
181168 DCHECK (!_eos && _num_scanners->value () > 0 );
182169 RETURN_IF_ERROR (_scanner_ctx->init ());
183170 RETURN_IF_ERROR (state->exec_env ()->scanner_scheduler ()->submit (_scanner_ctx));
@@ -570,15 +557,14 @@ std::string ScanLocalState<Derived>::debug_string(int indentation_level) const {
570557 PipelineXLocalState<>::debug_string (indentation_level), _eos.load ());
571558 if (_scanner_ctx) {
572559 fmt::format_to (debug_string_buffer, " " );
573- fmt::format_to (
574- debug_string_buffer,
575- " , Scanner Context: (_is_finished = {}, _should_stop = {}, "
576- " _num_running_scanners={}, "
577- " _num_scheduling_ctx = {}, _num_unfinished_scanners = {}, status = {}, error = {})" ,
578- _scanner_ctx->is_finished (), _scanner_ctx->should_stop (),
579- _scanner_ctx->get_num_running_scanners (), _scanner_ctx->get_num_scheduling_ctx (),
580- _scanner_ctx->get_num_unfinished_scanners (), _scanner_ctx->status ().to_string (),
581- _scanner_ctx->status_error ());
560+ fmt::format_to (debug_string_buffer,
561+ " , Scanner Context: (_is_finished = {}, _should_stop = {}, "
562+ " _num_running_scanners={}, "
563+ " _num_unfinished_scanners = {}, status = {}, error = {})" ,
564+ _scanner_ctx->is_finished (), _scanner_ctx->should_stop (),
565+ _scanner_ctx->get_num_running_scanners (),
566+ _scanner_ctx->get_num_unfinished_scanners (),
567+ _scanner_ctx->status ().to_string (), _scanner_ctx->status_error ());
582568 }
583569
584570 return fmt::to_string (debug_string_buffer);
@@ -1226,24 +1212,27 @@ template <typename Derived>
12261212Status ScanLocalState<Derived>::_prepare_scanners() {
12271213 std::list<vectorized::VScannerSPtr> scanners;
12281214 RETURN_IF_ERROR (_init_scanners (&scanners));
1215+ // Init scanner wrapper
1216+ for (auto it = scanners.begin (); it != scanners.end (); ++it) {
1217+ _scanners.emplace_back (std::make_shared<vectorized::ScannerDelegate>(*it));
1218+ }
12291219 if (scanners.empty ()) {
12301220 _eos = true ;
12311221 _scan_dependency->set_ready ();
12321222 } else {
12331223 COUNTER_SET (_num_scanners, static_cast <int64_t >(scanners.size ()));
1234- RETURN_IF_ERROR (_start_scanners (scanners ));
1224+ RETURN_IF_ERROR (_start_scanners (_scanners ));
12351225 }
12361226 return Status::OK ();
12371227}
12381228
12391229template <typename Derived>
12401230Status ScanLocalState<Derived>::_start_scanners(
1241- const std::list<vectorized::VScannerSPtr >& scanners) {
1231+ const std::list<std::shared_ptr< vectorized::ScannerDelegate> >& scanners) {
12421232 auto & p = _parent->cast <typename Derived::Parent>();
12431233 _scanner_ctx = PipScannerContext::create_shared (state (), this , p._output_tuple_desc , scanners,
12441234 p.limit (), state ()->scan_queue_mem_limit (),
1245- p._col_distribute_ids , 1 , _scan_dependency,
1246- _finish_dependency);
1235+ p._col_distribute_ids , 1 , _scan_dependency);
12471236 return Status::OK ();
12481237}
12491238
@@ -1319,9 +1308,6 @@ Status ScanLocalState<Derived>::_init_profile() {
13191308
13201309 _max_scanner_thread_num = ADD_COUNTER (_runtime_profile, " MaxScannerThreadNum" , TUnit::UNIT );
13211310
1322- _wait_for_finish_dependency_timer =
1323- ADD_TIMER (_runtime_profile, " WaitForPendingFinishDependency" );
1324-
13251311 return Status::OK ();
13261312}
13271313
@@ -1429,17 +1415,6 @@ Status ScanOperatorX<LocalStateType>::open(RuntimeState* state) {
14291415 return Status::OK ();
14301416}
14311417
1432- template <typename LocalStateType>
1433- Status ScanOperatorX<LocalStateType>::try_close(RuntimeState* state) {
1434- auto & local_state = get_local_state (state);
1435- if (local_state._scanner_ctx ) {
1436- // mark this scanner ctx as should_stop to make sure scanners will not be scheduled anymore
1437- // TODO: there is a lock in `set_should_stop` may cause some slight impact
1438- local_state._scanner_ctx ->set_should_stop ();
1439- }
1440- return Status::OK ();
1441- }
1442-
14431418template <typename Derived>
14441419Status ScanLocalState<Derived>::close(RuntimeState* state) {
14451420 if (_closed) {
@@ -1451,10 +1426,9 @@ Status ScanLocalState<Derived>::close(RuntimeState* state) {
14511426
14521427 SCOPED_TIMER (exec_time_counter ());
14531428 if (_scanner_ctx) {
1454- _scanner_ctx->clear_and_join ( reinterpret_cast <ScanLocalStateBase*>( this ), state);
1429+ _scanner_ctx->stop_scanners ( state);
14551430 }
14561431 COUNTER_SET (_wait_for_dependency_timer, _scan_dependency->watcher_elapse_time ());
1457- COUNTER_SET (_wait_for_finish_dependency_timer, _finish_dependency->watcher_elapse_time ());
14581432 COUNTER_SET (_wait_for_rf_timer, _filter_dependency->watcher_elapse_time ());
14591433
14601434 return PipelineXLocalState<>::close (state);
@@ -1511,7 +1485,7 @@ Status ScanOperatorX<LocalStateType>::get_block(RuntimeState* state, vectorized:
15111485 if (eos) {
15121486 source_state = SourceState::FINISHED ;
15131487 // reach limit, stop the scanners.
1514- local_state._scanner_ctx ->set_should_stop ( );
1488+ local_state._scanner_ctx ->stop_scanners (state );
15151489 }
15161490
15171491 return Status::OK ();
0 commit comments