@@ -30,6 +30,14 @@ export interface PressureState {
3030 pauseReason : string | null ;
3131}
3232
33+ export interface ServerMergeTreeLimits {
34+ partsToThrowInsert : number ;
35+ partsToDelayInsert : number ;
36+ maxPartsInTotal : number ;
37+ inactivePartsToThrowInsert : number ;
38+ inactivePartsToDelayInsert : number ;
39+ }
40+
3341export class ClickHousePressure {
3442 private readonly client : ClickHouseClient ;
3543 private readonly config : BackpressureConfig ;
@@ -41,6 +49,47 @@ export class ClickHousePressure {
4149 this . logger = logger . child ( { component : 'clickhouse-pressure' } ) ;
4250 }
4351
52+ /**
53+ * Query the actual MergeTree settings from the ClickHouse server.
54+ * Returns the server-side limits that govern when inserts are rejected or delayed.
55+ */
56+ static async fetchServerLimits (
57+ client : ClickHouseClient ,
58+ logger : Logger ,
59+ ) : Promise < ServerMergeTreeLimits > {
60+ const result = await client . query ( {
61+ query : `
62+ SELECT name, value
63+ FROM system.merge_tree_settings
64+ WHERE name IN (
65+ 'parts_to_throw_insert',
66+ 'parts_to_delay_insert',
67+ 'max_parts_in_total',
68+ 'inactive_parts_to_throw_insert',
69+ 'inactive_parts_to_delay_insert'
70+ )
71+ ` ,
72+ format : 'JSONEachRow' ,
73+ } ) ;
74+
75+ const rows = await result . json < { name : string ; value : string } > ( ) ;
76+ const map : Record < string , number > = { } ;
77+ for ( const row of rows ) {
78+ map [ row . name ] = Number ( row . value ) ;
79+ }
80+
81+ const limits : ServerMergeTreeLimits = {
82+ partsToThrowInsert : map [ 'parts_to_throw_insert' ] ?? 300 ,
83+ partsToDelayInsert : map [ 'parts_to_delay_insert' ] ?? 150 ,
84+ maxPartsInTotal : map [ 'max_parts_in_total' ] ?? 100000 ,
85+ inactivePartsToThrowInsert : map [ 'inactive_parts_to_throw_insert' ] ?? 0 ,
86+ inactivePartsToDelayInsert : map [ 'inactive_parts_to_delay_insert' ] ?? 0 ,
87+ } ;
88+
89+ logger . info ( { limits } , 'Fetched ClickHouse merge_tree_settings' ) ;
90+ return limits ;
91+ }
92+
4493 async sample ( database : string , table : string ) : Promise < PressureState > {
4594 const results = await Promise . allSettled ( [
4695 this . queryActivePartsTotal ( database , table ) ,
0 commit comments