Abstract database behind generic interface and implement alternative drivers #322
6 changed files with 20 additions and 0 deletions
|
@ -19,6 +19,7 @@ pub async fn handle_get_cluster_status(garage: &Arc<Garage>) -> Result<Response<
|
||||||
let res = GetClusterStatusResponse {
|
let res = GetClusterStatusResponse {
|
||||||
node: hex::encode(garage.system.id),
|
node: hex::encode(garage.system.id),
|
||||||
garage_version: garage.system.garage_version(),
|
garage_version: garage.system.garage_version(),
|
||||||
|
db_engine: garage.db.engine(),
|
||||||
known_nodes: garage
|
known_nodes: garage
|
||||||
.system
|
.system
|
||||||
.get_known_nodes()
|
.get_known_nodes()
|
||||||
|
@ -98,6 +99,7 @@ fn get_cluster_layout(garage: &Arc<Garage>) -> GetClusterLayoutResponse {
|
||||||
struct GetClusterStatusResponse {
|
struct GetClusterStatusResponse {
|
||||||
node: String,
|
node: String,
|
||||||
garage_version: &'static str,
|
garage_version: &'static str,
|
||||||
|
db_engine: String,
|
||||||
known_nodes: HashMap<String, KnownNodeResp>,
|
known_nodes: HashMap<String, KnownNodeResp>,
|
||||||
layout: GetClusterLayoutResponse,
|
layout: GetClusterLayoutResponse,
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,6 +63,10 @@ pub fn unabort<R, E>(res: TxResult<R, E>) -> TxOpResult<std::result::Result<R, E
|
||||||
// ----
|
// ----
|
||||||
|
|
||||||
impl Db {
|
impl Db {
|
||||||
|
pub fn engine(&self) -> String {
|
||||||
|
self.0.engine()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn open_tree<S: AsRef<str>>(&self, name: S) -> Result<Tree> {
|
pub fn open_tree<S: AsRef<str>>(&self, name: S) -> Result<Tree> {
|
||||||
let tree_id = self.0.open_tree(name.as_ref())?;
|
let tree_id = self.0.open_tree(name.as_ref())?;
|
||||||
Ok(Tree(self.0.clone(), tree_id))
|
Ok(Tree(self.0.clone(), tree_id))
|
||||||
|
@ -298,6 +302,7 @@ impl<'a> Transaction<'a> {
|
||||||
// ---- Internal interfaces
|
// ---- Internal interfaces
|
||||||
|
|
||||||
pub(crate) trait IDb: Send + Sync {
|
pub(crate) trait IDb: Send + Sync {
|
||||||
|
fn engine(&self) -> String;
|
||||||
fn open_tree(&self, name: &str) -> Result<usize>;
|
fn open_tree(&self, name: &str) -> Result<usize>;
|
||||||
fn list_trees(&self) -> Result<Vec<String>>;
|
fn list_trees(&self) -> Result<Vec<String>>;
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,10 @@ impl LmdbDb {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl IDb for LmdbDb {
|
impl IDb for LmdbDb {
|
||||||
|
fn engine(&self) -> String {
|
||||||
|
"LMDB (using Heed crate)".into()
|
||||||
|
}
|
||||||
|
|
||||||
fn open_tree(&self, name: &str) -> Result<usize> {
|
fn open_tree(&self, name: &str) -> Result<usize> {
|
||||||
let mut trees = self.trees.write().unwrap();
|
let mut trees = self.trees.write().unwrap();
|
||||||
if let Some(i) = trees.1.get(name) {
|
if let Some(i) = trees.1.get(name) {
|
||||||
|
|
|
@ -58,6 +58,10 @@ impl SledDb {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl IDb for SledDb {
|
impl IDb for SledDb {
|
||||||
|
fn engine(&self) -> String {
|
||||||
|
"Sled".into()
|
||||||
|
}
|
||||||
|
|
||||||
fn open_tree(&self, name: &str) -> Result<usize> {
|
fn open_tree(&self, name: &str) -> Result<usize> {
|
||||||
let mut trees = self.trees.write().unwrap();
|
let mut trees = self.trees.write().unwrap();
|
||||||
if let Some(i) = trees.1.get(name) {
|
if let Some(i) = trees.1.get(name) {
|
||||||
|
|
|
@ -71,6 +71,10 @@ impl SqliteDbInner {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl IDb for SqliteDb {
|
impl IDb for SqliteDb {
|
||||||
|
fn engine(&self) -> String {
|
||||||
|
"Sqlite3 (using rusqlite crate)".into()
|
||||||
|
}
|
||||||
|
|
||||||
fn open_tree(&self, name: &str) -> Result<usize> {
|
fn open_tree(&self, name: &str) -> Result<usize> {
|
||||||
let name = format!("tree_{}", name.replace(':', "_COLON_"));
|
let name = format!("tree_{}", name.replace(':', "_COLON_"));
|
||||||
let mut this = self.0.lock().unwrap();
|
let mut this = self.0.lock().unwrap();
|
||||||
|
|
|
@ -672,6 +672,7 @@ impl AdminRpcHandler {
|
||||||
self.garage.system.garage_version(),
|
self.garage.system.garage_version(),
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
writeln!(&mut ret, "\nDatabase engine: {}", self.garage.db.engine()).unwrap();
|
||||||
|
|
||||||
// Gather ring statistics
|
// Gather ring statistics
|
||||||
let ring = self.garage.system.ring.borrow().clone();
|
let ring = self.garage.system.ring.borrow().clone();
|
||||||
|
|
Loading…
Reference in a new issue