From ceaa3d37052389f38dc0d67f4a9fa3ae9b7ff843 Mon Sep 17 00:00:00 2001 From: Hai | RISE <150876604+hai-rise@users.noreply.github.com> Date: Thu, 9 Jan 2025 11:31:53 +0700 Subject: [PATCH] perf(persistence): reuse cursor for updating history indices (#13622) --- .../src/providers/database/provider.rs | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/crates/storage/provider/src/providers/database/provider.rs b/crates/storage/provider/src/providers/database/provider.rs index f2886d664..8f7dbbc21 100644 --- a/crates/storage/provider/src/providers/database/provider.rs +++ b/crates/storage/provider/src/providers/database/provider.rs @@ -801,15 +801,17 @@ impl DatabaseProvider { /// Load shard and remove it. If list is empty, last shard was full or /// there are no shards at all. - fn take_shard(&self, key: T::Key) -> ProviderResult> + fn take_shard( + &self, + cursor: &mut ::CursorMut, + key: T::Key, + ) -> ProviderResult> where T: Table, { - let mut cursor = self.tx.cursor_read::()?; - let shard = cursor.seek_exact(key)?; - if let Some((shard_key, list)) = shard { + if let Some((_, list)) = cursor.seek_exact(key)? { // delete old shard so new one can be inserted. - self.tx.delete::(shard_key, None)?; + cursor.delete_current()?; let list = list.iter().collect::>(); return Ok(list) } @@ -832,13 +834,13 @@ impl DatabaseProvider { P: Copy, T: Table, { + let mut cursor = self.tx.cursor_write::()?; for (partial_key, indices) in index_updates { let mut last_shard = - self.take_shard::(sharded_key_factory(partial_key, u64::MAX))?; + self.take_shard::(&mut cursor, sharded_key_factory(partial_key, u64::MAX))?; last_shard.extend(indices); // Chunk indices and insert them in shards of N size. - let indices = last_shard; - let mut chunks = indices.chunks(sharded_key::NUM_OF_INDICES_IN_SHARD).peekable(); + let mut chunks = last_shard.chunks(sharded_key::NUM_OF_INDICES_IN_SHARD).peekable(); while let Some(list) = chunks.next() { let highest_block_number = if chunks.peek().is_some() { *list.last().expect("`chunks` does not return empty list") @@ -846,9 +848,9 @@ impl DatabaseProvider { // Insert last list with `u64::MAX`. u64::MAX }; - self.tx.put::( + cursor.insert( sharded_key_factory(partial_key, highest_block_number), - BlockNumberList::new_pre_sorted(list.iter().copied()), + &BlockNumberList::new_pre_sorted(list.iter().copied()), )?; } }