This is in preparation for associating a agent check
with a server which runs as well as the server's existing check.

Signed-off-by: Simon Horman <ho...@verge.net.au>
---
 include/types/server.h |  3 ++-
 src/cfgparse.c         | 10 +++++-----
 src/checks.c           | 50 +++++++++++++++++++++++++-------------------------
 src/dumpstats.c        | 12 ++++++------
 src/proto_http.c       |  2 +-
 src/server.c           |  4 ++--
 6 files changed, 41 insertions(+), 40 deletions(-)

diff --git a/include/types/server.h b/include/types/server.h
index cb65dbc..ebd827b 100644
--- a/include/types/server.h
+++ b/include/types/server.h
@@ -120,6 +120,8 @@ struct check {
        int inter, fastinter, downinter;        /* checks: time in milliseconds 
*/
        int result;                             /* health-check result : 
SRV_CHK_* */
        int state;                              /* health-check result : CHK_* 
*/
+       int health;                             /* 0 to server->rise-1 = bad;
+                                                * rise to 
server->rise+server->fall-1 = good */
        int type;                               /* Check type, one of 
PR_O2_*_CHK */
        const char *name;                       /* Name of check: "Health" or 
"Agent" */
        struct server *server;                  /* back-pointer to server */
@@ -152,7 +154,6 @@ struct server {
 
        struct server *tracknext, *track;       /* next server in a tracking 
list, tracked server */
        char *trackit;                          /* temporary variable to make 
assignment deferrable */
-       int health;                             /* 0->rise-1 = bad; 
rise->rise+fall-1 = good */
        int consecutive_errors;                 /* current number of 
consecutive errors */
        int rise, fall;                         /* time in iterations */
        int consecutive_errors_limit;           /* number of consecutive errors 
that triggers an event */
diff --git a/src/cfgparse.c b/src/cfgparse.c
index 631a36a..ba90454 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -4257,7 +4257,7 @@ stats_error_parsing:
                        newsrv->uweight = newsrv->iweight
                                                = curproxy->defsrv.iweight;
 
-                       newsrv->health = newsrv->rise;  /* up, but will fall 
down at first failure */
+                       newsrv->check.health = newsrv->rise;    /* up, but will 
fall down at first failure */
 
                        newsrv->check.status    = HCHK_STATUS_INI;
                        newsrv->check.name      = "Health";
@@ -4296,8 +4296,8 @@ stats_error_parsing:
                                        goto out;
                                }
 
-                               if (newsrv->health)
-                                       newsrv->health = newsrv->rise;
+                               if (newsrv->check.health)
+                                       newsrv->check.health = newsrv->rise;
                                cur_arg += 2;
                        }
                        else if (!strcmp(args[cur_arg], "fall")) {
@@ -4478,7 +4478,7 @@ stats_error_parsing:
                        else if (!defsrv && !strcmp(args[cur_arg], "disabled")) 
{
                                newsrv->state |= SRV_MAINTAIN;
                                newsrv->state &= ~SRV_RUNNING;
-                               newsrv->health = 0;
+                               newsrv->check.health = 0;
                                cur_arg += 1;
                        }
                        else if (!defsrv && !strcmp(args[cur_arg], "observe")) {
@@ -6768,7 +6768,7 @@ out_uri_auth_compat:
                                if (srv->state & SRV_MAINTAIN) {
                                        newsrv->state |= SRV_MAINTAIN;
                                        newsrv->state &= ~SRV_RUNNING;
-                                       newsrv->health = 0;
+                                       newsrv->check.health = 0;
                                }
 
                                newsrv->track = srv;
diff --git a/src/checks.c b/src/checks.c
index 6659b6b..c7e2345 100644
--- a/src/checks.c
+++ b/src/checks.c
@@ -229,8 +229,8 @@ static void set_server_check_status(struct check *check, 
short status, const cha
        }
 
        if (s->proxy->options2 & PR_O2_LOGHCHKS &&
-       (((s->health != 0) && (check->result & SRV_CHK_FAILED)) ||
-           ((s->health != s->rise + s->fall - 1) && (check->result & 
SRV_CHK_PASSED)) ||
+       (((check->health != 0) && (check->result & SRV_CHK_FAILED)) ||
+           ((check->health != s->rise + s->fall - 1) && (check->result & 
SRV_CHK_PASSED)) ||
            ((s->state & SRV_GOINGDOWN) && !(check->result & SRV_CHK_DISABLE)) 
||
            (!(s->state & SRV_GOINGDOWN) && (check->result & 
SRV_CHK_DISABLE)))) {
 
@@ -239,7 +239,7 @@ static void set_server_check_status(struct check *check, 
short status, const cha
                chunk_reset(&trash);
 
                /* FIXME begin: calculate local version of the 
health/rise/fall/state */
-               health = s->health;
+               health = check->health;
                rise   = s->rise;
                fall   = s->fall;
                state  = s->state;
@@ -395,10 +395,10 @@ void set_server_down(struct check *check)
        int xferred;
 
        if (s->state & SRV_MAINTAIN) {
-               s->health = s->rise;
+               check->health = s->rise;
        }
 
-       if (s->health == s->rise || s->track) {
+       if (check->health == s->rise || s->track) {
                int srv_was_paused = s->state & SRV_GOINGDOWN;
                int prev_srv_count = s->proxy->srv_bck + s->proxy->srv_act;
 
@@ -451,7 +451,7 @@ void set_server_down(struct check *check)
                                        set_server_down(check);
        }
 
-       s->health = 0; /* failure */
+       check->health = 0; /* failure */
 }
 
 void set_server_up(struct check *check) {
@@ -462,10 +462,10 @@ void set_server_up(struct check *check) {
        unsigned int old_state = s->state;
 
        if (s->state & SRV_MAINTAIN) {
-               s->health = s->rise;
+               check->health = s->rise;
        }
 
-       if (s->health == s->rise || s->track) {
+       if (check->health == s->rise || s->track) {
                if (s->proxy->srv_bck == 0 && s->proxy->srv_act == 0) {
                        if (s->proxy->last_change < now.tv_sec)         // 
ignore negative times
                                s->proxy->down_time += now.tv_sec - 
s->proxy->last_change;
@@ -534,8 +534,8 @@ void set_server_up(struct check *check) {
                                        set_server_up(check);
        }
 
-       if (s->health >= s->rise)
-               s->health = s->rise + s->fall - 1; /* OK now */
+       if (check->health >= s->rise)
+               check->health = s->rise + s->fall - 1; /* OK now */
 
 }
 
@@ -659,8 +659,8 @@ void health_adjust(struct server *s, short status)
 
                case HANA_ONERR_SUDDTH:
                /* simulate a pre-fatal failed health check */
-                       if (s->health > s->rise)
-                               s->health = s->rise + 1;
+                       if (s->check.health > s->rise)
+                               s->check.health = s->rise + 1;
 
                        /* no break - fall through */
 
@@ -668,8 +668,8 @@ void health_adjust(struct server *s, short status)
                /* simulate a failed health check */
                        set_server_check_status(&s->check, HCHK_STATUS_HANA, 
trash.str);
 
-                       if (s->health > s->rise) {
-                               s->health--; /* still good */
+                       if (s->check.health > s->rise) {
+                               s->check.health--; /* still good */
                                s->counters.failed_checks++;
                        }
                        else
@@ -679,7 +679,7 @@ void health_adjust(struct server *s, short status)
 
                case HANA_ONERR_MARKDWN:
                /* mark server down */
-                       s->health = s->rise;
+                       s->check.health = s->rise;
                        set_server_check_status(&s->check, HCHK_STATUS_HANA, 
trash.str);
                        set_server_down(&s->check);
 
@@ -716,7 +716,7 @@ static int httpchk_build_status_header(struct server *s, 
char *buffer)
        if (!(s->state & SRV_CHECKED))
                sv_state = 6; /* should obviously never happen */
        else if (s->state & SRV_RUNNING) {
-               if (s->health == s->rise + s->fall - 1)
+               if (s->check.health == s->rise + s->fall - 1)
                        sv_state = 3; /* UP */
                else
                        sv_state = 2; /* going down */
@@ -724,7 +724,7 @@ static int httpchk_build_status_header(struct server *s, 
char *buffer)
                if (s->state & SRV_GOINGDOWN)
                        sv_state += 2;
        } else {
-               if (s->health)
+               if (s->check.health)
                        sv_state = 1; /* going up */
                else
                        sv_state = 0; /* DOWN */
@@ -732,7 +732,7 @@ static int httpchk_build_status_header(struct server *s, 
char *buffer)
 
        hlen += sprintf(buffer + hlen,
                             srv_hlt_st[sv_state],
-                            (s->state & SRV_RUNNING) ? (s->health - s->rise + 
1) : (s->health),
+                            (s->state & SRV_RUNNING) ? (s->check.health - 
s->rise + 1) : (s->check.health),
                             (s->state & SRV_RUNNING) ? (s->fall) : (s->rise));
 
        hlen += sprintf(buffer + hlen, "; name=%s/%s; node=%s; weight=%d/%d; 
scur=%d/%d; qcur=%d",
@@ -1417,8 +1417,8 @@ static struct task *process_chk(struct task *t)
                /* here, we have seen a synchronous error, no fd was allocated 
*/
 
                check->state &= ~CHK_RUNNING;
-               if (s->health > s->rise) {
-                       s->health--; /* still good */
+               if (check->health > s->rise) {
+                       check->health--; /* still good */
                        s->counters.failed_checks++;
                }
                else
@@ -1490,9 +1490,9 @@ static struct task *process_chk(struct task *t)
                        conn_full_close(conn);
                }
 
-               if (s->check.result & SRV_CHK_FAILED) {    /* a failure or 
timeout detected */
-                       if (s->health > s->rise) {
-                               s->health--; /* still good */
+               if (check->result & SRV_CHK_FAILED) {    /* a failure or 
timeout detected */
+                       if (check->health > s->rise) {
+                               check->health--; /* still good */
                                s->counters.failed_checks++;
                        }
                        else
@@ -1507,8 +1507,8 @@ static struct task *process_chk(struct task *t)
                                        set_server_disabled(check);
                        }
 
-                       if (s->health < s->rise + s->fall - 1) {
-                               s->health++; /* was bad, stays for a while */
+                       if (check->health < s->rise + s->fall - 1) {
+                               check->health++; /* was bad, stays for a while 
*/
                                set_server_up(check);
                        }
                }
diff --git a/src/dumpstats.c b/src/dumpstats.c
index 19f9848..a7dce57 100644
--- a/src/dumpstats.c
+++ b/src/dumpstats.c
@@ -1309,14 +1309,14 @@ static int stats_sock_parse_request(struct 
stream_interface *si, char *line)
                                        */
                                        if (sv->track->state & SRV_RUNNING) {
                                                set_server_up(&sv->check);
-                                               sv->health = sv->rise;  /* up, 
but will fall down at first failure */
+                                               sv->check.health = sv->rise;    
/* up, but will fall down at first failure */
                                        } else {
                                                sv->state &= ~SRV_MAINTAIN;
                                                set_server_down(&sv->check);
                                        }
                                } else {
                                        set_server_up(&sv->check);
-                                       sv->health = sv->rise;  /* up, but will 
fall down at first failure */
+                                       sv->check.health = sv->rise;    /* up, 
but will fall down at first failure */
                                }
                        }
 
@@ -2266,7 +2266,7 @@ static int stats_dump_sv_stats(struct stream_interface 
*si, struct proxy *px, in
                        chunk_appendf(&trash, "%s ", human_time(now.tv_sec - 
ref->last_change, 1));
                        chunk_appendf(&trash,
                                      srv_hlt_st[state],
-                                     (ref->state & SRV_RUNNING) ? (ref->health 
- ref->rise + 1) : (ref->health),
+                                     (ref->state & SRV_RUNNING) ? 
(ref->check.health - ref->rise + 1) : (ref->check.health),
                                      (ref->state & SRV_RUNNING) ? (ref->fall) 
: (ref->rise));
                }
 
@@ -2378,7 +2378,7 @@ static int stats_dump_sv_stats(struct stream_interface 
*si, struct proxy *px, in
                else
                        chunk_appendf(&trash,
                                      srv_hlt_st[state],
-                                     (ref->state & SRV_RUNNING) ? (ref->health 
- ref->rise + 1) : (ref->health),
+                                     (ref->state & SRV_RUNNING) ? 
(ref->check.health - ref->rise + 1) : (ref->check.health),
                                      (ref->state & SRV_RUNNING) ? (ref->fall) 
: (ref->rise));
 
                chunk_appendf(&trash,
@@ -2950,7 +2950,7 @@ static int stats_dump_proxy_to_buffer(struct 
stream_interface *si, struct proxy
                        if (!(svs->state & SRV_CHECKED))
                                sv_state = 6;
                        else if (svs->state & SRV_RUNNING) {
-                               if (svs->health == svs->rise + svs->fall - 1)
+                               if (svs->check.health == svs->rise + svs->fall 
- 1)
                                        sv_state = 3; /* UP */
                                else
                                        sv_state = 2; /* going down */
@@ -2959,7 +2959,7 @@ static int stats_dump_proxy_to_buffer(struct 
stream_interface *si, struct proxy
                                        sv_state += 2;
                        }
                        else
-                               if (svs->health)
+                               if (svs->check.health)
                                        sv_state = 1; /* going up */
                                else
                                        sv_state = 0; /* DOWN */
diff --git a/src/proto_http.c b/src/proto_http.c
index db610f2..65cac70 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -2923,7 +2923,7 @@ int http_process_req_stat_post(struct stream_interface 
*si, struct http_txn *txn
                                                if ((px->state != PR_STSTOPPED) 
&& (sv->state & SRV_MAINTAIN)) {
                                                        /* Already in 
maintenance, we can change the server state */
                                                        
set_server_up(&sv->check);
-                                                       sv->health = sv->rise;  
/* up, but will fall down at first failure */
+                                                       sv->check.health = 
sv->rise;    /* up, but will fall down at first failure */
                                                        altered_servers++;
                                                        total_servers++;
                                                }
diff --git a/src/server.c b/src/server.c
index 87ce061..dd6e9e6 100644
--- a/src/server.c
+++ b/src/server.c
@@ -34,10 +34,10 @@ int srv_getinter(const struct check *check)
 {
        const struct server *s = check->server;
 
-       if ((s->state & SRV_CHECKED) && (s->health == s->rise + s->fall - 1))
+       if ((s->state & SRV_CHECKED) && (check->health == s->rise + s->fall - 
1))
                return check->inter;
 
-       if (!(s->state & SRV_RUNNING) && s->health==0)
+       if (!(s->state & SRV_RUNNING) && check->health == 0)
                return (check->downinter)?(check->downinter):(check->inter);
 
        return (check->fastinter)?(check->fastinter):(check->inter);
-- 
1.8.3.2


Reply via email to