diff --git a/pageserver/src/tenant/timeline.rs b/pageserver/src/tenant/timeline.rs index f96d6f1d48..8fe922fa86 100644 --- a/pageserver/src/tenant/timeline.rs +++ b/pageserver/src/tenant/timeline.rs @@ -3987,8 +3987,6 @@ impl Timeline { size, total_size_up_to_lvl ); return Some(compact_tiers); - } else { - return None; } } if skip_tiers.contains(&tier_id) { @@ -5590,6 +5588,7 @@ fn compaction_simulator_1() { let mut next_tier_id = 0; let mut write_total = 0; let l0_total = 400; + let threshold = 8; let mut last_round_tiers_to_compact = vec![]; for i in 0..l0_total { @@ -5626,12 +5625,14 @@ fn compaction_simulator_1() { tiers = new_tiers; } - if let Some(tiers_to_compact) = Timeline::get_compact_task(&skip_tiers, tiers.clone()) { - last_round_tiers_to_compact = tiers_to_compact.clone(); - for &tier in &tiers_to_compact { - skip_tiers.insert(tier); + if tiers.len() > threshold { + if let Some(tiers_to_compact) = Timeline::get_compact_task(&skip_tiers, tiers.clone()) { + last_round_tiers_to_compact = tiers_to_compact.clone(); + for &tier in &tiers_to_compact { + skip_tiers.insert(tier); + } + println!("start {:?}", tiers_to_compact); } - println!("start {:?}", tiers_to_compact); } // println!("--- round {i} ---"); // for &(tier_id, size) in &tiers { @@ -5663,6 +5664,7 @@ fn compaction_simulator_2() { let mut write_total = 0; let l0_total = 400; let mut read_amp = 0; + let threshold = 8; for i in 0..l0_total { tiers.insert(0, (next_tier_id, 1)); @@ -5670,31 +5672,35 @@ fn compaction_simulator_2() { read_amp = read_amp.max(tiers.len()); - if let Some(mut tiers_to_compact) = Timeline::get_compact_task(&skip_tiers, tiers.clone()) { - let mut new_tiers = vec![]; - let mut new_tier_size = 0; - let mut insert_at = 0; - for &(tier_id, size) in &tiers { - if tiers_to_compact.contains(&tier_id) { - new_tier_size += size; - insert_at = new_tiers.len(); - tiers_to_compact.retain(|x| *x != tier_id); - } else { - new_tiers.push((tier_id, size)); + if tiers.len() > threshold { + if let Some(mut tiers_to_compact) = + Timeline::get_compact_task(&skip_tiers, tiers.clone()) + { + let mut new_tiers = vec![]; + let mut new_tier_size = 0; + let mut insert_at = 0; + for &(tier_id, size) in &tiers { + if tiers_to_compact.contains(&tier_id) { + new_tier_size += size; + insert_at = new_tiers.len(); + tiers_to_compact.retain(|x| *x != tier_id); + } else { + new_tiers.push((tier_id, size)); + } } + assert!(tiers_to_compact.is_empty()); + new_tiers.insert(insert_at, (next_tier_id, new_tier_size)); + next_tier_id += 1; + println!( + "finish {:?} -> {}, size = {}", + tiers_to_compact, next_tier_id, new_tier_size + ); + for tier in &tiers_to_compact { + skip_tiers.remove(tier); + } + write_total += new_tier_size; + tiers = new_tiers; } - assert!(tiers_to_compact.is_empty()); - new_tiers.insert(insert_at, (next_tier_id, new_tier_size)); - next_tier_id += 1; - println!( - "finish {:?} -> {}, size = {}", - tiers_to_compact, next_tier_id, new_tier_size - ); - for tier in &tiers_to_compact { - skip_tiers.remove(tier); - } - write_total += new_tier_size; - tiers = new_tiers; } // println!("--- round {i} ---"); @@ -5728,6 +5734,7 @@ fn compaction_simulator_3() { let mut write_total = 0; let l0_total = 400; let mut read_amp = 0; + let threshold = 8; for i in 0..l0_total { tiers.insert(0, (next_tier_id, 1)); @@ -5737,34 +5744,39 @@ fn compaction_simulator_3() { let mut round = 0; - while let Some(mut tiers_to_compact) = - Timeline::get_compact_task(&skip_tiers, tiers.clone()) - { - round += 1; - let mut new_tiers = vec![]; - let mut new_tier_size = 0; - let mut insert_at = 0; - for &(tier_id, size) in &tiers { - if tiers_to_compact.contains(&tier_id) { - new_tier_size += size; - insert_at = new_tiers.len(); - tiers_to_compact.retain(|x| *x != tier_id); - } else { - new_tiers.push((tier_id, size)); + if tiers.len() > threshold { + while let Some(mut tiers_to_compact) = + Timeline::get_compact_task(&skip_tiers, tiers.clone()) + { + if tiers.len() <= threshold { + break; } + round += 1; + let mut new_tiers = vec![]; + let mut new_tier_size = 0; + let mut insert_at = 0; + for &(tier_id, size) in &tiers { + if tiers_to_compact.contains(&tier_id) { + new_tier_size += size; + insert_at = new_tiers.len(); + tiers_to_compact.retain(|x| *x != tier_id); + } else { + new_tiers.push((tier_id, size)); + } + } + assert!(tiers_to_compact.is_empty()); + new_tiers.insert(insert_at, (next_tier_id, new_tier_size)); + next_tier_id += 1; + println!( + "finish {:?} -> {}, size = {}", + tiers_to_compact, next_tier_id, new_tier_size + ); + for tier in &tiers_to_compact { + skip_tiers.remove(tier); + } + write_total += new_tier_size; + tiers = new_tiers; } - assert!(tiers_to_compact.is_empty()); - new_tiers.insert(insert_at, (next_tier_id, new_tier_size)); - next_tier_id += 1; - println!( - "finish {:?} -> {}, size = {}", - tiers_to_compact, next_tier_id, new_tier_size - ); - for tier in &tiers_to_compact { - skip_tiers.remove(tier); - } - write_total += new_tier_size; - tiers = new_tiers; } if round > 3 { diff --git a/vendor/postgres-v14 b/vendor/postgres-v14 index a2daebc6b4..1144aee166 160000 --- a/vendor/postgres-v14 +++ b/vendor/postgres-v14 @@ -1 +1 @@ -Subproject commit a2daebc6b445dcbcca9c18e1711f47c1db7ffb04 +Subproject commit 1144aee1661c79eec65e784a8dad8bd450d9df79 diff --git a/vendor/postgres-v15 b/vendor/postgres-v15 index 2df2ce3744..1984832c74 160000 --- a/vendor/postgres-v15 +++ b/vendor/postgres-v15 @@ -1 +1 @@ -Subproject commit 2df2ce374464a7449e15dfa46c956b73b4f4098b +Subproject commit 1984832c740a7fa0e468bb720f40c525b652835d