1212// See the License for the specific language governing permissions and
1313// limitations under the License.
1414
15- use databend_common_base:: runtime:: GLOBAL_MEM_STAT ;
1615use databend_common_catalog:: table_context:: TableContext ;
1716use databend_common_exception:: Result ;
1817use databend_common_pipeline_transforms:: MemorySettings ;
@@ -33,148 +32,128 @@ pub trait MemorySettingsExt: Sized {
3332impl MemorySettingsExt for MemorySettings {
3433 fn from_join_settings ( ctx : & QueryContext ) -> Result < Self > {
3534 let settings = ctx. get_settings ( ) ;
35+ let mut builder = MemorySettings :: builder ( ) ;
3636
3737 if settings. get_force_join_data_spill ( ) ? {
38- return Ok ( MemorySettings :: always_spill ( 0 ) ) ;
38+ return Ok ( builder . with_max_memory_usage ( 0 ) . build ( ) ) ;
3939 }
4040
41- let mut enable_global_level_spill = false ;
42- let mut max_memory_usage = settings. get_max_memory_usage ( ) ? as usize ;
43-
41+ let max_memory_usage = settings. get_max_memory_usage ( ) ? as usize ;
4442 let max_memory_ratio = settings. get_join_spilling_memory_ratio ( ) ?;
4543 if max_memory_usage != 0 && max_memory_ratio != 0 {
46- enable_global_level_spill = true ;
47- let max_memory_ratio = ( max_memory_ratio as f64 / 100_f64 ) . min ( 1_f64 ) ;
48- max_memory_usage = ( max_memory_usage as f64 * max_memory_ratio ) as usize ;
44+ let ratio = ( max_memory_ratio as f64 / 100.0 ) . min ( 1.0 ) ;
45+ let global_limit = ( max_memory_usage as f64 * ratio ) as usize ;
46+ builder = builder . with_max_memory_usage ( global_limit ) ;
4947 }
5048
5149 let max_query_memory_usage = settings. get_max_query_memory_usage ( ) ? as usize ;
52- let enable_query_level_spill = match settings. get_query_out_of_memory_behavior ( ) ? {
53- OutofMemoryBehavior :: Throw => false ,
54- OutofMemoryBehavior :: Spilling => max_query_memory_usage != 0 ,
55- } ;
56-
57- Ok ( MemorySettings {
58- max_memory_usage,
59- max_query_memory_usage,
60- enable_query_level_spill,
61- enable_global_level_spill,
62- spill_unit_size : 0 ,
63- query_memory_tracking : ctx. get_query_memory_tracking ( ) ,
64- global_memory_tracking : & GLOBAL_MEM_STAT ,
65- } )
50+ let out_of_memory_behavior = settings. get_query_out_of_memory_behavior ( ) ?;
51+ if matches ! ( out_of_memory_behavior, OutofMemoryBehavior :: Spilling )
52+ && max_query_memory_usage != 0
53+ {
54+ builder = builder. with_max_query_memory_usage (
55+ max_query_memory_usage,
56+ ctx. get_query_memory_tracking ( ) ,
57+ ) ;
58+ }
59+
60+ Ok ( builder. build ( ) )
6661 }
6762
6863 fn from_sort_settings ( ctx : & QueryContext ) -> Result < Self > {
64+ let settings = ctx. get_settings ( ) ;
65+ let mut builder = MemorySettings :: builder ( )
66+ . with_spill_unit_size ( settings. get_sort_spilling_batch_bytes ( ) ?) ;
67+
6968 if !ctx. get_enable_sort_spill ( ) {
70- return Ok ( MemorySettings :: disable_spill ( ) ) ;
69+ return Ok ( builder . with_workload_group ( false ) . build ( ) ) ;
7170 }
7271
73- let settings = ctx. get_settings ( ) ;
74-
7572 if settings. get_force_sort_data_spill ( ) ? {
76- let spilling_batch_bytes = settings. get_sort_spilling_batch_bytes ( ) ?;
77- return Ok ( MemorySettings :: always_spill ( spilling_batch_bytes) ) ;
73+ return Ok ( builder. with_max_memory_usage ( 0 ) . build ( ) ) ;
7874 }
7975
80- let mut enable_global_level_spill = false ;
81- let mut max_memory_usage = settings. get_max_memory_usage ( ) ? as usize ;
82-
76+ let max_memory_usage = settings. get_max_memory_usage ( ) ? as usize ;
8377 let max_memory_ratio = settings. get_sort_spilling_memory_ratio ( ) ?;
8478 if max_memory_usage != 0 && max_memory_ratio != 0 {
85- enable_global_level_spill = true ;
86- let max_memory_ratio = ( max_memory_ratio as f64 / 100_f64 ) . min ( 1_f64 ) ;
87- max_memory_usage = ( max_memory_usage as f64 * max_memory_ratio ) as usize ;
79+ let ratio = ( max_memory_ratio as f64 / 100.0 ) . min ( 1.0 ) ;
80+ let global_limit = ( max_memory_usage as f64 * ratio ) as usize ;
81+ builder = builder . with_max_memory_usage ( global_limit ) ;
8882 }
8983
9084 let max_query_memory_usage = settings. get_max_query_memory_usage ( ) ? as usize ;
91- let enable_query_level_spill = match settings. get_query_out_of_memory_behavior ( ) ? {
92- OutofMemoryBehavior :: Throw => false ,
93- OutofMemoryBehavior :: Spilling => max_query_memory_usage != 0 ,
94- } ;
95-
96- let spilling_batch_bytes = settings. get_sort_spilling_batch_bytes ( ) ?;
97-
98- Ok ( MemorySettings {
99- max_memory_usage,
100- max_query_memory_usage,
101- enable_query_level_spill,
102- enable_global_level_spill,
103- query_memory_tracking : ctx. get_query_memory_tracking ( ) ,
104- spill_unit_size : spilling_batch_bytes,
105- global_memory_tracking : & GLOBAL_MEM_STAT ,
106- } )
85+ let out_of_memory_behavior = settings. get_query_out_of_memory_behavior ( ) ?;
86+ if matches ! ( out_of_memory_behavior, OutofMemoryBehavior :: Spilling )
87+ && max_query_memory_usage != 0
88+ {
89+ builder = builder. with_max_query_memory_usage (
90+ max_query_memory_usage,
91+ ctx. get_query_memory_tracking ( ) ,
92+ ) ;
93+ }
94+
95+ Ok ( builder. build ( ) )
10796 }
10897
10998 fn from_window_settings ( ctx : & QueryContext ) -> Result < Self > {
11099 let settings = ctx. get_settings ( ) ;
100+ let spill_unit_size = settings. get_window_spill_unit_size_mb ( ) ? * 1024 * 1024 ;
101+ let mut builder = MemorySettings :: builder ( ) . with_spill_unit_size ( spill_unit_size) ;
111102
112103 if settings. get_force_window_data_spill ( ) ? {
113- let spill_unit_size = settings. get_window_spill_unit_size_mb ( ) ? * 1024 * 1024 ;
114- return Ok ( MemorySettings :: always_spill ( spill_unit_size) ) ;
104+ return Ok ( builder. with_max_memory_usage ( 0 ) . build ( ) ) ;
115105 }
116106
117- let mut enable_global_level_spill = false ;
118- let mut max_memory_usage = settings. get_max_memory_usage ( ) ? as usize ;
119-
107+ let max_memory_usage = settings. get_max_memory_usage ( ) ? as usize ;
120108 let max_memory_ratio = settings. get_window_partition_spilling_memory_ratio ( ) ?;
121109 if max_memory_usage != 0 && max_memory_ratio != 0 {
122- enable_global_level_spill = true ;
123- let max_memory_ratio = ( max_memory_ratio as f64 / 100_f64 ) . min ( 1_f64 ) ;
124- max_memory_usage = ( max_memory_usage as f64 * max_memory_ratio ) as usize ;
110+ let ratio = ( max_memory_ratio as f64 / 100.0 ) . min ( 1.0 ) ;
111+ let global_limit = ( max_memory_usage as f64 * ratio ) as usize ;
112+ builder = builder . with_max_memory_usage ( global_limit ) ;
125113 }
126114
127115 let max_query_memory_usage = settings. get_max_query_memory_usage ( ) ? as usize ;
128- let enable_query_level_spill = match settings. get_query_out_of_memory_behavior ( ) ? {
129- OutofMemoryBehavior :: Throw => false ,
130- OutofMemoryBehavior :: Spilling => max_query_memory_usage != 0 ,
131- } ;
132-
133- let spill_unit_size = settings. get_window_spill_unit_size_mb ( ) ? * 1024 * 1024 ;
116+ let out_of_memory_behavior = settings. get_query_out_of_memory_behavior ( ) ?;
117+ if matches ! ( out_of_memory_behavior, OutofMemoryBehavior :: Spilling )
118+ && max_query_memory_usage != 0
119+ {
120+ builder = builder. with_max_query_memory_usage (
121+ max_query_memory_usage,
122+ ctx. get_query_memory_tracking ( ) ,
123+ ) ;
124+ }
134125
135- Ok ( MemorySettings {
136- spill_unit_size,
137- max_memory_usage,
138- max_query_memory_usage,
139- enable_query_level_spill,
140- enable_global_level_spill,
141- query_memory_tracking : ctx. get_query_memory_tracking ( ) ,
142- global_memory_tracking : & GLOBAL_MEM_STAT ,
143- } )
126+ Ok ( builder. build ( ) )
144127 }
145128
146129 fn from_aggregate_settings ( ctx : & QueryContext ) -> Result < Self > {
147130 let settings = ctx. get_settings ( ) ;
131+ let mut builder = MemorySettings :: builder ( ) ;
148132
149133 if settings. get_force_aggregate_data_spill ( ) ? {
150- return Ok ( MemorySettings :: always_spill ( 0 ) ) ;
134+ return Ok ( builder . with_max_memory_usage ( 0 ) . build ( ) ) ;
151135 }
152136
153- let mut enable_global_level_spill = false ;
154- let mut max_memory_usage = settings. get_max_memory_usage ( ) ? as usize ;
155-
137+ let max_memory_usage = settings. get_max_memory_usage ( ) ? as usize ;
156138 let max_memory_ratio = settings. get_aggregate_spilling_memory_ratio ( ) ?;
157139 if max_memory_usage != 0 && max_memory_ratio != 0 {
158- enable_global_level_spill = true ;
159- let max_memory_ratio = ( max_memory_ratio as f64 / 100_f64 ) . min ( 1_f64 ) ;
160- max_memory_usage = ( max_memory_usage as f64 * max_memory_ratio ) as usize ;
140+ let ratio = ( max_memory_ratio as f64 / 100.0 ) . min ( 1.0 ) ;
141+ let global_limit = ( max_memory_usage as f64 * ratio ) as usize ;
142+ builder = builder . with_max_memory_usage ( global_limit ) ;
161143 }
162144
163145 let max_query_memory_usage = settings. get_max_query_memory_usage ( ) ? as usize ;
164- let enable_query_level_spill = match settings. get_query_out_of_memory_behavior ( ) ? {
165- OutofMemoryBehavior :: Throw => false ,
166- OutofMemoryBehavior :: Spilling => max_query_memory_usage != 0 ,
167- } ;
168-
169- Ok ( MemorySettings {
170- max_memory_usage,
171- max_query_memory_usage,
172- enable_query_level_spill,
173- enable_global_level_spill,
174- spill_unit_size : 0 ,
175- query_memory_tracking : ctx. get_query_memory_tracking ( ) ,
176- global_memory_tracking : & GLOBAL_MEM_STAT ,
177- } )
146+ let out_of_memory_behavior = settings. get_query_out_of_memory_behavior ( ) ?;
147+ if matches ! ( out_of_memory_behavior, OutofMemoryBehavior :: Spilling )
148+ && max_query_memory_usage != 0
149+ {
150+ builder = builder. with_max_query_memory_usage (
151+ max_query_memory_usage,
152+ ctx. get_query_memory_tracking ( ) ,
153+ ) ;
154+ }
155+
156+ Ok ( builder. build ( ) )
178157 }
179158}
180159
@@ -201,7 +180,6 @@ mod tests {
201180 let memory_settings = MemorySettings :: from_join_settings ( & ctx) ?;
202181
203182 assert ! ( !memory_settings. enable_global_level_spill) ;
204- assert_eq ! ( memory_settings. max_memory_usage, 0 ) ;
205183 assert ! ( memory_settings. enable_query_level_spill) ;
206184 Ok ( ( ) )
207185 }
0 commit comments