You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ji...@apache.org on 2015/12/29 18:42:20 UTC

svn commit: r1722195 - in /httpd/httpd/trunk/modules/proxy: mod_proxy.h mod_proxy_hcheck.c proxy_util.c

Author: jim
Date: Tue Dec 29 17:42:19 2015
New Revision: 1722195

URL: http://svn.apache.org/viewvc?rev=1722195&view=rev
Log:
Make aware of new status: Failed Health Check.
Store the number of current passes/fails in shm

Modified:
    httpd/httpd/trunk/modules/proxy/mod_proxy.h
    httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c
    httpd/httpd/trunk/modules/proxy/proxy_util.c

Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.h?rev=1722195&r1=1722194&r2=1722195&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy.h (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy.h Tue Dec 29 17:42:19 2015
@@ -270,8 +270,11 @@ struct proxy_conn_pool {
     proxy_conn_rec *conn;   /* Single connection for prefork mpm */
 };
 
-/* Keep below in sync with proxy_util.c! */
 /* worker status bits */
+/*
+ * NOTE: Keep up-to-date w/ proxy_wstat_tbl[]
+ * in proxy_util.c !
+ */
 #define PROXY_WORKER_INITIALIZED    0x0001
 #define PROXY_WORKER_IGNORE_ERRORS  0x0002
 #define PROXY_WORKER_DRAIN          0x0004
@@ -282,6 +285,7 @@ struct proxy_conn_pool {
 #define PROXY_WORKER_IN_ERROR       0x0080
 #define PROXY_WORKER_HOT_STANDBY    0x0100
 #define PROXY_WORKER_FREE           0x0200
+#define PROXY_WORKER_HC_FAIL        0x0400
 
 /* worker status flags */
 #define PROXY_WORKER_INITIALIZED_FLAG    'O'
@@ -294,9 +298,11 @@ struct proxy_conn_pool {
 #define PROXY_WORKER_IN_ERROR_FLAG       'E'
 #define PROXY_WORKER_HOT_STANDBY_FLAG    'H'
 #define PROXY_WORKER_FREE_FLAG           'F'
+#define PROXY_WORKER_HC_FAIL_FLAG        '#'
 
 #define PROXY_WORKER_NOT_USABLE_BITMAP ( PROXY_WORKER_IN_SHUTDOWN | \
-PROXY_WORKER_DISABLED | PROXY_WORKER_STOPPED | PROXY_WORKER_IN_ERROR )
+PROXY_WORKER_DISABLED | PROXY_WORKER_STOPPED | PROXY_WORKER_IN_ERROR | \
+PROXY_WORKER_HC_FAIL )
 
 /* NOTE: these check the shared status */
 #define PROXY_WORKER_IS_INITIALIZED(f)  ( (f)->s->status &  PROXY_WORKER_INITIALIZED )
@@ -371,7 +377,9 @@ typedef struct {
     int             index;      /* shm array index */
     int             method;     /* method to use for health check */
     int             passes;     /* number of successes for check to pass */
-    int             fails;       /* number of failures for check to fail */
+    int             pcount;     /* current count of passes */
+    int             fails;      /* number of failures for check to fail */
+    int             fcount;     /* current count of failures */
     proxy_hashes    hash;       /* hash of worker name */
     unsigned int    status;     /* worker status bitfield */
     enum {

Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c?rev=1722195&r1=1722194&r2=1722195&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c Tue Dec 29 17:42:19 2015
@@ -16,6 +16,8 @@
 
 #include "mod_proxy.h"
 #include "mod_watchdog.h"
+#include "ap_slotmem.h"
+
 
 module AP_MODULE_DECLARE_DATA proxy_hcheck_module;
 
@@ -29,14 +31,14 @@ static char *methods[] = {
       "NULL", "OPTIONS", "HEAD", "GET", "POST", "CPING"
 };
 
-typedef struct hcheck_template_t {
+typedef struct hc_template_t {
     char *name;
     int method;
     int passes;
     int fails;
     apr_interval_time_t interval;
     char *hurl;
-} hcheck_template_t;
+} hc_template_t;
 
 static apr_pool_t *ptemplate = NULL;
 static apr_array_header_t *templates = NULL;
@@ -54,15 +56,15 @@ static const char *set_worker_hc_param(a
                                     void *tmp)
 {
     int ival;
-    hcheck_template_t *ctx;
+    hc_template_t *ctx;
 
     if (!worker && !tmp) {
         return "Bad call to set_worker_hc_param()";
     }
-    ctx = (hcheck_template_t *)tmp;
+    ctx = (hc_template_t *)tmp;
     if (!strcasecmp(key, "hcheck")) {
-        hcheck_template_t *template;
-        template = (hcheck_template_t *)templates->elts;
+        hc_template_t *template;
+        template = (hc_template_t *)templates->elts;
         for (ival = 0; ival < templates->nelts; ival++, template++) {
             if (!ap_casecmpstr(template->name, val)) {
                 worker->s->method = template->method;
@@ -138,8 +140,8 @@ static const char *set_hcheck(cmd_parms
 {
     char *name = NULL;
     char *word, *val;
-    hcheck_template_t template;
-    hcheck_template_t *tpush;
+    hc_template_t template;
+    hc_template_t *tpush;
     const char *err = ap_check_cmd_context(cmd, NOT_IN_HTACCESS);
     if (err)
         return err;
@@ -162,8 +164,8 @@ static const char *set_hcheck(cmd_parms
         if (err)
             return apr_pstrcat(cmd->temp_pool, "HCheckTemplate: ", err, " ", word, "=", val, "; ", name, NULL);
         /* No error means we have a valid template */
-        tpush = (hcheck_template_t *)apr_array_push(templates);
-        memcpy(tpush, &template, sizeof(hcheck_template_t));
+        tpush = (hc_template_t *)apr_array_push(templates);
+        memcpy(tpush, &template, sizeof(hc_template_t));
     }
 
     return NULL;
@@ -207,7 +209,7 @@ static int hc_pre_config(apr_pool_t *p,
         apr_pool_create(&ptemplate, p);
     }
     if (!templates) {
-        templates = apr_array_make(ptemplate, 10, sizeof(hcheck_template_t));
+        templates = apr_array_make(ptemplate, 10, sizeof(hc_template_t));
     }
     return OK;
 }
@@ -259,7 +261,7 @@ static const command_rec command_table[]
 
 static void hc_register_hooks(apr_pool_t *p)
 {
-    static const char *const runAfter[] = { "mod_watchdog.c", NULL};
+    static const char *const runAfter[] = { "mod_watchdog.c", "mod_proxy_balancer.c", NULL};
     APR_REGISTER_OPTIONAL_FN(set_worker_hc_param);
     ap_hook_pre_config(hc_pre_config, NULL, NULL, APR_HOOK_LAST);
     ap_hook_post_config(hc_post_config, NULL, runAfter, APR_HOOK_LAST);

Modified: httpd/httpd/trunk/modules/proxy/proxy_util.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/proxy_util.c?rev=1722195&r1=1722194&r2=1722195&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/proxy_util.c (original)
+++ httpd/httpd/trunk/modules/proxy/proxy_util.c Tue Dec 29 17:42:19 2015
@@ -54,21 +54,22 @@ typedef struct {
     const char   *proxy_auth;      /* Proxy authorization */
 } forward_info;
 
-/* Keep synced with mod_proxy.h! */
-static struct wstat {
+static struct proxy_wstat {
     unsigned int bit;
     char flag;
     const char *name;
-} wstat_tbl[] = {
+} proxy_wstat_tbl[] = {
     {PROXY_WORKER_INITIALIZED,   PROXY_WORKER_INITIALIZED_FLAG,   "Init "},
     {PROXY_WORKER_IGNORE_ERRORS, PROXY_WORKER_IGNORE_ERRORS_FLAG, "Ign "},
     {PROXY_WORKER_DRAIN,         PROXY_WORKER_DRAIN_FLAG,         "Drn "},
+    {PROXY_WORKER_GENERIC,       PROXY_WORKER_GENERIC_FLAG,       "Gen "},
     {PROXY_WORKER_IN_SHUTDOWN,   PROXY_WORKER_IN_SHUTDOWN_FLAG,   "Shut "},
     {PROXY_WORKER_DISABLED,      PROXY_WORKER_DISABLED_FLAG,      "Dis "},
     {PROXY_WORKER_STOPPED,       PROXY_WORKER_STOPPED_FLAG,       "Stop "},
     {PROXY_WORKER_IN_ERROR,      PROXY_WORKER_IN_ERROR_FLAG,      "Err "},
     {PROXY_WORKER_HOT_STANDBY,   PROXY_WORKER_HOT_STANDBY_FLAG,   "Stby "},
     {PROXY_WORKER_FREE,          PROXY_WORKER_FREE_FLAG,          "Free "},
+    {PROXY_WORKER_HC_FAIL,       PROXY_WORKER_HC_FAIL_FLAG,       "HcFl "},
     {0x0, '\0', NULL}
 };
 
@@ -3126,7 +3127,7 @@ PROXY_DECLARE(apr_status_t) ap_proxy_set
 {
     unsigned int *status = &w->s->status;
     char flag = toupper(c);
-    struct wstat *pwt = wstat_tbl;
+    struct proxy_wstat *pwt = proxy_wstat_tbl;
     while (pwt->bit) {
         if (flag == pwt->flag) {
             if (set)
@@ -3144,12 +3145,15 @@ PROXY_DECLARE(char *) ap_proxy_parse_wst
 {
     char *ret = "";
     unsigned int status = w->s->status;
-    struct wstat *pwt = wstat_tbl;
+    struct proxy_wstat *pwt = proxy_wstat_tbl;
     while (pwt->bit) {
         if (status & pwt->bit)
             ret = apr_pstrcat(p, ret, pwt->name, NULL);
         pwt++;
     }
+    if (!*ret) {
+        ret = "??? ";
+    }
     if (PROXY_WORKER_IS_USABLE(w))
         ret = apr_pstrcat(p, ret, "Ok ", NULL);
     return ret;