From b70daafc77c87806afd00521c368545a60e5f574 Mon Sep 17 00:00:00 2001 From: Weny Xu Date: Wed, 5 Aug 2026 14:15:00 +0800 Subject: [PATCH] fix(meta): release region guards after drop rollback (#8751) Signed-off-by: WenyXu --- src/common/meta/src/ddl/drop_table.rs | 5 ++++- src/common/meta/src/ddl/tests/drop_table.rs | 12 ++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/common/meta/src/ddl/drop_table.rs b/src/common/meta/src/ddl/drop_table.rs index d03f8166b4..182b563239 100644 --- a/src/common/meta/src/ddl/drop_table.rs +++ b/src/common/meta/src/ddl/drop_table.rs @@ -456,7 +456,10 @@ impl Procedure for DropTableProcedure { &self.data.region_wal_options, ) .await - .map_err(ProcedureError::external) + .map_err(ProcedureError::external)?; + + self.dropping_regions.clear(); + Ok(()) } } diff --git a/src/common/meta/src/ddl/tests/drop_table.rs b/src/common/meta/src/ddl/tests/drop_table.rs index d2afb73a3d..a278b951dd 100644 --- a/src/common/meta/src/ddl/tests/drop_table.rs +++ b/src/common/meta/src/ddl/tests/drop_table.rs @@ -2646,6 +2646,18 @@ async fn test_on_rollback() { procedure.on_delete_metadata().await.unwrap(); assert!(procedure.rollback_supported()); procedure.rollback(&ctx).await.unwrap(); + assert!(procedure.dropping_regions.is_empty()); + assert_eq!(ddl_context.memory_region_keeper.len(), 0); + + // The physical table can be dropped again after the metadata rollback. + let retry_task = new_drop_table_task("phy_table", physical_table_id, false); + let mut retry = DropTableProcedure::new(retry_task, ddl_context.clone()); + retry.on_prepare().await.unwrap(); + retry.on_delete_metadata().await.unwrap(); + retry.rollback(&ctx).await.unwrap(); + assert!(retry.dropping_regions.is_empty()); + assert_eq!(ddl_context.memory_region_keeper.len(), 0); + // Rollback again assert!(procedure.rollback_supported()); procedure.rollback(&ctx).await.unwrap();