Following a change on our side, we no longer need this patch. Sorry for the noise,
De : Cedric Paillet <[email protected]> Date : lundi, 8 juin 2026 à 15:33 À : [email protected] <[email protected]> Cc : Cedric Paillet <[email protected]> Objet : [PATCH] MINOR: server: add backup flag to server state output Add a new optional srv_backup field at the end of the server state output. The field is set to 1 when the server has SRV_F_BACKUP set, and 0 otherwise. Keep the server state file version unchanged and only increase the maximum number of fields, following the existing optional-field model used by the latest server state additions. The field is intentionally not restored from the state file because backup is a configuration property and applying it from a previous state could override an active configuration change after reload. --- doc/management.txt | 2 ++ include/haproxy/server-t.h | 7 ++++--- reg-tests/checks/1be_40srv_odd_health_checks.vtc | 2 +- reg-tests/checks/40be_2srv_odd_health_checks.vtc | 4 ++-- reg-tests/checks/4be_1srv_health_checks.vtc | 7 +++---- reg-tests/server/cli_add_server.vtc | 7 +++++++ src/proxy.c | 5 +++-- src/server_state.c | 7 +++++++ 8 files changed, 29 insertions(+), 12 deletions(-) diff --git a/doc/management.txt b/doc/management.txt index f05457cd7..a90aa96bd 100644 --- a/doc/management.txt +++ b/doc/management.txt @@ -3497,6 +3497,8 @@ show servers state [<backend>] srv_check_addr: Server health check address. srv_agent_addr: Server health agent address. srv_agent_port: Server health agent port. + srv_backup: Flag to know if the server is a backup + server. =20 show sess [<options>*] Dump all known active streams (formerly called "sessions"). Avoid doing = this diff --git a/include/haproxy/server-t.h b/include/haproxy/server-t.h index 7a2a95400..8e820a96e 100644 --- a/include/haproxy/server-t.h +++ b/include/haproxy/server-t.h @@ -146,11 +146,12 @@ enum srv_init_state { "srv_check_port " \ "srv_check_addr " \ "srv_agent_addr " \ - "srv_agent_port" + "srv_agent_port " \ + "srv_backup" =20 -#define SRV_STATE_FILE_MAX_FIELDS 25 +#define SRV_STATE_FILE_MAX_FIELDS 26 #define SRV_STATE_FILE_MIN_FIELDS_VERSION_1 20 -#define SRV_STATE_FILE_MAX_FIELDS_VERSION_1 25 +#define SRV_STATE_FILE_MAX_FIELDS_VERSION_1 26 #define SRV_STATE_LINE_MAXLEN 2000 =20 /* server flags -- 32 bits */ diff --git a/reg-tests/checks/1be_40srv_odd_health_checks.vtc b/reg-tests/c= hecks/1be_40srv_odd_health_checks.vtc index 09bc70b78..2aded123b 100644 --- a/reg-tests/checks/1be_40srv_odd_health_checks.vtc +++ b/reg-tests/checks/1be_40srv_odd_health_checks.vtc @@ -116,6 +116,6 @@ syslog S -wait =20 haproxy h1 -cli { send "show servers state" - expect ~ "# be_id be_name srv_id srv_name srv_addr srv_op_state srv_ad= min_state srv_uweight srv_iweight srv_time_since_last_change srv_check_stat= us srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_f= orced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_= port srv_check_addr srv_agent_addr srv_agent_port\n2 be1 1 srv0 ${s0_addr} = 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s0_port} - 0 0 - - 0\n2 be1 2 srv1 $= {s1_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s1_port} - 0 0= - - 0\n2 be1 3 srv2 ${s2_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s2_p= ort} - 0 0 - - 0\n2 be1 4 srv3 ${s3_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:= ]]+ ){3}0 0 0 - ${s3_port} - 0 0 - - 0\n2 be1 5 srv4 ${s4_addr} 2 0 1 1 [[:= digit:]]+ 1 0 1 0 0 0 0 - ${s4_port} - 0 0 - - 0\n2 be1 6 srv5 ${s5_addr} 2= 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s5_port} - 0 0 - - 0\n2 b= e1 7 srv6 ${s6_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s6_port} - 0 0 = - - 0\n2 be1 8 srv7 ${s7_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0= 0 - ${s7_port} - 0 0 - - 0\n2 be1 9 srv8 ${s8_addr} 2 0 1 1 [[:digit:]]+ 1= 0 1 0 0 0 0 - ${s8_port} - 0 0 - - 0\n2 be1 10 srv9 ${s9_addr} 2 0 1 1 [[:= digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s9_port} - 0 0 - - 0\n2 be1 11 srv1= 0 ${s10_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s10_port} - 0 0 - - 0\= n2 be1 12 srv11 ${s11_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 = - ${s11_port} - 0 0 - - 0\n2 be1 13 srv12 ${s12_addr} 2 0 1 1 [[:digit:]]+ = 1 0 1 0 0 0 0 - ${s12_port} - 0 0 - - 0\n2 be1 14 srv13 ${s13_addr} 2 0 1 1= [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s13_port} - 0 0 - - 0\n2 be1 15= srv14 ${s14_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s14_port} - 0 0 -= - 0\n2 be1 16 srv15 ${s15_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0= 0 0 - ${s15_port} - 0 0 - - 0\n2 be1 17 srv16 ${s16_addr} 2 0 1 1 [[:digit= :]]+ 1 0 1 0 0 0 0 - ${s16_port} - 0 0 - - 0\n2 be1 18 srv17 ${s17_addr} 2 = 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s17_port} - 0 0 - - 0\n2 b= e1 19 srv18 ${s18_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s18_port} - = 0 0 - - 0\n2 be1 20 srv19 ${s19_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ = ){3}0 0 0 - ${s19_port} - 0 0 - - 0\n2 be1 21 srv20 ${s20_addr} 2 0 1 1 [[:= digit:]]+ 1 0 1 0 0 0 0 - ${s20_port} - 0 0 - - 0\n2 be1 22 srv21 ${s21_add= r} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s21_port} - 0 0 - - 0= \n2 be1 23 srv22 ${s22_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s22_por= t} - 0 0 - - 0\n2 be1 24 srv23 ${s23_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit= :]]+ ){3}0 0 0 - ${s23_port} - 0 0 - - 0\n2 be1 25 srv24 ${s24_addr} 2 0 1 = 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s24_port} - 0 0 - - 0\n2 be1 26 srv25 ${s2= 5_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s25_port} - 0 0 = - - 0\n2 be1 27 srv26 ${s26_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s2= 6_port} - 0 0 - - 0\n2 be1 28 srv27 ${s27_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:= digit:]]+ ){3}0 0 0 - ${s27_port} - 0 0 - - 0\n2 be1 29 srv28 ${s28_addr} 2= 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s28_port} - 0 0 - - 0\n2 be1 30 srv29= ${s29_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s29_port} -= 0 0 - - 0\n2 be1 31 srv30 ${s30_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 -= ${s30_port} - 0 0 - - 0\n2 be1 32 srv31 ${s31_addr} 2 0 1 1 [[:digit:]]+ 6= ([[:digit:]]+ ){3}0 0 0 - ${s31_port} - 0 0 - - 0\n2 be1 33 srv32 ${s32_ad= dr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s32_port} - 0 0 - - 0\n2 be1 34 = srv33 ${s33_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s33_po= rt} - 0 0 - - 0\n2 be1 35 srv34 ${s34_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 = 0 0 - ${s34_port} - 0 0 - - 0\n2 be1 36 srv35 ${s35_addr} 2 0 1 1 [[:digit:= ]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s35_port} - 0 0 - - 0\n2 be1 37 srv36 ${s= 36_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s36_port} - 0 0 - - 0\n2 be= 1 38 srv37 ${s37_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s= 37_port} - 0 0 - - 0\n2 be1 39 srv38 ${s38_addr} 2 0 1 1 [[:digit:]]+ 1 0 1= 0 0 0 0 - ${s38_port} - 0 0 - - 0\n2 be1 40 srv39 ${s39_addr} 2 0 1 1 [[:d= igit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s39_port} - 0 0 - - 0\n" + expect ~ "# be_id be_name srv_id srv_name srv_addr srv_op_state srv_ad= min_state srv_uweight srv_iweight srv_time_since_last_change srv_check_stat= us srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_f= orced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_= port srv_check_addr srv_agent_addr srv_agent_port srv_backup\n2 be1 1 srv0 = ${s0_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s0_port} - 0 0 - - 0 0\n2= be1 2 srv1 ${s1_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s= 1_port} - 0 0 - - 0 0\n2 be1 3 srv2 ${s2_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0= 0 0 0 - ${s2_port} - 0 0 - - 0 0\n2 be1 4 srv3 ${s3_addr} 2 0 1 1 [[:digit= :]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s3_port} - 0 0 - - 0 0\n2 be1 5 srv4 ${s= 4_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s4_port} - 0 0 - - 0 0\n2 be= 1 6 srv5 ${s5_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s5_p= ort} - 0 0 - - 0 0\n2 be1 7 srv6 ${s6_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 = 0 0 - ${s6_port} - 0 0 - - 0 0\n2 be1 8 srv7 ${s7_addr} 2 0 1 1 [[:digit:]]= + 6 ([[:digit:]]+ ){3}0 0 0 - ${s7_port} - 0 0 - - 0 0\n2 be1 9 srv8 ${s8_a= ddr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s8_port} - 0 0 - - 0 0\n2 be1 1= 0 srv9 ${s9_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s9_por= t} - 0 0 - - 0 0\n2 be1 11 srv10 ${s10_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0= 0 0 - ${s10_port} - 0 0 - - 0 0\n2 be1 12 srv11 ${s11_addr} 2 0 1 1 [[:dig= it:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s11_port} - 0 0 - - 0 0\n2 be1 13 srv1= 2 ${s12_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s12_port} - 0 0 - - 0 = 0\n2 be1 14 srv13 ${s13_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 = 0 - ${s13_port} - 0 0 - - 0 0\n2 be1 15 srv14 ${s14_addr} 2 0 1 1 [[:digit:= ]]+ 1 0 1 0 0 0 0 - ${s14_port} - 0 0 - - 0 0\n2 be1 16 srv15 ${s15_addr} 2= 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s15_port} - 0 0 - - 0 0\n= 2 be1 17 srv16 ${s16_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s16_port}= - 0 0 - - 0 0\n2 be1 18 srv17 ${s17_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit= :]]+ ){3}0 0 0 - ${s17_port} - 0 0 - - 0 0\n2 be1 19 srv18 ${s18_addr} 2 0 = 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s18_port} - 0 0 - - 0 0\n2 be1 20 srv19 = ${s19_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s19_port} - = 0 0 - - 0 0\n2 be1 21 srv20 ${s20_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 = - ${s20_port} - 0 0 - - 0 0\n2 be1 22 srv21 ${s21_addr} 2 0 1 1 [[:digit:]]= + 6 ([[:digit:]]+ ){3}0 0 0 - ${s21_port} - 0 0 - - 0 0\n2 be1 23 srv22 ${s= 22_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s22_port} - 0 0 - - 0 0\n2 = be1 24 srv23 ${s23_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - $= {s23_port} - 0 0 - - 0 0\n2 be1 25 srv24 ${s24_addr} 2 0 1 1 [[:digit:]]+ 1= 0 1 0 0 0 0 - ${s24_port} - 0 0 - - 0 0\n2 be1 26 srv25 ${s25_addr} 2 0 1 = 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s25_port} - 0 0 - - 0 0\n2 be1= 27 srv26 ${s26_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s26_port} - 0 = 0 - - 0 0\n2 be1 28 srv27 ${s27_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ = ){3}0 0 0 - ${s27_port} - 0 0 - - 0 0\n2 be1 29 srv28 ${s28_addr} 2 0 1 1 [= [:digit:]]+ 1 0 1 0 0 0 0 - ${s28_port} - 0 0 - - 0 0\n2 be1 30 srv29 ${s29= _addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s29_port} - 0 0 -= - 0 0\n2 be1 31 srv30 ${s30_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s= 30_port} - 0 0 - - 0 0\n2 be1 32 srv31 ${s31_addr} 2 0 1 1 [[:digit:]]+ 6 (= [[:digit:]]+ ){3}0 0 0 - ${s31_port} - 0 0 - - 0 0\n2 be1 33 srv32 ${s32_ad= dr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s32_port} - 0 0 - - 0 0\n2 be1 3= 4 srv33 ${s33_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s33_= port} - 0 0 - - 0 0\n2 be1 35 srv34 ${s34_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 = 0 0 0 0 - ${s34_port} - 0 0 - - 0 0\n2 be1 36 srv35 ${s35_addr} 2 0 1 1 [[:= digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s35_port} - 0 0 - - 0 0\n2 be1 37 s= rv36 ${s36_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s36_port} - 0 0 - -= 0 0\n2 be1 38 srv37 ${s37_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0= 0 0 - ${s37_port} - 0 0 - - 0 0\n2 be1 39 srv38 ${s38_addr} 2 0 1 1 [[:dig= it:]]+ 1 0 1 0 0 0 0 - ${s38_port} - 0 0 - - 0 0\n2 be1 40 srv39 ${s39_addr= } 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s39_port} - 0 0 - - 0 = 0\n" } =20 diff --git a/reg-tests/checks/40be_2srv_odd_health_checks.vtc b/reg-tests/c= hecks/40be_2srv_odd_health_checks.vtc index 496704536..af250d1fc 100644 --- a/reg-tests/checks/40be_2srv_odd_health_checks.vtc +++ b/reg-tests/checks/40be_2srv_odd_health_checks.vtc @@ -642,8 +642,8 @@ haproxy h1 -cli { # output produced using the command below (warning, a bug inserts a "b= e0" every other line: # for ((i=3D0;i<40;i++)); do id=3D$((i/2+2)); be=3D$((i|1)); si=3D$(((= i&1)+1)); # if ((i&1)); then chk=3D"6 ([[:digit:]]+ ){3}"; else chk=3D"1 0 1 0= ";fi; - # printf "%d be%d %d srv%d \${s%d_addr} 2 0 1 1 [[:digit:]]+ %s0 0 0= - \${s%d_port} - 0 0 - - 0\n" "$id" "$be" "$si" "$i" "$i" "$chk" "$i" "$i"= ; + # printf "%d be%d %d srv%d \${s%d_addr} 2 0 1 1 [[:digit:]]+ %s0 0 0= - \${s%d_port} - 0 0 - - 0 0\n" "$id" "$be" "$si" "$i" "$i" "$chk" "$i" "$= i" ; # done|grep -v be0|sed 's,$,\\n,'| tr -d '\n' - expect ~ "# be_id be_name srv_id srv_name srv_addr srv_op_state srv_ad= min_state srv_uweight srv_iweight srv_time_since_last_change srv_check_stat= us srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_f= orced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_= port srv_check_addr srv_agent_addr srv_agent_port\n2 be1 1 srv0 ${s0_addr} = 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s0_port} - 0 0 - - 0\n2 be1 2 srv1 $= {s1_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s1_port} - 0 0= - - 0\n3 be3 1 srv2 ${s2_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s2_p= ort} - 0 0 - - 0\n3 be3 2 srv3 ${s3_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:= ]]+ ){3}0 0 0 - ${s3_port} - 0 0 - - 0\n4 be5 1 srv4 ${s4_addr} 2 0 1 1 [[:= digit:]]+ 1 0 1 0 0 0 0 - ${s4_port} - 0 0 - - 0\n4 be5 2 srv5 ${s5_addr} 2= 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s5_port} - 0 0 - - 0\n5 b= e7 1 srv6 ${s6_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s6_port} - 0 0 = - - 0\n5 be7 2 srv7 ${s7_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0= 0 - ${s7_port} - 0 0 - - 0\n6 be9 1 srv8 ${s8_addr} 2 0 1 1 [[:digit:]]+ 1= 0 1 0 0 0 0 - ${s8_port} - 0 0 - - 0\n6 be9 2 srv9 ${s9_addr} 2 0 1 1 [[:d= igit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s9_port} - 0 0 - - 0\n7 be11 1 srv10= ${s10_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s10_port} - 0 0 - - 0\n= 7 be11 2 srv11 ${s11_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 -= ${s11_port} - 0 0 - - 0\n8 be13 1 srv12 ${s12_addr} 2 0 1 1 [[:digit:]]+ 1= 0 1 0 0 0 0 - ${s12_port} - 0 0 - - 0\n8 be13 2 srv13 ${s13_addr} 2 0 1 1 = [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s13_port} - 0 0 - - 0\n9 be15 1 = srv14 ${s14_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s14_port} - 0 0 - = - 0\n9 be15 2 srv15 ${s15_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 = 0 0 - ${s15_port} - 0 0 - - 0\n10 be17 1 srv16 ${s16_addr} 2 0 1 1 [[:digit= :]]+ 1 0 1 0 0 0 0 - ${s16_port} - 0 0 - - 0\n10 be17 2 srv17 ${s17_addr} 2= 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s17_port} - 0 0 - - 0\n11= be19 1 srv18 ${s18_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s18_port} = - 0 0 - - 0\n11 be19 2 srv19 ${s19_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]= ]+ ){3}0 0 0 - ${s19_port} - 0 0 - - 0\n12 be21 1 srv20 ${s20_addr} 2 0 1 1= [[:digit:]]+ 1 0 1 0 0 0 0 - ${s20_port} - 0 0 - - 0\n12 be21 2 srv21 ${s2= 1_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s21_port} - 0 0 = - - 0\n13 be23 1 srv22 ${s22_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s= 22_port} - 0 0 - - 0\n13 be23 2 srv23 ${s23_addr} 2 0 1 1 [[:digit:]]+ 6 ([= [:digit:]]+ ){3}0 0 0 - ${s23_port} - 0 0 - - 0\n14 be25 1 srv24 ${s24_addr= } 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s24_port} - 0 0 - - 0\n14 be25 2 s= rv25 ${s25_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s25_por= t} - 0 0 - - 0\n15 be27 1 srv26 ${s26_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 = 0 0 - ${s26_port} - 0 0 - - 0\n15 be27 2 srv27 ${s27_addr} 2 0 1 1 [[:digit= :]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s27_port} - 0 0 - - 0\n16 be29 1 srv28 $= {s28_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s28_port} - 0 0 - - 0\n16= be29 2 srv29 ${s29_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - = ${s29_port} - 0 0 - - 0\n17 be31 1 srv30 ${s30_addr} 2 0 1 1 [[:digit:]]+ 1= 0 1 0 0 0 0 - ${s30_port} - 0 0 - - 0\n17 be31 2 srv31 ${s31_addr} 2 0 1 1= [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s31_port} - 0 0 - - 0\n18 be33 = 1 srv32 ${s32_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s32_port} - 0 0 = - - 0\n18 be33 2 srv33 ${s33_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3= }0 0 0 - ${s33_port} - 0 0 - - 0\n19 be35 1 srv34 ${s34_addr} 2 0 1 1 [[:di= git:]]+ 1 0 1 0 0 0 0 - ${s34_port} - 0 0 - - 0\n19 be35 2 srv35 ${s35_addr= } 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s35_port} - 0 0 - - 0\= n20 be37 1 srv36 ${s36_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s36_por= t} - 0 0 - - 0\n20 be37 2 srv37 ${s37_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digi= t:]]+ ){3}0 0 0 - ${s37_port} - 0 0 - - 0\n21 be39 1 srv38 ${s38_addr} 2 0 = 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s38_port} - 0 0 - - 0\n21 be39 2 srv39 $= {s39_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s39_port} - 0= 0 - - 0\n" + expect ~ "# be_id be_name srv_id srv_name srv_addr srv_op_state srv_ad= min_state srv_uweight srv_iweight srv_time_since_last_change srv_check_stat= us srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_f= orced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_= port srv_check_addr srv_agent_addr srv_agent_port srv_backup\n2 be1 1 srv0 = ${s0_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s0_port} - 0 0 - - 0 0\n2= be1 2 srv1 ${s1_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s= 1_port} - 0 0 - - 0 0\n3 be3 1 srv2 ${s2_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0= 0 0 0 - ${s2_port} - 0 0 - - 0 0\n3 be3 2 srv3 ${s3_addr} 2 0 1 1 [[:digit= :]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s3_port} - 0 0 - - 0 0\n4 be5 1 srv4 ${s= 4_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s4_port} - 0 0 - - 0 0\n4 be= 5 2 srv5 ${s5_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s5_p= ort} - 0 0 - - 0 0\n5 be7 1 srv6 ${s6_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 = 0 0 - ${s6_port} - 0 0 - - 0 0\n5 be7 2 srv7 ${s7_addr} 2 0 1 1 [[:digit:]]= + 6 ([[:digit:]]+ ){3}0 0 0 - ${s7_port} - 0 0 - - 0 0\n6 be9 1 srv8 ${s8_a= ddr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s8_port} - 0 0 - - 0 0\n6 be9 2= srv9 ${s9_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s9_port= } - 0 0 - - 0 0\n7 be11 1 srv10 ${s10_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 = 0 0 - ${s10_port} - 0 0 - - 0 0\n7 be11 2 srv11 ${s11_addr} 2 0 1 1 [[:digi= t:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s11_port} - 0 0 - - 0 0\n8 be13 1 srv12= ${s12_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s12_port} - 0 0 - - 0 0= \n8 be13 2 srv13 ${s13_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0= - ${s13_port} - 0 0 - - 0 0\n9 be15 1 srv14 ${s14_addr} 2 0 1 1 [[:digit:]= ]+ 1 0 1 0 0 0 0 - ${s14_port} - 0 0 - - 0 0\n9 be15 2 srv15 ${s15_addr} 2 = 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s15_port} - 0 0 - - 0 0\n1= 0 be17 1 srv16 ${s16_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s16_port}= - 0 0 - - 0 0\n10 be17 2 srv17 ${s17_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digi= t:]]+ ){3}0 0 0 - ${s17_port} - 0 0 - - 0 0\n11 be19 1 srv18 ${s18_addr} 2 = 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s18_port} - 0 0 - - 0 0\n11 be19 2 srv= 19 ${s19_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s19_port}= - 0 0 - - 0 0\n12 be21 1 srv20 ${s20_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 = 0 0 - ${s20_port} - 0 0 - - 0 0\n12 be21 2 srv21 ${s21_addr} 2 0 1 1 [[:dig= it:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s21_port} - 0 0 - - 0 0\n13 be23 1 srv= 22 ${s22_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s22_port} - 0 0 - - 0= 0\n13 be23 2 srv23 ${s23_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 = 0 0 - ${s23_port} - 0 0 - - 0 0\n14 be25 1 srv24 ${s24_addr} 2 0 1 1 [[:dig= it:]]+ 1 0 1 0 0 0 0 - ${s24_port} - 0 0 - - 0 0\n14 be25 2 srv25 ${s25_add= r} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s25_port} - 0 0 - - 0= 0\n15 be27 1 srv26 ${s26_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s26_= port} - 0 0 - - 0 0\n15 be27 2 srv27 ${s27_addr} 2 0 1 1 [[:digit:]]+ 6 ([[= :digit:]]+ ){3}0 0 0 - ${s27_port} - 0 0 - - 0 0\n16 be29 1 srv28 ${s28_add= r} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s28_port} - 0 0 - - 0 0\n16 be29 = 2 srv29 ${s29_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s29_= port} - 0 0 - - 0 0\n17 be31 1 srv30 ${s30_addr} 2 0 1 1 [[:digit:]]+ 1 0 1= 0 0 0 0 - ${s30_port} - 0 0 - - 0 0\n17 be31 2 srv31 ${s31_addr} 2 0 1 1 [= [:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s31_port} - 0 0 - - 0 0\n18 be33 = 1 srv32 ${s32_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s32_port} - 0 0 = - - 0 0\n18 be33 2 srv33 ${s33_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ )= {3}0 0 0 - ${s33_port} - 0 0 - - 0 0\n19 be35 1 srv34 ${s34_addr} 2 0 1 1 [= [:digit:]]+ 1 0 1 0 0 0 0 - ${s34_port} - 0 0 - - 0 0\n19 be35 2 srv35 ${s3= 5_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - ${s35_port} - 0 0 = - - 0 0\n20 be37 1 srv36 ${s36_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - $= {s36_port} - 0 0 - - 0 0\n20 be37 2 srv37 ${s37_addr} 2 0 1 1 [[:digit:]]+ = 6 ([[:digit:]]+ ){3}0 0 0 - ${s37_port} - 0 0 - - 0 0\n21 be39 1 srv38 ${s3= 8_addr} 2 0 1 1 [[:digit:]]+ 1 0 1 0 0 0 0 - ${s38_port} - 0 0 - - 0 0\n21 = be39 2 srv39 ${s39_addr} 2 0 1 1 [[:digit:]]+ 6 ([[:digit:]]+ ){3}0 0 0 - $= {s39_port} - 0 0 - - 0 0\n" } =20 diff --git a/reg-tests/checks/4be_1srv_health_checks.vtc b/reg-tests/checks= /4be_1srv_health_checks.vtc index da993d394..e33841633 100644 --- a/reg-tests/checks/4be_1srv_health_checks.vtc +++ b/reg-tests/checks/4be_1srv_health_checks.vtc @@ -143,7 +143,7 @@ haproxy h1 -conf { haproxy h1 -cli { barrier b1 sync send "show servers state" - expect ~ "# be_id be_name srv_id srv_name srv_addr srv_op_state srv_ad= min_state srv_uweight srv_iweight srv_time_since_last_change srv_check_stat= us srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_f= orced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_= port srv_check_addr srv_agent_addr srv_agent_port\n6 be1 1 srv1 ${s1_addr} = 2 0 1 1 [[:digit:]]+ 6 3 1 [67] 0 0 0 - ${s1_port} - 0 0 - - 0\n7 be2 1 srv= 2 ${s2_addr} 2 0 1 1 [[:digit:]]+ 6 3 1 [67] 0 0 0 - ${s2_port} - 0 0 - - 0= \n8 be3 1 srv3 ${s3_addr} 2 0 1 1 [[:digit:]]+ 6 3 1 [67] 0 0 0 - ${s3_port= } - 0 0 - - 0\n9 be4 1 srv4 ${s4_addr} 2 0 1 1 [[:digit:]]+ 6 3 1 [67] 0 0 = 0 - ${s4_port} - 0 0 - - 0" + expect ~ "# be_id be_name srv_id srv_name srv_addr srv_op_state srv_ad= min_state srv_uweight srv_iweight srv_time_since_last_change srv_check_stat= us srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_f= orced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_= port srv_check_addr srv_agent_addr srv_agent_port srv_backup\n6 be1 1 srv1 = ${s1_addr} 2 0 1 1 [[:digit:]]+ 6 3 1 [67] 0 0 0 - ${s1_port} - 0 0 - - 0 0= \n7 be2 1 srv2 ${s2_addr} 2 0 1 1 [[:digit:]]+ 6 3 1 [67] 0 0 0 - ${s2_port= } - 0 0 - - 0 0\n8 be3 1 srv3 ${s3_addr} 2 0 1 1 [[:digit:]]+ 6 3 1 [67] 0 = 0 0 - ${s3_port} - 0 0 - - 0 0\n9 be4 1 srv4 ${s4_addr} 2 0 1 1 [[:digit:]]= + 6 3 1 [67] 0 0 0 - ${s4_port} - 0 0 - - 0 0" } =20 haproxy h1 -cli { @@ -169,7 +169,7 @@ haproxy h1 -cli { haproxy h1 -cli { barrier b1 sync send "show servers state" - expect ~ "# be_id be_name srv_id srv_name srv_addr srv_op_state srv_ad= min_state srv_uweight srv_iweight srv_time_since_last_change srv_check_stat= us srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_f= orced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_= port srv_check_addr srv_agent_addr srv_agent_port\n6 be1 1 srv1 ${s1_addr} = 0 1 1 1 [[:digit:]]+ 6 3 [01] 1[45] 0 0 0 - ${s1_port} - 0 0 - - 0\n7 be2 1= srv2 ${s2_addr} 0 1 1 1 [[:digit:]]+ 6 3 [01] 1[45] 0 0 0 - ${s2_port} - 0= 0 - - 0\n8 be3 1 srv3 ${s3_addr} 0 1 1 1 [[:digit:]]+ 6 3 [01] 1[45] 0 0 0= - ${s3_port} - 0 0 - - 0\n9 be4 1 srv4 ${s4_addr} 0 1 1 1 [[:digit:]]+ 6 3= [01] 1[45] 0 0 0 - ${s4_port} - 0 0 - - 0" + expect ~ "# be_id be_name srv_id srv_name srv_addr srv_op_state srv_ad= min_state srv_uweight srv_iweight srv_time_since_last_change srv_check_stat= us srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_f= orced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_= port srv_check_addr srv_agent_addr srv_agent_port srv_backup\n6 be1 1 srv1 = ${s1_addr} 0 1 1 1 [[:digit:]]+ 6 3 [01] 1[45] 0 0 0 - ${s1_port} - 0 0 - -= 0 0\n7 be2 1 srv2 ${s2_addr} 0 1 1 1 [[:digit:]]+ 6 3 [01] 1[45] 0 0 0 - $= {s2_port} - 0 0 - - 0 0\n8 be3 1 srv3 ${s3_addr} 0 1 1 1 [[:digit:]]+ 6 3 [= 01] 1[45] 0 0 0 - ${s3_port} - 0 0 - - 0 0\n9 be4 1 srv4 ${s4_addr} 0 1 1 1= [[:digit:]]+ 6 3 [01] 1[45] 0 0 0 - ${s4_port} - 0 0 - - 0 0" } =20 haproxy h1 -cli { @@ -195,11 +195,10 @@ haproxy h1 -cli { haproxy h1 -cli { barrier b1 sync send "show servers state" - expect ~ "# be_id be_name srv_id srv_name srv_addr srv_op_state srv_ad= min_state srv_uweight srv_iweight srv_time_since_last_change srv_check_stat= us srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_f= orced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_= port srv_check_addr srv_agent_addr srv_agent_port\n6 be1 1 srv1 ${s1_addr} = 2 0 1 1 [[:digit:]]+ 6 [03] 1 [67] 0 0 0 - ${s1_port} - 0 0 - - 0\n7 be2 1 = srv2 ${s2_addr} 2 0 1 1 [[:digit:]]+ 6 [03] 1 [67] 0 0 0 - ${s2_port} - 0 0= - - 0\n8 be3 1 srv3 ${s3_addr} 2 0 1 1 [[:digit:]]+ 6 [03] 1 [67] 0 0 0 - = ${s3_port} - 0 0 - - 0\n9 be4 1 srv4 ${s4_addr} 2 0 1 1 [[:digit:]]+ 6 [03]= 1 [67] 0 0 0 - ${s4_port} - 0 0 - - 0" + expect ~ "# be_id be_name srv_id srv_name srv_addr srv_op_state srv_ad= min_state srv_uweight srv_iweight srv_time_since_last_change srv_check_stat= us srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_f= orced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_= port srv_check_addr srv_agent_addr srv_agent_port srv_backup\n6 be1 1 srv1 = ${s1_addr} 2 0 1 1 [[:digit:]]+ 6 [03] 1 [67] 0 0 0 - ${s1_port} - 0 0 - - = 0 0\n7 be2 1 srv2 ${s2_addr} 2 0 1 1 [[:digit:]]+ 6 [03] 1 [67] 0 0 0 - ${s= 2_port} - 0 0 - - 0 0\n8 be3 1 srv3 ${s3_addr} 2 0 1 1 [[:digit:]]+ 6 [03] = 1 [67] 0 0 0 - ${s3_port} - 0 0 - - 0 0\n9 be4 1 srv4 ${s4_addr} 2 0 1 1 [[= :digit:]]+ 6 [03] 1 [67] 0 0 0 - ${s4_port} - 0 0 - - 0 0" } =20 syslog S1 -wait syslog S2 -wait syslog S3 -wait syslog S4 -wait - diff --git a/reg-tests/server/cli_add_server.vtc b/reg-tests/server/cli_add= _server.vtc index 8081312ba..1f2a6933e 100644 --- a/reg-tests/server/cli_add_server.vtc +++ b/reg-tests/server/cli_add_server.vtc @@ -69,6 +69,13 @@ haproxy h1 -cli { # specify the proto, it should be accepted for this backend send "add server test/s2 ${s1_addr}:${s1_port} proto h2" expect ~ "New server registered." + + # valid backup command + send "add server test/s3 ${s1_addr}:${s1_port} backup" + expect ~ "New server registered." + + send "show servers state test" + expect ~ "test 3 s3 ${s1_addr} .* - ${s1_port} - 0 0 - - 0 1" } =20 # dynamic servers are created on MAINT mode and should not be available at= first diff --git a/src/proxy.c b/src/proxy.c index bd2a8ce59..7eb4da447 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -3027,7 +3027,7 @@ static int dump_servers_state(struct appctx *appctx) "%d %d %d %d %d " "%d %d %s %u " "%s %d %d " - "%s %s %d" + "%s %s %d %d" "\n", px->uuid, HA_ANON_CLI(px->id), srv->puid, HA_ANON_CLI(srv->id), @@ -3039,7 +3039,8 @@ static int dump_servers_state(struct appctx *appctx) bk_f_forced_id, srv_f_forced_id, srv->hostname ? HA_ANON_CLI(srv->hostname) : "-", srv->svc_port, srvrecord ? srvrecord : "-", srv->use_ssl, srv->check.port, - srv_check_addr, srv_agent_addr, srv->agent.port); + srv_check_addr, srv_agent_addr, srv->agent.port, + (srv->flags & SRV_F_BACKUP) ? 1 : 0); } else { /* show servers conn */ int thr; diff --git a/src/server_state.c b/src/server_state.c index 1fa2ffd94..ae70786e7 100644 --- a/src/server_state.c +++ b/src/server_state.c @@ -94,6 +94,12 @@ static void srv_state_srv_update(struct server *srv, int= version, char **params) * srv_check_addr: params[18] * srv_agent_addr: params[19] * srv_agent_port: params[20] + * srv_backup: params[21] + */ + + /* srv_backup is intentionally not applied from the state file. It is a + * configuration property and restoring it could override a configuration + * change between two reloads. */ =20 /* validating srv_op_state */ @@ -627,6 +633,7 @@ static int srv_state_parse_line(char *buf, const int ve= rsion, char **params) * srv_check_addr: params[22] (optional field) * srv_agent_addr: params[23] (optional field) * srv_agent_port: params[24] (optional field) + * srv_backup: params[25] (optional field) * */ params[arg++] =3D cur; --=20 2.50.1 (Apple Git-155)

