From 622e7f07b48b4325612bfeee20df53f8d19df697 Mon Sep 17 00:00:00 2001 From: Bojan Serafimov Date: Wed, 1 Nov 2023 22:38:19 -0400 Subject: [PATCH] Speed up sort --- pageserver/src/tenant/storage_layer/inmemory_layer.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pageserver/src/tenant/storage_layer/inmemory_layer.rs b/pageserver/src/tenant/storage_layer/inmemory_layer.rs index 1275250bf0..328fc24c18 100644 --- a/pageserver/src/tenant/storage_layer/inmemory_layer.rs +++ b/pageserver/src/tenant/storage_layer/inmemory_layer.rs @@ -345,14 +345,19 @@ impl InMemoryLayer { let cursor = inner.file.block_cursor(); - let mut keys: Vec<(&Key, &VecMap)> = inner.index.iter().collect(); + // Sort the keys because delta layer writer expects them sorted. + // + // NOTE: this sort can take up significant time if the layer has millions of + // keys. To speed up all the comparisons we convert the key to i128 and + // keep the value as a reference. + let mut keys: Vec<_> = inner.index.iter().map(|(k, m)| (k.to_i128(), m)).collect(); keys.sort_by_key(|k| k.0); let ctx = RequestContextBuilder::extend(ctx) .page_content_kind(PageContentKind::InMemoryLayer) .build(); for (key, vec_map) in keys.iter() { - let key = **key; + let key = Key::from_i128(*key); // Write all page versions for (lsn, pos) in vec_map.as_slice() { cursor.read_blob_into_buf(*pos, &mut buf, &ctx).await?;