11#pragma once
22
3- #include < base/types.h>
4- #include < Common/ProfileEvents.h>
3+ #include < functional>
54#include < IO/Progress.h>
65#include < Storages/MergeTree/MergeList.h>
6+ #include < base/types.h>
7+ #include < Common/ProfileEvents.h>
78
89
910namespace ProfileEvents
@@ -47,27 +48,23 @@ struct MergeStageProgress
4748class MergeProgressCallback
4849{
4950public:
51+ // It should throw an exception in case the operation should be cancelled
52+ using CancellationChecker = std::function<void ()>;
53+
5054 MergeProgressCallback (
51- MergeListElement * merge_list_element_ptr_, UInt64 & watch_prev_elapsed_, MergeStageProgress & stage_)
55+ MergeListElement * merge_list_element_ptr_,
56+ UInt64 & watch_prev_elapsed_,
57+ MergeStageProgress & stage_,
58+ CancellationChecker && cancellation_checker_)
5259 : merge_list_element_ptr(merge_list_element_ptr_)
5360 , watch_prev_elapsed(watch_prev_elapsed_)
5461 , stage(stage_)
62+ , cancellation_checker(std::move(cancellation_checker_))
5563 {
5664 updateWatch ();
5765 }
5866
59- MergeListElement * merge_list_element_ptr;
60- UInt64 & watch_prev_elapsed;
61- MergeStageProgress & stage;
62-
63- void updateWatch ()
64- {
65- UInt64 watch_curr_elapsed = merge_list_element_ptr->watch .elapsed ();
66- ProfileEvents::increment (ProfileEvents::MergesTimeMilliseconds, (watch_curr_elapsed - watch_prev_elapsed) / 1000000 );
67- watch_prev_elapsed = watch_curr_elapsed;
68- }
69-
70- void operator () (const Progress & value)
67+ void operator ()(const Progress & value)
7168 {
7269 ProfileEvents::increment (ProfileEvents::MergedUncompressedBytes, value.read_bytes );
7370 if (stage.is_first )
@@ -77,6 +74,8 @@ class MergeProgressCallback
7774 }
7875 updateWatch ();
7976
77+ cancellation_checker ();
78+
8079 merge_list_element_ptr->bytes_read_uncompressed += value.read_bytes ;
8180 if (stage.is_first )
8281 merge_list_element_ptr->rows_read += value.read_rows ;
@@ -90,6 +89,25 @@ class MergeProgressCallback
9089 std::memory_order_relaxed);
9190 }
9291 }
92+
93+ private:
94+ MergeListElement * merge_list_element_ptr;
95+ UInt64 & watch_prev_elapsed;
96+ MergeStageProgress & stage;
97+ CancellationChecker cancellation_checker;
98+
99+ void updateWatch ()
100+ {
101+ UInt64 watch_curr_elapsed = merge_list_element_ptr->watch .elapsed ();
102+ watch_prev_elapsed = watch_curr_elapsed;
103+ }
104+
105+ void updateProfileEvents (const Progress & value, ProfileEvents::Event rows_event, ProfileEvents::Event bytes_event) const
106+ {
107+ ProfileEvents::increment (bytes_event, value.read_bytes );
108+ if (stage.is_first )
109+ ProfileEvents::increment (rows_event, value.read_rows );
110+ }
93111};
94112
95113}
0 commit comments