Persist backend per database id in admin metadata so restarts and lazy opens always use the correct engine (Sled/Redb)
This commit is contained in:
47
src/rpc.rs
47
src/rpc.rs
@@ -158,14 +158,42 @@ impl RpcServerImpl {
|
||||
));
|
||||
}
|
||||
|
||||
// Create server instance with default options
|
||||
// Resolve effective backend for this db from admin meta or filesystem; fallback to default
|
||||
let meta_backend = admin_meta::get_database_backend(&self.base_dir, self.backend.clone(), &self.admin_secret, db_id)
|
||||
.ok()
|
||||
.flatten();
|
||||
let db_path = std::path::PathBuf::from(&self.base_dir).join(format!("{}.db", db_id));
|
||||
let sniffed_backend = if db_path.exists() {
|
||||
if db_path.is_file() {
|
||||
Some(crate::options::BackendType::Redb)
|
||||
} else if db_path.is_dir() {
|
||||
Some(crate::options::BackendType::Sled)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let effective_backend = meta_backend.clone().or(sniffed_backend).unwrap_or(self.backend.clone());
|
||||
if effective_backend != self.backend {
|
||||
eprintln!(
|
||||
"notice: get_or_create_server: db {} backend resolved to {:?} (server default {:?})",
|
||||
db_id, effective_backend, self.backend
|
||||
);
|
||||
}
|
||||
// If we had to sniff (no meta), persist the resolved backend
|
||||
if meta_backend.is_none() {
|
||||
let _ = admin_meta::set_database_backend(&self.base_dir, self.backend.clone(), &self.admin_secret, db_id, effective_backend.clone());
|
||||
}
|
||||
|
||||
// Create server instance with resolved backend
|
||||
let db_option = DBOption {
|
||||
dir: self.base_dir.clone(),
|
||||
port: 0, // Not used for RPC-managed databases
|
||||
debug: false,
|
||||
encryption_key: None,
|
||||
encrypt: false,
|
||||
backend: self.backend.clone(),
|
||||
backend: effective_backend,
|
||||
admin_secret: self.admin_secret.clone(),
|
||||
};
|
||||
|
||||
@@ -308,17 +336,22 @@ impl RpcServer for RpcServerImpl {
|
||||
return Err(jsonrpsee::types::ErrorObjectOwned::owned(-32000, format!("Failed to ensure base dir: {}", e), None::<()>));
|
||||
}
|
||||
|
||||
// Create server instance using base_dir and admin secret
|
||||
// Map RPC backend to options backend and persist it in admin meta for this db id
|
||||
let opt_backend = match backend {
|
||||
BackendType::Redb => crate::options::BackendType::Redb,
|
||||
BackendType::Sled => crate::options::BackendType::Sled,
|
||||
};
|
||||
admin_meta::set_database_backend(&self.base_dir, self.backend.clone(), &self.admin_secret, db_id, opt_backend.clone())
|
||||
.map_err(|e| jsonrpsee::types::ErrorObjectOwned::owned(-32000, e.0, None::<()>))?;
|
||||
|
||||
// Create server instance using base_dir, chosen backend and admin secret
|
||||
let option = DBOption {
|
||||
dir: self.base_dir.clone(),
|
||||
port: 0, // Not used for RPC-managed databases
|
||||
debug: false,
|
||||
encryption_key: None, // per-db key is stored in admin DB 0
|
||||
encrypt: false, // encryption decided per-db at open time
|
||||
backend: match backend {
|
||||
BackendType::Redb => crate::options::BackendType::Redb,
|
||||
BackendType::Sled => crate::options::BackendType::Sled,
|
||||
},
|
||||
backend: opt_backend,
|
||||
admin_secret: self.admin_secret.clone(),
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user