From bf4f46628d4e27a07df92841577c52a82f076ca8 Mon Sep 17 00:00:00 2001 From: Darksome Date: Mon, 2 Feb 2026 15:11:12 +0000 Subject: [PATCH 1/5] feat(db): meter write sizes --- crates/db/src/server.rs | 40 ++++++++++++++++++++++++++++++++++- crates/storage_api/src/lib.rs | 9 ++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/crates/db/src/server.rs b/crates/db/src/server.rs index 7d61308e..e5afc47e 100644 --- a/crates/db/src/server.rs +++ b/crates/db/src/server.rs @@ -3,7 +3,7 @@ use { futures::{Stream, StreamExt as _, TryStreamExt as _}, std::{ops::RangeInclusive, sync::Arc}, tap::Pipe as _, - wc::metrics::{future_metrics, FutureExt as _}, + wc::metrics::{self, future_metrics, FutureExt as _}, wcn_rocks::db::{ cf::{ColumnFamilyName, DbColumn}, migration::{ExportFrame, ExportItem}, @@ -17,9 +17,11 @@ use { DataItem, DataType, MapEntry, + MapEntryBorrowed, MapPage, Operation, Record, + RecordBorrowed, RecordExpiration, RecordVersion, StorageApi, @@ -55,6 +57,8 @@ impl StorageApi for Server { async fn execute(&self, op: Operation<'_>) -> storage_api::Result { use storage_api::{Error, ErrorKind}; + meter_write_key_value_sizes(&op); + let res = match op.into_owned() { operation::Owned::Get(op) => self .string_storage() @@ -285,3 +289,37 @@ fn map_expiration( Err(err) => Err(err), } } + +fn meter_write_key_value_sizes(op: &Operation<'_>) { + let bytes = match op { + Operation::Owned(owned) => match owned { + operation::Owned::Set(set) => record_size(&set.record.borrow()), + operation::Owned::HSet(hset) => map_entry_size(&hset.entry.borrow()), + operation::Owned::Del(_) | operation::Owned::SetExp(_) => 0, + operation::Owned::HDel(hdel) => hdel.field.len(), + operation::Owned::HSetExp(hset_exp) => hset_exp.field.len(), + _ => return, + }, + Operation::Borrowed(borrowed) => match borrowed { + operation::Borrowed::Set(set) => record_size(&set.record), + operation::Borrowed::HSet(hset) => map_entry_size(&hset.entry), + operation::Borrowed::Del(_) | operation::Borrowed::SetExp(_) => 0, + operation::Borrowed::HDel(hdel) => hdel.field.len(), + operation::Borrowed::HSetExp(hset_exp) => hset_exp.field.len(), + _ => return, + }, + } as u64; + + let key_bytes = op.key().len() as u64; + + metrics::counter!("write_key_bytes").increment(key_bytes); + metrics::counter!("write_bytes").increment(key_bytes + bytes); +} + +fn record_size(record: &RecordBorrowed<'_>) -> usize { + record.value.len() + 8 // 8 bytes TTL +} + +fn map_entry_size(entry: &MapEntryBorrowed<'_>) -> usize { + record_size(&entry.record) + entry.field.len() +} diff --git a/crates/storage_api/src/lib.rs b/crates/storage_api/src/lib.rs index 4dc61733..899757bb 100644 --- a/crates/storage_api/src/lib.rs +++ b/crates/storage_api/src/lib.rs @@ -280,6 +280,15 @@ pub struct MapEntryBorrowed<'a> { pub record: RecordBorrowed<'a>, } +impl MapEntry { + pub fn borrow(&self) -> MapEntryBorrowed<'_> { + MapEntryBorrowed { + field: &self.field, + record: self.record.borrow(), + } + } +} + /// Expiration time of a [`Record`]. #[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize, Message)] pub struct RecordExpiration { From 3b45c4782d85c42a3695e6d991558ebd313519d3 Mon Sep 17 00:00:00 2001 From: Github Bot Date: Mon, 2 Feb 2026 15:12:39 +0000 Subject: [PATCH 2/5] Bump VERSION to 260202.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 633b435c..5360b213 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -260120.0 +260202.0 From c88d88808e13a2c9b78c8e669e27d1955b28d858 Mon Sep 17 00:00:00 2001 From: Darksome Date: Mon, 2 Feb 2026 15:13:54 +0000 Subject: [PATCH 3/5] fix: include ttl to setexp --- crates/db/src/server.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/db/src/server.rs b/crates/db/src/server.rs index e5afc47e..35b94ac1 100644 --- a/crates/db/src/server.rs +++ b/crates/db/src/server.rs @@ -297,7 +297,7 @@ fn meter_write_key_value_sizes(op: &Operation<'_>) { operation::Owned::HSet(hset) => map_entry_size(&hset.entry.borrow()), operation::Owned::Del(_) | operation::Owned::SetExp(_) => 0, operation::Owned::HDel(hdel) => hdel.field.len(), - operation::Owned::HSetExp(hset_exp) => hset_exp.field.len(), + operation::Owned::HSetExp(hset_exp) => hset_exp.field.len() + 8, // 8 bytes TTL _ => return, }, Operation::Borrowed(borrowed) => match borrowed { @@ -305,7 +305,7 @@ fn meter_write_key_value_sizes(op: &Operation<'_>) { operation::Borrowed::HSet(hset) => map_entry_size(&hset.entry), operation::Borrowed::Del(_) | operation::Borrowed::SetExp(_) => 0, operation::Borrowed::HDel(hdel) => hdel.field.len(), - operation::Borrowed::HSetExp(hset_exp) => hset_exp.field.len(), + operation::Borrowed::HSetExp(hset_exp) => hset_exp.field.len() + 8, // 8 bytes TTL _ => return, }, } as u64; From 885f751e412dd96e8a6bbb88b2a08bdd68d4bef8 Mon Sep 17 00:00:00 2001 From: Darksome Date: Mon, 2 Feb 2026 15:20:24 +0000 Subject: [PATCH 4/5] fix: include ttl to setexp --- crates/db/src/server.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/crates/db/src/server.rs b/crates/db/src/server.rs index 35b94ac1..88548b5c 100644 --- a/crates/db/src/server.rs +++ b/crates/db/src/server.rs @@ -291,21 +291,24 @@ fn map_expiration( } fn meter_write_key_value_sizes(op: &Operation<'_>) { + // 8 is TTL bytes let bytes = match op { Operation::Owned(owned) => match owned { operation::Owned::Set(set) => record_size(&set.record.borrow()), operation::Owned::HSet(hset) => map_entry_size(&hset.entry.borrow()), - operation::Owned::Del(_) | operation::Owned::SetExp(_) => 0, + operation::Owned::Del(_) => 0, + operation::Owned::SetExp(_) => 8, operation::Owned::HDel(hdel) => hdel.field.len(), - operation::Owned::HSetExp(hset_exp) => hset_exp.field.len() + 8, // 8 bytes TTL + operation::Owned::HSetExp(hset_exp) => hset_exp.field.len() + 8, _ => return, }, Operation::Borrowed(borrowed) => match borrowed { operation::Borrowed::Set(set) => record_size(&set.record), operation::Borrowed::HSet(hset) => map_entry_size(&hset.entry), - operation::Borrowed::Del(_) | operation::Borrowed::SetExp(_) => 0, + operation::Borrowed::Del(_) => 0, + operation::Borrowed::SetExp(_) => 8, operation::Borrowed::HDel(hdel) => hdel.field.len(), - operation::Borrowed::HSetExp(hset_exp) => hset_exp.field.len() + 8, // 8 bytes TTL + operation::Borrowed::HSetExp(hset_exp) => hset_exp.field.len() + 8, _ => return, }, } as u64; From e56a6af4bf557f541c9fc9362b815f350d468abe Mon Sep 17 00:00:00 2001 From: Darksome Date: Mon, 2 Feb 2026 15:45:34 +0000 Subject: [PATCH 5/5] deploy database with metrics --- infra/testnet/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infra/testnet/main.tf b/infra/testnet/main.tf index 1df0158d..a40b7ae2 100644 --- a/infra/testnet/main.tf +++ b/infra/testnet/main.tf @@ -110,7 +110,7 @@ locals { eu_operators = { wallet-connect = { vpc_cidr_octet = 105 # 10.105.0.0/16 - db = local.db_config + db = merge(local.db_config, { image = "ghcr.io/walletconnect/wcn-db:885f751-amd64" }) nodes = [ local.node_config, local.node_config,