static int commit_member()

in native/common/jk_status.c [3430:3639]


static int commit_member(jk_ws_service_t *s,
                         status_endpoint_t *p,
                         lb_worker_t *lb,
                         lb_sub_worker_t *wr,
                         ajp_worker_t *aw,
                         int *side_effect,
                         jk_log_context_t *l)
{
    const char *arg;
    const char *lb_name = NULL;
    status_worker_t *w = p->worker;
    int rc = JK_TRUE;
    int rv;
    int i;
    int old;
    int resolve = JK_FALSE;
    shm_str host;
    int  port = 0;

    JK_TRACE_ENTER(l);
    if (lb) {
        lb_name = lb->name;
        if (JK_IS_DEBUG_LEVEL(l))
            jk_log(l, JK_LOG_DEBUG,
                   "Status worker '%s' committing changes for sub worker '%s' of lb worker '%s'",
                   w->name, wr->name, lb_name);
    }
    else {
        if (JK_IS_DEBUG_LEVEL(l))
            jk_log(l, JK_LOG_DEBUG,
                   "Status worker '%s' committing changes for ajp worker '%s'",
                   w->name, aw->name);
    }

    if (lb) {
        if (status_get_string(p, JK_STATUS_ARG_LBM_ACTIVATION, NULL, &arg, l) == JK_TRUE) {
            i = jk_lb_get_activation_code(arg);
            if (i != wr->activation && i >= 0 && i <= JK_LB_ACTIVATION_MAX) {
                jk_log(l, JK_LOG_INFO,
                       "Status worker '%s' changing 'activation' for sub worker '%s' of lb worker '%s' from '%s' to '%s'",
                       w->name, wr->name, lb_name, jk_lb_get_activation(wr, l), jk_lb_get_activation_direct(i, l));
                wr->activation = i;
                *side_effect |= JK_STATUS_NEEDS_RESET_LB_VALUES | JK_STATUS_NEEDS_PUSH;
            }
        }
        if (set_int_if_changed(p, wr->name, "lbfactor", JK_STATUS_ARG_LBM_FACTOR,
                               1, INT_MAX, &wr->lb_factor, lb_name, l))
            /* Recalculate the load multiplicators wrt. lb_factor */
            *side_effect |= JK_STATUS_NEEDS_UPDATE_MULT | JK_STATUS_NEEDS_PUSH;
        if ((rv = status_get_string(p, JK_STATUS_ARG_LBM_ROUTE,
                                    NULL, &arg, l)) == JK_TRUE) {
            int ret = jk_shm_str_init_ne(wr->route, arg, "route", l);
            if (ret == -1) {
                const char *msg = "Update failed (at least partially): new route '%s' "
                                  "too long for sub worker '%s', see log file for details.";
                size_t size = strlen(msg) + strlen(arg) + strlen(wr->name) + 1;
                p->msg = jk_pool_alloc(s->pool, size);
                snprintf(p->msg, size, msg, arg, aw->name);
                rc = JK_FALSE;
            }
            else if (ret != 0) {
                jk_log(l, JK_LOG_INFO,
                       "Status worker '%s' changing 'route' for sub worker '%s' of lb worker '%s' from '%s' to '%s'",
                       w->name, wr->name, lb_name, wr->route, arg);
                *side_effect |= JK_STATUS_NEEDS_PUSH;
                if (!wr->domain[0]) {
                    char * id_domain = strchr(wr->route, '.');
                    if (id_domain) {
                        *id_domain = '\0';
                        strcpy(wr->domain, wr->route);
                        *id_domain = '.';
                    }
                }
            }
        }
        if ((rv = status_get_string(p, JK_STATUS_ARG_LBM_REDIRECT,
                                    NULL, &arg, l)) == JK_TRUE) {
            int ret = jk_shm_str_init_ne(wr->redirect, arg, "redirect", l);
            if (ret == -1) {
                const char *msg = "Update failed (at least partially): new redirect '%s' "
                                  "too long for sub worker '%s', see log file for details.";
                size_t size = strlen(msg) + strlen(arg) + strlen(wr->name) + 1;
                p->msg = jk_pool_alloc(s->pool, size);
                snprintf(p->msg, size, msg, arg, aw->name);
                rc = JK_FALSE;
            }
            else if (ret != 0) {
                jk_log(l, JK_LOG_INFO,
                       "Status worker '%s' changing 'redirect' for sub worker '%s' of lb worker '%s' from '%s' to '%s'",
                       w->name, wr->name, lb_name, wr->redirect, arg);
                *side_effect |= JK_STATUS_NEEDS_PUSH;
            }
        }
        if ((rv = status_get_string(p, JK_STATUS_ARG_LBM_DOMAIN,
                                    NULL, &arg, l)) == JK_TRUE) {
            int ret = jk_shm_str_init_ne(wr->domain, arg, "domain", l);
            if (ret == -1) {
                const char *msg = "Update failed (at least partially): new domain '%s' "
                                  "too long for sub worker '%s', see log file for details.";
                size_t size = strlen(msg) + strlen(arg) + strlen(wr->name) + 1;
                p->msg = jk_pool_alloc(s->pool, size);
                snprintf(p->msg, size, msg, arg, aw->name);
                rc = JK_FALSE;
            }
            else if (ret != 0) {
                jk_log(l, JK_LOG_INFO,
                       "Status worker '%s' changing 'domain' for sub worker '%s' of lb worker '%s' from '%s' to '%s'",
                       w->name, wr->name, lb_name, wr->domain, arg);
                *side_effect |= JK_STATUS_NEEDS_PUSH;
            }
        }
        if (set_int_if_changed(p, wr->name, "distance", JK_STATUS_ARG_LBM_DISTANCE,
                               0, INT_MAX, &wr->distance, lb_name, l))
            *side_effect |= JK_STATUS_NEEDS_PUSH;
    }
    old = aw->cache_timeout;
    if (set_int_if_changed(p, aw->name, "connection_pool_timeout", JK_STATUS_ARG_AJP_CACHE_TO,
                           0, INT_MAX, &aw->cache_timeout, lb_name, l)) {
        *side_effect |= JK_STATUS_NEEDS_PUSH;
        if (old == 0) {
            unsigned int i;
            for (i = 0; i < aw->ep_cache_sz; i++) {
                ajp_endpoint_t *ae = (ajp_endpoint_t *) aw->ep_cache[i];
                if (ae)
                    ae->last_access = time(NULL);
            }
        }
    }
    port = aw->port;
    if (set_int_if_changed(p, aw->name, "port", JK_STATUS_ARG_AJP_PORT,
                           0, INT_MAX, &port, lb_name, l)) {
        jk_shm_str_copy(host, aw->host, l);
        resolve = JK_TRUE;
    }
    if ((rv = status_get_string(p, JK_STATUS_ARG_AJP_HOST_STR,
                                NULL, &arg, l)) == JK_TRUE) {
        int ret = jk_shm_str_init_ne(host, arg, "host name", l);
        if (ret == -1) {
            const char *msg = "Update failed (at least partially): new host name '%s' "
                              "too long for sub worker '%s', see log file for details.";
            size_t size = strlen(msg) + strlen(arg) + strlen(aw->name) + 1;
            p->msg = jk_pool_alloc(s->pool, size);
            snprintf(p->msg, size, msg, arg, aw->name);
            rc = JK_FALSE;
        }
        else if (ret != 0) {
            jk_log(l, JK_LOG_INFO,
                   "Status worker '%s' changing 'host' for sub worker '%s' from '%s' to '%s'",
                   w->name, aw->name, aw->host, arg);
            resolve = JK_TRUE;
        }
    }
    if (resolve == JK_TRUE) {
        jk_sockaddr_t inet_addr;
        if (!jk_resolve(host, port, &inet_addr,
                        aw->worker.we->pool, aw->prefer_ipv6, l)) {
            const char *msg = "Update failed (at least partially): could not resolve address '%s:%d' for sub worker '%s'.";
            size_t size = strlen(msg) + strlen(host) + strlen(aw->name) + 10 + 1;
            p->msg = jk_pool_alloc(s->pool, size);
            snprintf(p->msg, size, msg, host, port, aw->name);
            jk_log(l, JK_LOG_ERROR,
                   "Status worker '%s' failed resolving address '%s:%d' for sub worker '%s'.",
                   w->name, host, port, aw->name);
            rc = JK_FALSE;
        }
        else {
            /* This is not atomic and not thread safe */
            aw->port = port;
            jk_shm_str_copy(aw->host, host, l);
            jk_clone_sockaddr(&(aw->worker_inet_addr), &inet_addr);
            *side_effect |= JK_STATUS_NEEDS_PUSH | JK_STATUS_NEEDS_ADDR_PUSH;
        }
    }
    if (set_int_if_changed(p, aw->name, "ping_timeout", JK_STATUS_ARG_AJP_PING_TO,
                           0, INT_MAX, &aw->ping_timeout, lb_name, l))
        *side_effect |= JK_STATUS_NEEDS_PUSH;
    if (set_int_if_changed(p, aw->name, "connect_timeout", JK_STATUS_ARG_AJP_CONNECT_TO,
                           0, INT_MAX, &aw->connect_timeout, lb_name, l))
        *side_effect |= JK_STATUS_NEEDS_PUSH;
    if (set_int_if_changed(p, aw->name, "prepost_timeout", JK_STATUS_ARG_AJP_PREPOST_TO,
                           0, INT_MAX, &aw->prepost_timeout, lb_name, l))
        *side_effect |= JK_STATUS_NEEDS_PUSH;
    if (set_int_if_changed(p, aw->name, "reply_timeout", JK_STATUS_ARG_AJP_REPLY_TO,
                           0, INT_MAX, &aw->reply_timeout, lb_name, l))
        *side_effect |= JK_STATUS_NEEDS_PUSH;
    if (set_int_if_changed(p, aw->name, "retries", JK_STATUS_ARG_AJP_RETRIES,
                           1, INT_MAX, &aw->retries, lb_name, l))
        *side_effect |= JK_STATUS_NEEDS_PUSH;
    if (set_int_if_changed(p, aw->name, "retry_interval", JK_STATUS_ARG_AJP_RETRY_INT,
                           1, INT_MAX, &aw->retry_interval, lb_name, l))
        *side_effect |= JK_STATUS_NEEDS_PUSH;
    if (set_int_if_changed(p, aw->name, "connection_ping_interval", JK_STATUS_ARG_AJP_CPING_INT,
                           1, INT_MAX, &aw->conn_ping_interval, lb_name, l))
        *side_effect |= JK_STATUS_NEEDS_PUSH;
    if (set_uint_if_changed(p, aw->name, "recovery_options", JK_STATUS_ARG_AJP_REC_OPTS,
                           0, INT_MAX, 1, &aw->recovery_opts, lb_name, l))
        *side_effect |= JK_STATUS_NEEDS_PUSH;
    if (set_int_if_changed(p, aw->name, "busy_limit", JK_STATUS_ARG_AJP_BUSY_LIMIT,
                           0, INT_MAX, &aw->busy_limit, lb_name, l))
        *side_effect |= JK_STATUS_NEEDS_PUSH;
    if (set_uint_if_changed(p, aw->name, "max_packet_size", JK_STATUS_ARG_AJP_MAX_PK_SZ,
                           AJP13_DEF_PACKET_SIZE, AJP13_MAX_PACKET_SIZE, AJP13_PACKET_SIZE_ALIGN,
                           &aw->max_packet_size, lb_name, l)) {
        *side_effect |= JK_STATUS_NEEDS_PUSH;
        if (aw->max_packet_size > lb->max_packet_size) {
            lb->max_packet_size = aw->max_packet_size;
        }
    }
    return rc;
}