From 4c4d53ce2383bbbbaed7debc4ee1f581b0cbceee Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 27 Apr 2026 01:44:40 -0700 Subject: [PATCH] fix(seaweed-volume): accept redb aliases for --index (#9237) fix(seaweed-volume): accept redb aliases for --index and rename kinds The Rust volume server's disk-backed index uses redb internally (see RedbNeedleMap), but --index only accepted the legacy `leveldb` spellings, contradicting the wiki and forcing users to read source to figure out what value to pass. - --index now accepts memory|redb|redbMedium|redbLarge as the canonical names, with leveldb/leveldbMedium/leveldbLarge kept as aliases. - Rename NeedleMapKind variants LevelDb*->Redb* so the in-tree names match the actual backend. - Update help text and add a parse-table test covering both names. Refs #9234. --- seaweed-volume/src/config.rs | 33 +++++++++++++++++++----- seaweed-volume/src/storage/needle_map.rs | 6 ++--- seaweed-volume/src/storage/volume.rs | 2 +- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/seaweed-volume/src/config.rs b/seaweed-volume/src/config.rs index ce50b1374..cfcfe71cd 100644 --- a/seaweed-volume/src/config.rs +++ b/seaweed-volume/src/config.rs @@ -63,7 +63,9 @@ pub struct Cli { #[arg(long = "rack", default_value = "")] pub rack: String, - /// Choose [memory|leveldb|leveldbMedium|leveldbLarge] mode for memory~performance balance. + /// Choose [memory|redb|redbMedium|redbLarge] mode for memory~performance balance. + /// `leveldb`/`leveldbMedium`/`leveldbLarge` are accepted as aliases for the + /// corresponding redb backends (Rust volume server uses redb under the hood). #[arg(long = "index", default_value = "memory")] pub index: String, @@ -701,14 +703,16 @@ fn resolve_config(cli: Cli) -> VolumeServerConfig { ip.clone() }; - // Parse index type + // Parse index type. Accept both `redb*` (preferred — what the volume server + // actually uses) and the legacy `leveldb*` names as aliases. let index_type = match cli.index.as_str() { "memory" => NeedleMapKind::InMemory, - "leveldb" => NeedleMapKind::LevelDb, - "leveldbMedium" => NeedleMapKind::LevelDbMedium, - "leveldbLarge" => NeedleMapKind::LevelDbLarge, + "redb" | "leveldb" => NeedleMapKind::Redb, + "redbMedium" | "leveldbMedium" => NeedleMapKind::RedbMedium, + "redbLarge" | "leveldbLarge" => NeedleMapKind::RedbLarge, other => panic!( - "Unknown index type: {}. Use memory|leveldb|leveldbMedium|leveldbLarge", + "Unknown index type: {}. Use memory|redb|redbMedium|redbLarge \ + (leveldb/leveldbMedium/leveldbLarge accepted as aliases)", other ), }; @@ -1374,6 +1378,23 @@ mod tests { assert_eq!(cfg.folders, vec![default_volume_dir()]); } + #[test] + fn test_resolve_config_index_accepts_redb_and_leveldb_aliases() { + let pairs = [ + ("memory", NeedleMapKind::InMemory), + ("redb", NeedleMapKind::Redb), + ("leveldb", NeedleMapKind::Redb), + ("redbMedium", NeedleMapKind::RedbMedium), + ("leveldbMedium", NeedleMapKind::RedbMedium), + ("redbLarge", NeedleMapKind::RedbLarge), + ("leveldbLarge", NeedleMapKind::RedbLarge), + ]; + for (input, expected) in pairs { + let cfg = resolve_config(Cli::parse_from(["bin", "--index", input])); + assert_eq!(cfg.index_type, expected, "input={}", input); + } + } + #[test] fn test_parse_security_config_access_ui() { let _guard = process_state_lock(); diff --git a/seaweed-volume/src/storage/needle_map.rs b/seaweed-volume/src/storage/needle_map.rs index a21bc6caa..140ac5b5e 100644 --- a/seaweed-volume/src/storage/needle_map.rs +++ b/seaweed-volume/src/storage/needle_map.rs @@ -146,9 +146,9 @@ impl NeedleMapMetric { #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum NeedleMapKind { InMemory, - LevelDb, - LevelDbMedium, - LevelDbLarge, + Redb, + RedbMedium, + RedbLarge, } // ============================================================================ diff --git a/seaweed-volume/src/storage/volume.rs b/seaweed-volume/src/storage/volume.rs index 70794c8f0..30d4f0e87 100644 --- a/seaweed-volume/src/storage/volume.rs +++ b/seaweed-volume/src/storage/volume.rs @@ -776,7 +776,7 @@ impl Volume { fn load_index(&mut self) -> Result<(), VolumeError> { let use_redb = matches!( self.needle_map_kind, - NeedleMapKind::LevelDb | NeedleMapKind::LevelDbMedium | NeedleMapKind::LevelDbLarge + NeedleMapKind::Redb | NeedleMapKind::RedbMedium | NeedleMapKind::RedbLarge ); let idx_path = self.file_name(".idx");