diff --git a/VERSION b/VERSION index 633b435c..5360b213 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -260120.0 +260202.0 diff --git a/crates/db/src/server.rs b/crates/db/src/server.rs index 7d61308e..88548b5c 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,40 @@ fn map_expiration( Err(err) => Err(err), } } + +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(_) => 0, + operation::Owned::SetExp(_) => 8, + operation::Owned::HDel(hdel) => hdel.field.len(), + 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(_) => 0, + operation::Borrowed::SetExp(_) => 8, + operation::Borrowed::HDel(hdel) => hdel.field.len(), + operation::Borrowed::HSetExp(hset_exp) => hset_exp.field.len() + 8, + _ => 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 { 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,