From 9a814ca123eb72557e4a7a5ffacc3ed9495b4e65 Mon Sep 17 00:00:00 2001 From: Weny Xu Date: Mon, 8 Jun 2026 16:48:23 +0800 Subject: [PATCH] chore: add repartition debug logs (#8245) Signed-off-by: WenyXu --- .../with-minio-repartition-gc.yaml | 2 ++ .../repartition/update_partition_metadata.rs | 1 - src/query/src/dist_plan/analyzer.rs | 8 ++++++-- src/query/src/dist_plan/analyzer/fallback.rs | 11 ++++++---- src/query/src/dist_plan/planner.rs | 9 +++++++++ tests-fuzz/src/validator/row.rs | 7 +++++++ .../ddl/fuzz_repartition_table_chaos.rs | 20 ++++++++++++++----- 7 files changed, 46 insertions(+), 12 deletions(-) diff --git a/.github/actions/setup-greptimedb-cluster/with-minio-repartition-gc.yaml b/.github/actions/setup-greptimedb-cluster/with-minio-repartition-gc.yaml index 5b7f43d81b..969c56d3b1 100644 --- a/.github/actions/setup-greptimedb-cluster/with-minio-repartition-gc.yaml +++ b/.github/actions/setup-greptimedb-cluster/with-minio-repartition-gc.yaml @@ -3,6 +3,8 @@ logging: format: "json" filters: - mito2::sst::file=debug + - query::dist_plan::analyzer=debug + - query::dist_plan::planner=debug meta: configData: |- [runtime] diff --git a/src/meta-srv/src/procedure/repartition/update_partition_metadata.rs b/src/meta-srv/src/procedure/repartition/update_partition_metadata.rs index 8d68a6e8fe..a213b8b225 100644 --- a/src/meta-srv/src/procedure/repartition/update_partition_metadata.rs +++ b/src/meta-srv/src/procedure/repartition/update_partition_metadata.rs @@ -102,7 +102,6 @@ impl State for UpdatePartitionMetadata { new_table_info .meta .partition_column_names() - .cloned() .collect::>(), ); ctx.update_table_info(&table_info_value, table_info_value.update(new_table_info)) diff --git a/src/query/src/dist_plan/analyzer.rs b/src/query/src/dist_plan/analyzer.rs index ba0d5a70c0..5c605dac7a 100644 --- a/src/query/src/dist_plan/analyzer.rs +++ b/src/query/src/dist_plan/analyzer.rs @@ -557,9 +557,13 @@ impl PlanRewriter { let partition_key_indices = info.meta.partition_key_indices.clone(); let schema = info.meta.schema.clone(); let mut partition_cols = partition_key_indices - .into_iter() - .map(|index| schema.column_name_by_index(index).to_string()) + .iter() + .map(|index| schema.column_name_by_index(*index).to_string()) .collect::>(); + debug!( + "PlanRewriter: loaded table partition metadata, table: {}, table_id: {}, partition_key_indices: {:?}, partition_columns: {:?}", + info.name, info.ident.table_id, info.meta.partition_key_indices, partition_cols, + ); let partition_rules = table.partition_rules(); let exist_phy_part_cols_not_in_logical_table = partition_rules diff --git a/src/query/src/dist_plan/analyzer/fallback.rs b/src/query/src/dist_plan/analyzer/fallback.rs index 4cefbbc768..79dfaf904b 100644 --- a/src/query/src/dist_plan/analyzer/fallback.rs +++ b/src/query/src/dist_plan/analyzer/fallback.rs @@ -60,12 +60,15 @@ impl TreeNodeRewriter for FallbackPlanRewriter { let partition_key_indices = info.meta.partition_key_indices.clone(); let schema = info.meta.schema.clone(); let partition_cols = partition_key_indices - .into_iter() - .map(|index| schema.column_name_by_index(index).to_string()) + .iter() + .map(|index| schema.column_name_by_index(*index).to_string()) .collect::>(); debug!( - "FallbackPlanRewriter: table {} has partition columns: {:?}", - info.name, partition_cols + "FallbackPlanRewriter: loaded table partition metadata, table: {}, table_id: {}, partition_key_indices: {:?}, partition_columns: {:?}", + info.name, + info.ident.table_id, + info.meta.partition_key_indices, + partition_cols, ); Some(partition_cols .into_iter() diff --git a/src/query/src/dist_plan/planner.rs b/src/query/src/dist_plan/planner.rs index e6776b7039..a14aefbf5b 100644 --- a/src/query/src/dist_plan/planner.rs +++ b/src/query/src/dist_plan/planner.rs @@ -20,6 +20,7 @@ use ahash::HashMap; use async_trait::async_trait; use catalog::CatalogManagerRef; use common_catalog::consts::{DEFAULT_CATALOG_NAME, DEFAULT_SCHEMA_NAME}; +use common_telemetry::debug; use datafusion::common::Result; use datafusion::datasource::DefaultTableSource; use datafusion::execution::context::SessionState; @@ -225,6 +226,14 @@ impl DistExtensionPlanner { // Extract partition columns let partition_columns: Vec = table_info.meta.partition_column_names().cloned().collect(); + debug!( + "DistExtensionPlanner: loaded table partition metadata, table: {}, table_id: {}, partition_key_indices: {:?}, partition_columns: {:?}, all_regions: {:?}", + table_name, + table_info.table_id(), + table_info.meta.partition_key_indices, + partition_columns, + all_regions, + ); if partition_columns.is_empty() { return Ok(all_regions); } diff --git a/tests-fuzz/src/validator/row.rs b/tests-fuzz/src/validator/row.rs index 728ede0473..5bd83d80d6 100644 --- a/tests-fuzz/src/validator/row.rs +++ b/tests-fuzz/src/validator/row.rs @@ -161,6 +161,13 @@ pub async fn count_values(db: &MySqlPool, sql: &str) -> Result { .context(error::ExecuteQuerySnafu { sql }) } +pub async fn count_values_all(db: &MySqlPool, sql: &str) -> Result> { + sqlx::query_as::<_, ValueCount>(sql) + .fetch_all(db) + .await + .context(error::ExecuteQuerySnafu { sql }) +} + /// Returns all [RowEntry] of the `table_name`. pub async fn fetch_values(db: &MySqlPool, sql: &str) -> Result> { sqlx::query(sql) diff --git a/tests-fuzz/targets/ddl/fuzz_repartition_table_chaos.rs b/tests-fuzz/targets/ddl/fuzz_repartition_table_chaos.rs index 9d8faeebf5..a41d4175ec 100644 --- a/tests-fuzz/targets/ddl/fuzz_repartition_table_chaos.rs +++ b/tests-fuzz/targets/ddl/fuzz_repartition_table_chaos.rs @@ -60,7 +60,7 @@ use tests_fuzz::utils::{ get_gt_fuzz_input_max_rows, init_greptime_connections_via_env, }; use tests_fuzz::validator; -use tests_fuzz::validator::row::count_values; +use tests_fuzz::validator::row::count_values_all; #[derive(Clone)] struct FuzzContext { @@ -230,16 +230,26 @@ async fn validate_table_rows( inserted_rows: u64, ) -> Result<()> { let count_sql = format!("SELECT COUNT(1) AS count FROM {}", table_ctx.name); - let count = count_values(&ctx.greptime, &count_sql).await?; - assert_eq!(count.count as u64, inserted_rows); + let counts = count_values_all(&ctx.greptime, &count_sql).await?; + info!("Validate table row count: sql={count_sql}, expected={inserted_rows}, counts={counts:?}"); + assert_eq!(counts.len(), 1, "count query must return exactly one row"); + assert_eq!(counts[0].count as u64, inserted_rows); let timestamp_column_name = table_ctx.timestamp_column().unwrap().name.clone(); let distinct_count_sql = format!( "SELECT COUNT(DISTINCT {}) AS count FROM {}", timestamp_column_name, table_ctx.name ); - let distinct_count = count_values(&ctx.greptime, &distinct_count_sql).await?; - assert_eq!(distinct_count.count as u64, inserted_rows); + let distinct_counts = count_values_all(&ctx.greptime, &distinct_count_sql).await?; + info!( + "Validate table distinct row count: sql={distinct_count_sql}, expected={inserted_rows}, counts={distinct_counts:?}" + ); + assert_eq!( + distinct_counts.len(), + 1, + "distinct count query must return exactly one row" + ); + assert_eq!(distinct_counts[0].count as u64, inserted_rows); Ok(()) }