diff --git a/include/proto/server.h b/include/proto/server.h index c4966894b..64ae696f0 100644 --- a/include/proto/server.h +++ b/include/proto/server.h @@ -189,9 +189,10 @@ void srv_set_stopping(struct server *s, const char *reason); * one flag at once. The equivalent "inherited" flag is propagated to all * tracking servers. Maintenance mode disables health checks (but not agent * checks). When either the flag is already set or no flag is passed, nothing - * is done. + * is done. If is non-null, it will be displayed at the end of the log + * lines to justify the state change. */ -void srv_set_admin_flag(struct server *s, enum srv_admin mode); +void srv_set_admin_flag(struct server *s, enum srv_admin mode, const char *cause); /* Disables admin flag (among SRV_ADMF_*) on server . This is used to * stop enforcing either maint mode or drain mode. It is not allowed to set more @@ -206,7 +207,7 @@ void srv_clr_admin_flag(struct server *s, enum srv_admin mode); */ static inline void srv_adm_set_maint(struct server *s) { - srv_set_admin_flag(s, SRV_ADMF_FMAINT); + srv_set_admin_flag(s, SRV_ADMF_FMAINT, NULL); srv_clr_admin_flag(s, SRV_ADMF_FDRAIN); } @@ -215,7 +216,7 @@ static inline void srv_adm_set_maint(struct server *s) */ static inline void srv_adm_set_drain(struct server *s) { - srv_set_admin_flag(s, SRV_ADMF_FDRAIN); + srv_set_admin_flag(s, SRV_ADMF_FDRAIN, NULL); srv_clr_admin_flag(s, SRV_ADMF_FMAINT); } diff --git a/src/dumpstats.c b/src/dumpstats.c index d6db29a53..e18b9ba75 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -5477,7 +5477,7 @@ static int stats_process_http_post(struct stream_interface *si) if (!(sv->admin & SRV_ADMF_FMAINT)) { altered_servers++; total_servers++; - srv_set_admin_flag(sv, SRV_ADMF_FMAINT); + srv_set_admin_flag(sv, SRV_ADMF_FMAINT, "'disable' on stats page"); } break; case ST_ADM_ACTION_ENABLE: @@ -5489,7 +5489,7 @@ static int stats_process_http_post(struct stream_interface *si) break; case ST_ADM_ACTION_STOP: if (!(sv->admin & SRV_ADMF_FDRAIN)) { - srv_set_admin_flag(sv, SRV_ADMF_FDRAIN); + srv_set_admin_flag(sv, SRV_ADMF_FDRAIN, "'stop' on stats page"); altered_servers++; total_servers++; } diff --git a/src/server.c b/src/server.c index 3aeb557bf..cf5891838 100644 --- a/src/server.c +++ b/src/server.c @@ -395,9 +395,10 @@ void srv_set_stopping(struct server *s, const char *reason) * one flag at once. The equivalent "inherited" flag is propagated to all * tracking servers. Maintenance mode disables health checks (but not agent * checks). When either the flag is already set or no flag is passed, nothing - * is done. + * is done. If is non-null, it will be displayed at the end of the log + * lines to justify the state change. */ -void srv_set_admin_flag(struct server *s, enum srv_admin mode) +void srv_set_admin_flag(struct server *s, enum srv_admin mode, const char *cause) { struct check *check = &s->check; struct server *srv; @@ -426,8 +427,9 @@ void srv_set_admin_flag(struct server *s, enum srv_admin mode) if (s->state == SRV_ST_STOPPED) { /* server was already down */ chunk_printf(&trash, - "%sServer %s/%s was DOWN and now enters maintenance", - s->flags & SRV_F_BACKUP ? "Backup " : "", s->proxy->id, s->id); + "%sServer %s/%s was DOWN and now enters maintenance%s%s%s", + s->flags & SRV_F_BACKUP ? "Backup " : "", s->proxy->id, s->id, + cause ? " (" : "", cause ? cause : "", cause ? ")" : ""); srv_append_status(&trash, s, NULL, -1, (mode & SRV_ADMF_FMAINT)); @@ -456,9 +458,10 @@ void srv_set_admin_flag(struct server *s, enum srv_admin mode) xferred = pendconn_redistribute(s); chunk_printf(&trash, - "%sServer %s/%s is going DOWN for maintenance", + "%sServer %s/%s is going DOWN for maintenance%s%s%s", s->flags & SRV_F_BACKUP ? "Backup " : "", - s->proxy->id, s->id); + s->proxy->id, s->id, + cause ? " (" : "", cause ? cause : "", cause ? ")" : ""); srv_append_status(&trash, s, NULL, xferred, (mode & SRV_ADMF_FMAINT)); @@ -488,8 +491,9 @@ void srv_set_admin_flag(struct server *s, enum srv_admin mode) */ xferred = pendconn_redistribute(s); - chunk_printf(&trash, "%sServer %s/%s enters drain state", - s->flags & SRV_F_BACKUP ? "Backup " : "", s->proxy->id, s->id); + chunk_printf(&trash, "%sServer %s/%s enters drain state%s%s%s", + s->flags & SRV_F_BACKUP ? "Backup " : "", s->proxy->id, s->id, + cause ? " (" : "", cause ? cause : "", cause ? ")" : ""); srv_append_status(&trash, s, NULL, xferred, (mode & SRV_ADMF_FDRAIN)); @@ -509,7 +513,7 @@ void srv_set_admin_flag(struct server *s, enum srv_admin mode) mode = SRV_ADMF_IDRAIN; for (srv = s->trackers; srv; srv = srv->tracknext) - srv_set_admin_flag(srv, mode); + srv_set_admin_flag(srv, mode, cause); } /* Disables admin flag (among SRV_ADMF_*) on server . This is used to @@ -743,10 +747,10 @@ static void srv_propagate_admin_state(struct server *srv) for (srv2 = srv->trackers; srv2; srv2 = srv2->tracknext) { if (srv->admin & (SRV_ADMF_MAINT | SRV_ADMF_CMAINT)) - srv_set_admin_flag(srv2, SRV_ADMF_IMAINT); + srv_set_admin_flag(srv2, SRV_ADMF_IMAINT, NULL); if (srv->admin & SRV_ADMF_DRAIN) - srv_set_admin_flag(srv2, SRV_ADMF_IDRAIN); + srv_set_admin_flag(srv2, SRV_ADMF_IDRAIN, NULL); } }