@@ -477,8 +477,9 @@ struct MetricEngineInner {
477
477
mod test {
478
478
use std:: collections:: HashMap ;
479
479
480
+ use common_telemetry:: info;
480
481
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 } ;
482
483
483
484
use super :: * ;
484
485
use crate :: test_util:: TestEnv ;
@@ -563,4 +564,74 @@ mod test {
563
564
assert ! ( env. metric( ) . region_statistic( logical_region_id) . is_none( ) ) ;
564
565
assert ! ( env. metric( ) . region_statistic( physical_region_id) . is_some( ) ) ;
565
566
}
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
+ }
566
637
}
0 commit comments