From 2418e726491991370f0fbefabad237109e7cc500 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Mon, 17 Oct 2022 16:51:01 +0300 Subject: [PATCH] Speed up layer_map::search, by remembering the "envelope" for each layer. Lookups in the R-tree call the "envelope" function for every comparison, and our envelope function isn't very cheap, so that overhead adds up. Create the envelope once, when the layer is inserted into the tree, and store it along with the layer. That uses some more memory per layer, but that's not very significant. Speeds up the search operation 2x --- pageserver/src/tenant/layer_map.rs | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/pageserver/src/tenant/layer_map.rs b/pageserver/src/tenant/layer_map.rs index 495833e3ae..9d914c1839 100644 --- a/pageserver/src/tenant/layer_map.rs +++ b/pageserver/src/tenant/layer_map.rs @@ -62,6 +62,8 @@ pub struct LayerMap { struct LayerRTreeObject { layer: Arc, + + envelope: AABB<[IntKey; 2]>, } // Representation of Key as numeric type. @@ -197,9 +199,16 @@ impl PartialEq for LayerRTreeObject { impl RTreeObject for LayerRTreeObject { type Envelope = AABB<[IntKey; 2]>; fn envelope(&self) -> Self::Envelope { - let key_range = self.layer.get_key_range(); - let lsn_range = self.layer.get_lsn_range(); - AABB::from_corners( + self.envelope + } +} + +impl LayerRTreeObject { + fn new(layer: Arc) -> Self { + let key_range = layer.get_key_range(); + let lsn_range = layer.get_lsn_range(); + + let envelope = AABB::from_corners( [ IntKey::from(key_range.start.to_i128()), IntKey::from(lsn_range.start.0 as i128), @@ -208,7 +217,8 @@ impl RTreeObject for LayerRTreeObject { IntKey::from(key_range.end.to_i128() - 1), IntKey::from(lsn_range.end.0 as i128 - 1), ], // AABB::upper is inclusive, while `key_range.end` and `lsn_range.end` are exclusive - ) + ); + LayerRTreeObject { layer, envelope } } } @@ -338,7 +348,7 @@ impl LayerMap { if layer.get_key_range() == (Key::MIN..Key::MAX) { self.l0_delta_layers.push(layer.clone()); } - self.historic_layers.insert(LayerRTreeObject { layer }); + self.historic_layers.insert(LayerRTreeObject::new(layer)); NUM_ONDISK_LAYERS.inc(); } @@ -362,7 +372,7 @@ impl LayerMap { } assert!(self .historic_layers - .remove(&LayerRTreeObject { layer }) + .remove(&LayerRTreeObject::new(layer)) .is_some()); NUM_ONDISK_LAYERS.dec(); }