11use snafu:: { OptionExt , ResultExt , Snafu } ;
22use stackable_operator:: {
33 memory:: { BinaryMultiple , MemoryQuantity } ,
4- role_utils :: { self , JvmArgumentOverrides } ,
4+ v2 :: jvm_argument_overrides :: JvmArgumentOverrides ,
55} ;
66
7- use crate :: crd:: {
8- AnyServiceConfig , CONFIG_DIR_NAME , HbaseRole , JVM_SECURITY_PROPERTIES_FILE , v1alpha1,
9- } ;
7+ use crate :: crd:: { AnyServiceConfig , CONFIG_DIR_NAME , JVM_SECURITY_PROPERTIES_FILE , v1alpha1} ;
108
119const JAVA_HEAP_FACTOR : f32 = 0.8 ;
1210
@@ -19,12 +17,6 @@ pub enum Error {
1917 InvalidMemoryConfig {
2018 source : stackable_operator:: memory:: Error ,
2119 } ,
22-
23- #[ snafu( display( "failed to merge jvm argument overrides" ) ) ]
24- MergeJvmArgumentOverrides { source : role_utils:: Error } ,
25-
26- #[ snafu( display( "the HBase role [{role}] is missing from spec" ) ) ]
27- MissingHbaseRole { role : String } ,
2820}
2921
3022// Applies to both the servers and the CLI
@@ -48,58 +40,28 @@ pub fn construct_global_jvm_args(kerberos_enabled: bool) -> String {
4840
4941/// JVM arguments that are specifically for the role (server), so will *not* be used e.g. by CLI tools.
5042/// Heap settings are excluded, as they go into `HBASE_HEAPSIZE`.
43+ ///
44+ /// `merged_jvm_argument_overrides` is the role <- role-group merged [`JvmArgumentOverrides`]
45+ /// produced by
46+ /// [`with_validated_config`](stackable_operator::v2::role_utils::with_validated_config). The
47+ /// operator-generated arguments below form the base that the user overrides are applied on top of.
5148pub fn construct_role_specific_non_heap_jvm_args (
5249 hbase : & v1alpha1:: HbaseCluster ,
53- hbase_role : & HbaseRole ,
54- role_group : & str ,
55- ) -> Result < String , Error > {
56- let mut jvm_args = vec ! [ format!(
50+ merged_jvm_argument_overrides : & JvmArgumentOverrides ,
51+ ) -> String {
52+ let mut operator_generated = vec ! [ format!(
5753 "-Djava.security.properties={CONFIG_DIR_NAME}/{JVM_SECURITY_PROPERTIES_FILE}"
5854 ) ] ;
5955
6056 if hbase. has_kerberos_enabled ( ) {
61- jvm_args. push ( "-Djava.security.krb5.conf=/stackable/kerberos/krb5.conf" . to_owned ( ) ) ;
57+ operator_generated
58+ . push ( "-Djava.security.krb5.conf=/stackable/kerberos/krb5.conf" . to_owned ( ) ) ;
6259 }
6360
64- let operator_generated = JvmArgumentOverrides :: new_with_only_additions ( jvm_args) ;
65-
66- let merged = match hbase_role {
67- HbaseRole :: Master => hbase
68- . spec
69- . masters
70- . as_ref ( )
71- . context ( MissingHbaseRoleSnafu {
72- role : hbase_role. to_string ( ) ,
73- } ) ?
74- . get_merged_jvm_argument_overrides ( role_group, & operator_generated)
75- . context ( MergeJvmArgumentOverridesSnafu ) ?,
76- HbaseRole :: RegionServer => hbase
77- . spec
78- . region_servers
79- . as_ref ( )
80- . context ( MissingHbaseRoleSnafu {
81- role : hbase_role. to_string ( ) ,
82- } ) ?
83- . get_merged_jvm_argument_overrides ( role_group, & operator_generated)
84- . context ( MergeJvmArgumentOverridesSnafu ) ?,
85- HbaseRole :: RestServer => hbase
86- . spec
87- . rest_servers
88- . as_ref ( )
89- . context ( MissingHbaseRoleSnafu {
90- role : hbase_role. to_string ( ) ,
91- } ) ?
92- . get_merged_jvm_argument_overrides ( role_group, & operator_generated)
93- . context ( MergeJvmArgumentOverridesSnafu ) ?,
94- } ;
95- jvm_args = merged
96- . effective_jvm_config_after_merging ( )
97- // Sorry for the clone, that's how operator-rs is currently modelled :P
98- . clone ( ) ;
99-
61+ let mut jvm_args = merged_jvm_argument_overrides. apply_to ( operator_generated) ;
10062 jvm_args. retain ( |arg| !is_heap_jvm_argument ( arg) ) ;
10163
102- Ok ( jvm_args. join ( " " ) )
64+ jvm_args. join ( " " )
10365}
10466
10567/// This will be put into `HBASE_HEAPSIZE`, which is just the heap size in megabytes (with the `m`
@@ -135,6 +97,8 @@ fn is_heap_jvm_argument(jvm_argument: &str) -> bool {
13597
13698#[ cfg( test) ]
13799mod tests {
100+ use stackable_operator:: config:: merge:: Merge ;
101+
138102 use super :: * ;
139103 use crate :: crd:: { HbaseRole , v1alpha1} ;
140104
@@ -160,11 +124,11 @@ mod tests {
160124 default:
161125 replicas: 1
162126 "# ;
163- let ( hbase, hbase_role , merged_config, role_group ) = construct_boilerplate ( input) ;
127+ let ( hbase, merged_config, merged_jvm_argument_overrides ) = construct_boilerplate ( input) ;
164128
165129 let global_jvm_args = construct_global_jvm_args ( false ) ;
166130 let role_specific_non_heap_jvm_args =
167- construct_role_specific_non_heap_jvm_args ( & hbase, & hbase_role , & role_group ) . unwrap ( ) ;
131+ construct_role_specific_non_heap_jvm_args ( & hbase, & merged_jvm_argument_overrides ) ;
168132 let hbase_heapsize_env = construct_hbase_heapsize_env ( & merged_config) . unwrap ( ) ;
169133
170134 assert_eq ! ( global_jvm_args, "" ) ;
@@ -216,11 +180,11 @@ mod tests {
216180 - -Xmx40000m # This has no effect!
217181 - -Dhttps.proxyPort=1234
218182 "# ;
219- let ( hbase, hbase_role , merged_config, role_group ) = construct_boilerplate ( input) ;
183+ let ( hbase, merged_config, merged_jvm_argument_overrides ) = construct_boilerplate ( input) ;
220184
221185 let global_jvm_args = construct_global_jvm_args ( hbase. has_kerberos_enabled ( ) ) ;
222186 let role_specific_non_heap_jvm_args =
223- construct_role_specific_non_heap_jvm_args ( & hbase, & hbase_role , & role_group ) . unwrap ( ) ;
187+ construct_role_specific_non_heap_jvm_args ( & hbase, & merged_jvm_argument_overrides ) ;
224188 let hbase_heapsize_env = construct_hbase_heapsize_env ( & merged_config) . unwrap ( ) ;
225189
226190 assert_eq ! (
@@ -240,7 +204,11 @@ mod tests {
240204
241205 fn construct_boilerplate (
242206 hbase_cluster : & str ,
243- ) -> ( v1alpha1:: HbaseCluster , HbaseRole , AnyServiceConfig , String ) {
207+ ) -> (
208+ v1alpha1:: HbaseCluster ,
209+ AnyServiceConfig ,
210+ JvmArgumentOverrides ,
211+ ) {
244212 let hbase: v1alpha1:: HbaseCluster =
245213 serde_yaml:: from_str ( hbase_cluster) . expect ( "illegal test input" ) ;
246214
@@ -249,6 +217,19 @@ mod tests {
249217 . merged_config ( & hbase_role, "default" , "my-hdfs" )
250218 . unwrap ( ) ;
251219
252- ( hbase, hbase_role, merged_config, "default" . to_owned ( ) )
220+ // Merge the role <- role-group JVM argument overrides the same way
221+ // `with_validated_config` does, so the tests exercise the real merge path.
222+ let role = hbase. spec . region_servers . as_ref ( ) . unwrap ( ) ;
223+ let mut merged_common = role
224+ . role_groups
225+ . get ( "default" )
226+ . unwrap ( )
227+ . config
228+ . product_specific_common_config
229+ . clone ( ) ;
230+ merged_common. merge ( & role. config . product_specific_common_config ) ;
231+ let merged_jvm_argument_overrides = merged_common. jvm_argument_overrides ;
232+
233+ ( hbase, merged_config, merged_jvm_argument_overrides)
253234 }
254235}
0 commit comments