diff --git a/src/mito/src/table.rs b/src/mito/src/table.rs index 60ac8e8648..4d6d1352d5 100644 --- a/src/mito/src/table.rs +++ b/src/mito/src/table.rs @@ -394,10 +394,12 @@ fn column_qualified_name(table_name: &str, region_name: &str, column_name: &str) impl MitoTable { pub(crate) fn new( - table_info: TableInfo, + mut table_info: TableInfo, regions: HashMap, manifest: TableManifest, ) -> Self { + // `TableInfo` is recovered from the file, which may contain incorrect content. We align it to real regions. + table_info.meta.region_numbers = regions.keys().copied().collect::>(); Self { table_info: ArcSwap::new(Arc::new(table_info)), regions: ArcSwap::new(Arc::new(regions)), @@ -567,6 +569,16 @@ impl MitoTable { Arc::new(regions) }); + let _ = self.table_info.rcu(|info| { + let mut info = TableInfo::clone(info); + + info.meta + .region_numbers + .retain(|r| !region_numbers.contains(r)); + + Arc::new(info) + }); + Ok(removed) } @@ -646,6 +658,14 @@ impl MitoTable { Arc::new(regions) }); + let _ = self.table_info.rcu(|info| { + let mut info = TableInfo::clone(info); + + info.meta.region_numbers.push(region_number); + + Arc::new(info) + }); + info!( "MitoTable loads new region: {} in table: {}", region_number,