@@ -368,7 +368,12 @@ impl AnyConfigFragment {
368368 graceful_shutdown_timeout : Some (
369369 * DEFAULT_REGION_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT ,
370370 ) ,
371- region_mover : RegionMoverFragment :: default ( ) ,
371+ region_mover : RegionMoverFragment {
372+ run_before_shutdown : Some ( false ) ,
373+ max_threads : Some ( 1 ) ,
374+ ack : Some ( true ) ,
375+ cli_opts : None ,
376+ } ,
372377 } )
373378 }
374379 HbaseRole :: RestServer => AnyConfigFragment :: RestServer ( HbaseConfigFragment {
@@ -554,14 +559,14 @@ impl Configuration for HbaseConfigFragment {
554559) ]
555560pub struct RegionMover {
556561 /// Move local regions to other servers before terminating a region server's pod.
557- run_before_shutdown : Option < bool > ,
562+ run_before_shutdown : bool ,
558563
559564 /// Maximum number of threads to use for moving regions.
560- max_threads : Option < u16 > ,
565+ max_threads : u16 ,
561566
562567 /// If enabled (default), the region mover will confirm that regions are available on the
563568 /// source as well as the target pods before and after the move.
564- ack : Option < bool > ,
569+ ack : bool ,
565570
566571 #[ fragment_attrs( serde( flatten) ) ]
567572 cli_opts : Option < RegionMoverExtraCliOpts > ,
@@ -578,18 +583,7 @@ pub struct RegionMoverExtraCliOpts {
578583
579584impl Atomic for RegionMoverExtraCliOpts { }
580585
581- impl Default for RegionMover {
582- fn default ( ) -> Self {
583- Self {
584- run_before_shutdown : Some ( false ) ,
585- max_threads : Some ( 1 ) ,
586- ack : Some ( true ) ,
587- cli_opts : None ,
588- }
589- }
590- }
591-
592- #[ derive( Clone , Debug , Default , Fragment , JsonSchema , PartialEq ) ]
586+ #[ derive( Clone , Debug , Fragment , JsonSchema , PartialEq ) ]
593587#[ fragment_attrs(
594588 derive(
595589 Clone ,
@@ -637,8 +631,6 @@ impl Configuration for RegionServerConfigFragment {
637631 _role_name : & str ,
638632 ) -> Result < BTreeMap < String , Option < String > > , stackable_operator:: product_config_utils:: Error >
639633 {
640- // Maps env var name to env var object. This allows env_overrides to work
641- // as expected (i.e. users can override the env var value).
642634 let mut vars: BTreeMap < String , Option < String > > = BTreeMap :: new ( ) ;
643635
644636 vars. insert (
@@ -1137,8 +1129,7 @@ impl AnyServiceConfig {
11371129 pub fn region_mover_args ( & self ) -> String {
11381130 match self {
11391131 AnyServiceConfig :: RegionServer ( config) => {
1140- // TODO: is unwrap_or() the correct way to do it ? (same below)
1141- if config. region_mover . run_before_shutdown . unwrap_or ( false ) {
1132+ if config. region_mover . run_before_shutdown {
11421133 let timeout = config
11431134 . graceful_shutdown_timeout
11441135 . map ( |d| {
@@ -1151,11 +1142,11 @@ impl AnyServiceConfig {
11511142 . unwrap_or ( DEFAULT_REGION_MOVER_TIMEOUT . as_secs ( ) ) ;
11521143 let mut command = vec ! [
11531144 "--maxthreads" . to_string( ) ,
1154- config. region_mover. max_threads. unwrap_or ( 1 ) . to_string( ) ,
1145+ config. region_mover. max_threads. to_string( ) ,
11551146 "--timeout" . to_string( ) ,
11561147 timeout. to_string( ) ,
11571148 ] ;
1158- if !config. region_mover . ack . unwrap_or ( true ) {
1149+ if !config. region_mover . ack {
11591150 command. push ( "--noack" . to_string ( ) ) ;
11601151 }
11611152
@@ -1178,24 +1169,24 @@ impl AnyServiceConfig {
11781169
11791170 pub fn run_region_mover ( & self ) -> bool {
11801171 match self {
1181- AnyServiceConfig :: RegionServer ( config) => {
1182- config. region_mover . run_before_shutdown . unwrap_or ( false )
1183- }
1172+ AnyServiceConfig :: RegionServer ( config) => config. region_mover . run_before_shutdown ,
11841173 _ => false ,
11851174 }
11861175 }
11871176}
11881177
11891178#[ cfg( test) ]
11901179mod tests {
1180+ use rstest:: rstest;
1181+
11911182 use std:: collections:: { BTreeMap , HashMap } ;
11921183
11931184 use indoc:: indoc;
11941185 use stackable_operator:: product_config_utils:: {
11951186 transform_all_roles_to_config, validate_all_roles_and_groups_config,
11961187 } ;
11971188
1198- use crate :: { merged_env, HbaseCluster , HbaseRole } ;
1189+ use crate :: { merged_env, AnyServiceConfig , HbaseCluster , HbaseRole , RegionMoverExtraCliOpts } ;
11991190
12001191 use product_config:: { types:: PropertyNameKind , ProductConfigManager } ;
12011192
@@ -1292,4 +1283,77 @@ spec:
12921283 env_map. get( "TEST_VAR_FROM_MRG" )
12931284 ) ;
12941285 }
1286+
1287+ #[ rstest]
1288+ #[ case( "default" , false , 1 , vec![ ] ) ]
1289+ #[ case( "groupRegionMover" , true , 5 , vec![ "--some" . to_string( ) , "extra" . to_string( ) ] ) ]
1290+ pub fn test_region_mover_merge (
1291+ #[ case] role_group_name : & str ,
1292+ #[ case] run_before_shutdown : bool ,
1293+ #[ case] max_threads : u16 ,
1294+ #[ case] additional_mover_options : Vec < String > ,
1295+ ) {
1296+ let input = indoc ! { r#"
1297+ ---
1298+ apiVersion: hbase.stackable.tech/v1alpha1
1299+ kind: HbaseCluster
1300+ metadata:
1301+ name: test-hbase
1302+ spec:
1303+ image:
1304+ productVersion: 2.4.18
1305+ clusterConfig:
1306+ hdfsConfigMapName: test-hdfs
1307+ zookeeperConfigMapName: test-znode
1308+ masters:
1309+ roleGroups:
1310+ default:
1311+ replicas: 1
1312+ restServers:
1313+ roleGroups:
1314+ default:
1315+ replicas: 1
1316+ regionServers:
1317+ config:
1318+ regionMover:
1319+ runBeforeShutdown: False
1320+ roleGroups:
1321+ default:
1322+ replicas: 1
1323+ groupRegionMover:
1324+ replicas: 1
1325+ config:
1326+ regionMover:
1327+ runBeforeShutdown: True
1328+ maxThreads: 5
1329+ additionalMoverOptions: ["--some", "extra"]
1330+ "# } ;
1331+
1332+ let deserializer = serde_yaml:: Deserializer :: from_str ( input) ;
1333+ let hbase: HbaseCluster =
1334+ serde_yaml:: with:: singleton_map_recursive:: deserialize ( deserializer) . unwrap ( ) ;
1335+
1336+ let hbase_role = HbaseRole :: RegionServer ;
1337+ let rolegroup = hbase. server_rolegroup_ref ( hbase_role. to_string ( ) , role_group_name) ;
1338+
1339+ let merged_config = hbase
1340+ . merged_config (
1341+ & hbase_role,
1342+ & rolegroup. role_group ,
1343+ & hbase. spec . cluster_config . hdfs_config_map_name ,
1344+ )
1345+ . unwrap ( ) ;
1346+ if let AnyServiceConfig :: RegionServer ( config) = merged_config {
1347+ assert_eq ! ( run_before_shutdown, config. region_mover. run_before_shutdown) ;
1348+ assert_eq ! ( max_threads, config. region_mover. max_threads) ;
1349+ assert_eq ! (
1350+ Some ( RegionMoverExtraCliOpts {
1351+ additional_mover_options
1352+ } ) ,
1353+ config. region_mover. cli_opts
1354+ ) ;
1355+ } else {
1356+ panic ! ( "this shouldn't happen" ) ;
1357+ } ;
1358+ }
12951359}
0 commit comments