diff --git a/src/table-engine/src/engine.rs b/src/table-engine/src/engine.rs index a95a4c9cfc..dbc050cce2 100644 --- a/src/table-engine/src/engine.rs +++ b/src/table-engine/src/engine.rs @@ -8,6 +8,7 @@ use common_error::ext::BoxedError; use common_telemetry::logging; use object_store::ObjectStore; use snafu::{OptionExt, ResultExt}; +use store_api::manifest::{action::ProtocolAction, Manifest}; use store_api::storage::{ self, ColumnDescriptorBuilder, ColumnFamilyDescriptor, ColumnFamilyDescriptorBuilder, ColumnId, CreateOptions, OpenOptions, Region, RegionDescriptorBuilder, RegionId, RegionMeta, @@ -27,6 +28,7 @@ use crate::error::{ self, BuildColumnDescriptorSnafu, BuildColumnFamilyDescriptorSnafu, BuildRegionDescriptorSnafu, BuildRowKeyDescriptorSnafu, MissingTimestampIndexSnafu, Result, }; +use crate::manifest::action::*; use crate::manifest::TableManifest; use crate::table::MitoTable; @@ -317,7 +319,16 @@ impl MitoEngineInner { let manifest = TableManifest::new(&table_manifest_dir(table_name), self.object_store.clone()); - //TODO(dennis): persist table info to table manifest service. + manifest + .update(TableMetaActionList::new(vec![ + TableMetaAction::Protocol(ProtocolAction::new()), + TableMetaAction::Change(Box::new(TableChange { + table_info: table_info.clone(), + })), + ])) + .await + .context(error::UpdateTableManifestSnafu { table_name })?; + logging::info!("Mito engine created table: {:?}.", table_info); let table = Arc::new(MitoTable::new(table_info, region, manifest)); diff --git a/src/table-engine/src/error.rs b/src/table-engine/src/error.rs index 5c217419dc..bdcd7aa84f 100644 --- a/src/table-engine/src/error.rs +++ b/src/table-engine/src/error.rs @@ -95,6 +95,17 @@ pub enum Error { region_name: String, backtrace: Backtrace, }, + + #[snafu(display( + "Failed to update table metadata to manifest, table: {}, source: {}", + table_name, + source, + ))] + UpdateTableManifest { + #[snafu(backtrace)] + source: storage::error::Error, + table_name: String, + }, } impl From for table::error::Error { @@ -111,6 +122,7 @@ impl ErrorExt for Error { match self { CreateRegion { source, .. } | OpenRegion { source, .. } => source.status_code(), + BuildRowKeyDescriptor { .. } | BuildColumnDescriptor { .. } | BuildColumnFamilyDescriptor { .. } @@ -118,6 +130,8 @@ impl ErrorExt for Error { | BuildTableInfo { .. } | BuildRegionDescriptor { .. } | MissingTimestampIndex { .. } => StatusCode::InvalidArguments, + + UpdateTableManifest { .. } => StatusCode::StorageUnavailable, } } diff --git a/src/table-engine/src/manifest.rs b/src/table-engine/src/manifest.rs index d131020560..76d8c79f65 100644 --- a/src/table-engine/src/manifest.rs +++ b/src/table-engine/src/manifest.rs @@ -1,5 +1,5 @@ //! Table manifest service -mod action; +pub mod action; use storage::manifest::ManifestImpl; diff --git a/src/table-engine/src/manifest/action.rs b/src/table-engine/src/manifest/action.rs index 0e33486c2b..4de99a4b22 100644 --- a/src/table-engine/src/manifest/action.rs +++ b/src/table-engine/src/manifest/action.rs @@ -27,7 +27,8 @@ pub struct TableRemove { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] pub enum TableMetaAction { Protocol(ProtocolAction), - Change(TableChange), + // Boxed TableChange to reduce the total size of enum + Change(Box), Remove(TableRemove), } @@ -37,6 +38,22 @@ pub struct TableMetaActionList { pub prev_version: ManifestVersion, } +impl TableMetaActionList { + pub fn with_action(action: TableMetaAction) -> Self { + Self { + actions: vec![action], + prev_version: 0, + } + } + + pub fn new(actions: Vec) -> Self { + Self { + actions, + prev_version: 0, + } + } +} + impl MetaAction for TableMetaActionList { type Error = StorageError;