struct server *srv_drop(struct server *srv);
int srv_init_per_thr(struct server *srv);
void srv_set_ssl(struct server *s, int use_ssl);
+const char *srv_adm_st_chg_cause(enum srv_adm_st_chg_cause cause);
/* functions related to server name resolution */
int srv_prepare_for_resolution(struct server *srv, const char *hostname);
* is done. If <cause> 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, const char *cause);
+void srv_set_admin_flag(struct server *s, enum srv_admin mode, enum srv_adm_st_chg_cause cause);
/* Disables admin flag <mode> (among SRV_ADMF_*) on server <s>. This is used to
* stop enforcing either maint mode or drain mode. It is not allowed to set more
*/
static inline void srv_adm_set_maint(struct server *s)
{
- srv_set_admin_flag(s, SRV_ADMF_FMAINT, NULL);
+ srv_set_admin_flag(s, SRV_ADMF_FMAINT, SRV_ADM_STCHGC_NONE);
srv_clr_admin_flag(s, SRV_ADMF_FDRAIN);
}
*/
static inline void srv_adm_set_drain(struct server *s)
{
- srv_set_admin_flag(s, SRV_ADMF_FDRAIN, NULL);
+ srv_set_admin_flag(s, SRV_ADMF_FDRAIN, SRV_ADM_STCHGC_NONE);
srv_clr_admin_flag(s, SRV_ADMF_FMAINT);
}
.values = EB_ROOT_UNIQUE,
};
+static const char *srv_adm_st_chg_cause_str[] = {
+ [SRV_ADM_STCHGC_NONE] = "",
+ [SRV_ADM_STCHGC_DNS_NOENT] = "entry removed from SRV record",
+ [SRV_ADM_STCHGC_DNS_NOIP] = "No IP for server ",
+ [SRV_ADM_STCHGC_DNS_NX] = "DNS NX status",
+ [SRV_ADM_STCHGC_DNS_TIMEOUT] = "DNS timeout status",
+ [SRV_ADM_STCHGC_DNS_REFUSED] = "DNS refused status",
+ [SRV_ADM_STCHGC_DNS_UNSPEC] = "unspecified DNS error",
+ [SRV_ADM_STCHGC_STATS_DISABLE] = "'disable' on stats page",
+ [SRV_ADM_STCHGC_STATS_STOP] = "'stop' on stats page"
+};
+
+const char *srv_adm_st_chg_cause(enum srv_adm_st_chg_cause cause)
+{
+ return srv_adm_st_chg_cause_str[cause];
+}
+
int srv_downtime(const struct server *s)
{
if ((s->cur_state != SRV_ST_STOPPED) || s->last_change >= now.tv_sec) // ignore negative time
*
* Must be called with the server lock held.
*/
-void srv_set_admin_flag(struct server *s, enum srv_admin mode, const char *cause)
+void srv_set_admin_flag(struct server *s, enum srv_admin mode, enum srv_adm_st_chg_cause cause)
{
struct server *srv;
return;
s->next_admin |= mode;
- if (cause)
- strlcpy2(s->adm_st_chg_cause, cause, sizeof(s->adm_st_chg_cause));
+ s->adm_st_chg_cause = cause;
/* propagate changes */
srv_update_status(s);
for (srv2 = srv->trackers; srv2; srv2 = srv2->tracknext) {
HA_SPIN_LOCK(SERVER_LOCK, &srv2->lock);
if (srv->next_admin & (SRV_ADMF_MAINT | SRV_ADMF_CMAINT))
- srv_set_admin_flag(srv2, SRV_ADMF_IMAINT, NULL);
+ srv_set_admin_flag(srv2, SRV_ADMF_IMAINT, SRV_ADM_STCHGC_NONE);
if (srv->next_admin & SRV_ADMF_DRAIN)
- srv_set_admin_flag(srv2, SRV_ADMF_IDRAIN, NULL);
+ srv_set_admin_flag(srv2, SRV_ADMF_IDRAIN, SRV_ADM_STCHGC_NONE);
HA_SPIN_UNLOCK(SERVER_LOCK, &srv2->lock);
}
}
if (s->next_admin & SRV_ADMF_RMAINT)
return 1;
- srv_set_admin_flag(s, SRV_ADMF_RMAINT, "entry removed from SRV record");
+ srv_set_admin_flag(s, SRV_ADMF_RMAINT, SRV_ADM_STCHGC_DNS_NOENT);
return 0;
}
if (has_no_ip) {
if (s->next_admin & SRV_ADMF_RMAINT)
return 1;
- srv_set_admin_flag(s, SRV_ADMF_RMAINT,
- "No IP for server ");
+ srv_set_admin_flag(s, SRV_ADMF_RMAINT, SRV_ADM_STCHGC_DNS_NOIP);
return 0;
}
if (s->next_admin & SRV_ADMF_RMAINT)
return 1;
- srv_set_admin_flag(s, SRV_ADMF_RMAINT, "DNS NX status");
+ srv_set_admin_flag(s, SRV_ADMF_RMAINT, SRV_ADM_STCHGC_DNS_NX);
return 0;
case RSLV_STATUS_TIMEOUT:
if (s->next_admin & SRV_ADMF_RMAINT)
return 1;
- srv_set_admin_flag(s, SRV_ADMF_RMAINT, "DNS timeout status");
+ srv_set_admin_flag(s, SRV_ADMF_RMAINT, SRV_ADM_STCHGC_DNS_TIMEOUT);
return 0;
case RSLV_STATUS_REFUSED:
if (s->next_admin & SRV_ADMF_RMAINT)
return 1;
- srv_set_admin_flag(s, SRV_ADMF_RMAINT, "DNS refused status");
+ srv_set_admin_flag(s, SRV_ADMF_RMAINT, SRV_ADM_STCHGC_DNS_REFUSED);
return 0;
default:
if (s->next_admin & SRV_ADMF_RMAINT)
return 1;
- srv_set_admin_flag(s, SRV_ADMF_RMAINT, "unspecified DNS error");
+ srv_set_admin_flag(s, SRV_ADMF_RMAINT, SRV_ADM_STCHGC_DNS_UNSPEC);
return 0;
}
break;
case SRV_IADDR_NONE:
- srv_set_admin_flag(srv, SRV_ADMF_RMAINT, NULL);
+ srv_set_admin_flag(srv, SRV_ADMF_RMAINT, SRV_ADM_STCHGC_NONE);
if (return_code) {
ha_warning("could not resolve address '%s', disabling server.\n",
name);
chunk_printf(tmptrash,
"%sServer %s/%s was DOWN and now enters maintenance%s%s%s",
s->flags & SRV_F_BACKUP ? "Backup " : "", s->proxy->id, s->id,
- *(s->adm_st_chg_cause) ? " (" : "", s->adm_st_chg_cause, *(s->adm_st_chg_cause) ? ")" : "");
+ (s->adm_st_chg_cause) ? " (" : "",
+ srv_adm_st_chg_cause(s->adm_st_chg_cause),
+ (s->adm_st_chg_cause) ? ")" : "");
srv_append_status(tmptrash, s, NULL, -1, (s->next_admin & SRV_ADMF_FMAINT));
"%sServer %s/%s is going DOWN for maintenance%s%s%s",
s->flags & SRV_F_BACKUP ? "Backup " : "",
s->proxy->id, s->id,
- *(s->adm_st_chg_cause) ? " (" : "", s->adm_st_chg_cause, *(s->adm_st_chg_cause) ? ")" : "");
+ (s->adm_st_chg_cause) ? " (" : "",
+ srv_adm_st_chg_cause(s->adm_st_chg_cause),
+ (s->adm_st_chg_cause) ? ")" : "");
srv_append_status(tmptrash, s, NULL, xferred, (s->next_admin & SRV_ADMF_FMAINT));
if (tmptrash) {
chunk_printf(tmptrash, "%sServer %s/%s enters drain state%s%s%s",
s->flags & SRV_F_BACKUP ? "Backup " : "", s->proxy->id, s->id,
- *(s->adm_st_chg_cause) ? " (" : "", s->adm_st_chg_cause, *(s->adm_st_chg_cause) ? ")" : "");
+ (s->adm_st_chg_cause) ? " (" : "",
+ srv_adm_st_chg_cause(s->adm_st_chg_cause),
+ (s->adm_st_chg_cause) ? ")" : "");
srv_append_status(tmptrash, s, NULL, xferred, (s->next_admin & SRV_ADMF_FDRAIN));
}
}
- /* Re-set log strings to empty */
- *s->adm_st_chg_cause = 0;
+ /* Re-set adm st change to none */
+ s->adm_st_chg_cause = SRV_ADM_STCHGC_NONE;
/* explicitly commit state changes (even if it was already applied implicitly
* by some lb state change function), so we don't miss anything