@@ -18,6 +18,7 @@ use std::{any, fmt};
1818
1919use anyhow:: { self , Context } ;
2020use serde:: { Deserialize , Deserializer } ;
21+ use tracing:: log:: warn;
2122
2223use crate :: qw_env_vars:: { QW_ENV_VARS , QW_NONE } ;
2324
6869 // QW env vars take precedence over the config file values.
6970 if E > QW_NONE
7071 && let Some ( env_var_key) = QW_ENV_VARS . get ( & E )
71- && let Some ( env_var_value) = env_vars. get ( * env_var_key)
72+ && let Some ( env_var_value) = env_vars. get ( * env_var_key) . filter ( |val| {
73+ if val. is_empty ( ) {
74+ warn ! (
75+ "environment variable `{}` is set but value is empty" ,
76+ * env_var_key
77+ ) ;
78+ false
79+ } else {
80+ true
81+ }
82+ } )
7283 {
7384 let value = env_var_value. parse :: < T > ( ) . map_err ( |error| {
7485 anyhow:: anyhow!(
@@ -118,7 +129,7 @@ where T: Deserialize<'de>
118129mod tests {
119130 use super :: * ;
120131 use crate :: qw_env_vars:: {
121- QW_CLUSTER_ID , QW_GOSSIP_LISTEN_PORT , QW_NODE_ID , QW_REST_LISTEN_PORT ,
132+ QW_AVAILABILITY_ZONE , QW_CLUSTER_ID , QW_GOSSIP_LISTEN_PORT , QW_NODE_ID , QW_REST_LISTEN_PORT ,
122133 } ;
123134
124135 #[ test]
@@ -191,6 +202,14 @@ mod tests {
191202 rest_listen_port. resolve ( & env_vars) . unwrap_err ( ) ;
192203 }
193204
205+ #[ test]
206+ fn test_config_value_resolve_optional_empty_string ( ) {
207+ let mut env_vars = HashMap :: new ( ) ;
208+ env_vars. insert ( "QW_AVAILABILITY_ZONE" . to_string ( ) , "" . to_string ( ) ) ;
209+ let az = ConfigValue :: < usize , QW_AVAILABILITY_ZONE > :: none ( ) ;
210+ assert ! ( az. resolve_optional( & env_vars) . unwrap( ) . is_none( ) ) ;
211+ }
212+
194213 #[ test]
195214 fn test_config_value_deserialize ( ) {
196215 fn default_cluster_id ( ) -> ConfigValue < String , QW_CLUSTER_ID > {
0 commit comments