Skip to content

Commit cfcad14

Browse files
committed
test: add unit tests
Signed-off-by: WenyXu <[email protected]>
1 parent 2fb96dd commit cfcad14

File tree

3 files changed

+82
-1
lines changed

3 files changed

+82
-1
lines changed

src/metric-engine/src/engine.rs

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -477,8 +477,9 @@ struct MetricEngineInner {
477477
mod test {
478478
use std::collections::HashMap;
479479

480+
use common_telemetry::info;
480481
use store_api::metric_engine_consts::PHYSICAL_TABLE_METADATA_KEY;
481-
use store_api::region_request::{RegionCloseRequest, RegionOpenRequest};
482+
use store_api::region_request::{RegionCloseRequest, RegionFlushRequest, RegionOpenRequest};
482483

483484
use super::*;
484485
use crate::test_util::TestEnv;
@@ -563,4 +564,74 @@ mod test {
563564
assert!(env.metric().region_statistic(logical_region_id).is_none());
564565
assert!(env.metric().region_statistic(physical_region_id).is_some());
565566
}
567+
568+
#[tokio::test]
569+
async fn test_open_region_failure() {
570+
let env = TestEnv::new().await;
571+
env.init_metric_region().await;
572+
let physical_region_id = env.default_physical_region_id();
573+
574+
let metric_engine = env.metric();
575+
metric_engine
576+
.handle_request(
577+
physical_region_id,
578+
RegionRequest::Flush(RegionFlushRequest {
579+
row_group_size: None,
580+
}),
581+
)
582+
.await
583+
.unwrap();
584+
585+
// Close the region
586+
metric_engine
587+
.handle_request(
588+
physical_region_id,
589+
RegionRequest::Close(RegionCloseRequest {}),
590+
)
591+
.await
592+
.unwrap();
593+
594+
let path = format!("{}/metadata/", env.default_region_dir());
595+
let object_store = env.get_object_store().unwrap();
596+
let list = object_store.list(&path).await.unwrap();
597+
// Delete parquet files in metadata region
598+
for entry in list {
599+
if entry.metadata().is_dir() {
600+
continue;
601+
}
602+
if entry.name().ends_with("parquet") {
603+
info!("deleting {}", entry.path());
604+
object_store.delete(entry.path()).await.unwrap();
605+
}
606+
}
607+
608+
// Try to reopen region.
609+
let physical_region_option = [(PHYSICAL_TABLE_METADATA_KEY.to_string(), String::new())]
610+
.into_iter()
611+
.collect();
612+
let open_request = RegionOpenRequest {
613+
engine: METRIC_ENGINE_NAME.to_string(),
614+
region_dir: env.default_region_dir(),
615+
options: physical_region_option,
616+
skip_wal_replay: false,
617+
};
618+
let err = metric_engine
619+
.handle_request(physical_region_id, RegionRequest::Open(open_request))
620+
.await
621+
.unwrap_err();
622+
// Failed to open region because of missing parquet files.
623+
assert_eq!(err.status_code(), StatusCode::StorageUnavailable);
624+
625+
let mito_engine = metric_engine.mito();
626+
let data_region_id = utils::to_data_region_id(physical_region_id);
627+
let metadata_region_id = utils::to_metadata_region_id(physical_region_id);
628+
// The metadata/data region should be closed.
629+
let err = mito_engine.get_metadata(data_region_id).await.unwrap_err();
630+
assert_eq!(err.status_code(), StatusCode::RegionNotFound);
631+
let err = mito_engine
632+
.get_metadata(metadata_region_id)
633+
.await
634+
.unwrap_err();
635+
assert_eq!(err.status_code(), StatusCode::RegionNotFound);
636+
}
566637
}

src/metric-engine/src/engine/open.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,11 @@ impl MetricEngineInner {
9999
// as the manifest could reference files that have already been deleted
100100
// due to compaction operations performed by the region leader.
101101
async fn close_physical_region_on_recovery_failure(&self, physical_region_id: RegionId) {
102+
info!(
103+
"Closing metadata region {} and data region {} on metadata recovery failure",
104+
utils::to_metadata_region_id(physical_region_id),
105+
utils::to_data_region_id(physical_region_id)
106+
);
102107
if let Err(err) = self.close_physical_region(physical_region_id).await {
103108
error!(err; "Failed to close physical region {}", physical_region_id);
104109
}

src/metric-engine/src/test_util.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use mito2::config::MitoConfig;
2323
use mito2::engine::MitoEngine;
2424
use mito2::test_util::TestEnv as MitoTestEnv;
2525
use object_store::util::join_dir;
26+
use object_store::ObjectStore;
2627
use store_api::metadata::ColumnMetadata;
2728
use store_api::metric_engine_consts::{
2829
LOGICAL_TABLE_METADATA_KEY, METRIC_ENGINE_NAME, PHYSICAL_TABLE_METADATA_KEY,
@@ -74,6 +75,10 @@ impl TestEnv {
7475
join_dir(&env_root, "data")
7576
}
7677

78+
pub fn get_object_store(&self) -> Option<ObjectStore> {
79+
self.mito_env.get_object_store()
80+
}
81+
7782
/// Returns a reference to the engine.
7883
pub fn mito(&self) -> MitoEngine {
7984
self.mito.clone()

0 commit comments

Comments
 (0)