diff --git a/snix/castore/src/directoryservice/redb.rs b/snix/castore/src/directoryservice/redb.rs index 2eaa0b515..973ac5f1a 100644 --- a/snix/castore/src/directoryservice/redb.rs +++ b/snix/castore/src/directoryservice/redb.rs @@ -3,7 +3,7 @@ use prost::Message; use redb::{Database, TableDefinition}; use std::{path::PathBuf, sync::Arc}; use tonic::async_trait; -use tracing::{instrument, warn}; +use tracing::{info, instrument, warn}; use super::{ Directory, DirectoryGraph, DirectoryPutter, DirectoryService, LeavesToRootValidator, @@ -41,7 +41,15 @@ impl RedbDirectoryService { } let db = tokio::task::spawn_blocking(|| -> Result<_, redb::Error> { - let db = redb::Database::create(path)?; + let mut db = redb::Database::builder() + .create_with_file_format_v3(true) + .create(path)?; + + // Upgrade redb database file format. + if db.upgrade()? { + info!("Upgraded database format"); + }; + create_schema(&db)?; Ok(db) }) @@ -55,8 +63,9 @@ impl RedbDirectoryService { /// Constructs a new instance using the in-memory backend. pub fn new_temporary() -> Result { - let db = - redb::Database::builder().create_with_backend(redb::backends::InMemoryBackend::new())?; + let db = redb::Database::builder() + .create_with_file_format_v3(true) + .create_with_backend(redb::backends::InMemoryBackend::new())?; create_schema(&db)?; diff --git a/snix/castore/src/errors.rs b/snix/castore/src/errors.rs index 84567fbc3..282ce0097 100644 --- a/snix/castore/src/errors.rs +++ b/snix/castore/src/errors.rs @@ -125,6 +125,12 @@ impl From for Error { } } +impl From for Error { + fn from(value: redb::UpgradeError) -> Self { + Error::StorageError(value.to_string()) + } +} + impl From for Error { fn from(value: std::io::Error) -> Self { if value.kind() == std::io::ErrorKind::InvalidInput { diff --git a/snix/store/src/pathinfoservice/redb.rs b/snix/store/src/pathinfoservice/redb.rs index 851145817..3cd1adff9 100644 --- a/snix/store/src/pathinfoservice/redb.rs +++ b/snix/store/src/pathinfoservice/redb.rs @@ -11,7 +11,7 @@ use snix_castore::{ use std::{path::PathBuf, sync::Arc}; use tokio_stream::wrappers::ReceiverStream; use tonic::async_trait; -use tracing::{instrument, warn}; +use tracing::{info, instrument, warn}; const PATHINFO_TABLE: TableDefinition<[u8; 20], Vec> = TableDefinition::new("pathinfo"); @@ -40,7 +40,15 @@ impl RedbPathInfoService { } let db = tokio::task::spawn_blocking(|| -> Result<_, redb::Error> { - let db = redb::Database::create(path)?; + let mut db = redb::Database::builder() + .create_with_file_format_v3(true) + .create(path)?; + + // Upgrade redb database file format. + if db.upgrade()? { + info!("Upgraded database format"); + }; + create_schema(&db)?; Ok(db) }) @@ -54,8 +62,9 @@ impl RedbPathInfoService { /// Constructs a new instance using the in-memory backend. pub fn new_temporary(instance_name: String) -> Result { - let db = - redb::Database::builder().create_with_backend(redb::backends::InMemoryBackend::new())?; + let db = redb::Database::builder() + .create_with_file_format_v3(true) + .create_with_backend(redb::backends::InMemoryBackend::new())?; create_schema(&db)?;