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)

Reply via email to