diff --git a/src/query/service/src/interpreters/hook/compact_hook.rs b/src/query/service/src/interpreters/hook/compact_hook.rs index 9da10d882a10..a291c7610b06 100644 --- a/src/query/service/src/interpreters/hook/compact_hook.rs +++ b/src/query/service/src/interpreters/hook/compact_hook.rs @@ -94,8 +94,9 @@ async fn do_hook_compact( // for mutations other than Insertions, we use an empirical value of 3 segments as the // limit for compaction. to be refined later. { + let auto_compaction_segments_limit = ctx.get_settings().get_auto_compaction_segments_limit()?; CompactionLimits { - segment_limit: Some(3), + segment_limit: Some(auto_compaction_segments_limit as usize), block_limit: None, } } diff --git a/src/query/settings/src/settings_default.rs b/src/query/settings/src/settings_default.rs index 84f90218bd66..6df6e2ae8b27 100644 --- a/src/query/settings/src/settings_default.rs +++ b/src/query/settings/src/settings_default.rs @@ -577,6 +577,12 @@ impl DefaultSettings { mode: SettingMode::Both, range: Some(SettingRange::Numeric(0..=u64::MAX)), }), + ("auto_compaction_segments_limit", DefaultSettingValue { + value: UserSettingValue::UInt64(3), + desc: "The maximum number of segments that can be compacted automatically triggered after write(replace-into/merge-into).", + mode: SettingMode::Both, + range: Some(SettingRange::Numeric(2..=u64::MAX)), + }), ("use_parquet2", DefaultSettingValue { value: UserSettingValue::UInt64(0), desc: "This setting is deprecated", diff --git a/src/query/settings/src/settings_getter_setter.rs b/src/query/settings/src/settings_getter_setter.rs index 4cdeb9597233..aa011e6ea1bd 100644 --- a/src/query/settings/src/settings_getter_setter.rs +++ b/src/query/settings/src/settings_getter_setter.rs @@ -508,6 +508,10 @@ impl Settings { self.try_set_u64("auto_compaction_imperfect_blocks_threshold", val) } + pub fn get_auto_compaction_segments_limit(&self) -> Result { + self.try_get_u64("auto_compaction_segments_limit") + } + pub fn get_use_parquet2(&self) -> Result { Ok(self.try_get_u64("use_parquet2")? != 0) } diff --git a/tests/sqllogictests/suites/base/09_fuse_engine/09_0040_auto_compaction_issue_15760.test b/tests/sqllogictests/suites/base/09_fuse_engine/09_0040_auto_compaction_issue_15760.test index e31149a579b4..3323f8359b2f 100644 --- a/tests/sqllogictests/suites/base/09_fuse_engine/09_0040_auto_compaction_issue_15760.test +++ b/tests/sqllogictests/suites/base/09_fuse_engine/09_0040_auto_compaction_issue_15760.test @@ -43,9 +43,22 @@ statement ok insert into t values(1); +# fourth block(after compaction) +statement ok +set auto_compaction_segments_limit = 2; + +statement ok +insert into t values(1); + +statement ok +replace into t on(c) values(2); + query III select segment_count , block_count , row_count from fuse_snapshot('i15760', 't') limit 20; ---- +2 4 11 +3 5 11 +2 4 10 1 3 9 4 5 9 3 4 8 @@ -57,4 +70,4 @@ select segment_count , block_count , row_count from fuse_snapshot('i15760', 't') 1 1 3 3 3 3 2 2 2 -1 1 1 \ No newline at end of file +1 1 1