static void commit_all_members()

in native/common/jk_status.c [3641:3915]


static void commit_all_members(jk_ws_service_t *s,
                               status_endpoint_t *p,
                               jk_worker_t *jw,
                               const char *attribute,
                               jk_log_context_t *l)
{
    const char *arg;
    char vname[32];
    const char *name = NULL;
    lb_worker_t *lb = NULL;
    status_worker_t *w = p->worker;
    const char *aname;
    int i;
    int rc = 0;
    unsigned int j;
    int push_all_members = JK_FALSE;

    JK_TRACE_ENTER(l);
    if (!attribute) {
        jk_log(l, JK_LOG_WARNING,
               "Status worker '%s' missing request parameter '%s'",
               w->name, JK_STATUS_ARG_ATTRIBUTE);
        JK_TRACE_EXIT(l);
        return;
    }
    else {
        if (!strcmp(attribute, JK_STATUS_ARG_LBM_ACTIVATION))
            aname=JK_STATUS_ARG_LBM_TEXT_ACTIVATION;
        else if (!strcmp(attribute, JK_STATUS_ARG_LBM_FACTOR))
            aname=JK_STATUS_ARG_LBM_TEXT_FACTOR;
        else if (!strcmp(attribute, JK_STATUS_ARG_LBM_ROUTE))
            aname=JK_STATUS_ARG_LBM_TEXT_ROUTE;
        else if (!strcmp(attribute, JK_STATUS_ARG_LBM_REDIRECT))
            aname=JK_STATUS_ARG_LBM_TEXT_REDIRECT;
        else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DOMAIN))
            aname=JK_STATUS_ARG_LBM_TEXT_DOMAIN;
        else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DISTANCE))
            aname=JK_STATUS_ARG_LBM_TEXT_DISTANCE;
        else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CACHE_TO))
            aname=JK_STATUS_ARG_AJP_TEXT_CACHE_TO;
        else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PING_TO))
            aname=JK_STATUS_ARG_AJP_TEXT_PING_TO;
        else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CONNECT_TO))
            aname=JK_STATUS_ARG_AJP_TEXT_CONNECT_TO;
        else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PREPOST_TO))
            aname=JK_STATUS_ARG_AJP_TEXT_PREPOST_TO;
        else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REPLY_TO))
            aname=JK_STATUS_ARG_AJP_TEXT_REPLY_TO;
        else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRIES))
            aname=JK_STATUS_ARG_AJP_TEXT_RETRIES;
        else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRY_INT))
            aname=JK_STATUS_ARG_AJP_TEXT_RETRY_INT;
        else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CPING_INT))
            aname=JK_STATUS_ARG_AJP_TEXT_CPING_INT;
        else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REC_OPTS))
            aname=JK_STATUS_ARG_AJP_TEXT_REC_OPTS;
        else if (!strcmp(attribute, JK_STATUS_ARG_AJP_BUSY_LIMIT))
            aname=JK_STATUS_ARG_AJP_TEXT_BUSY_LIMIT;
        else if (!strcmp(attribute, JK_STATUS_ARG_AJP_MAX_PK_SZ))
            aname=JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ;
        else {
            jk_log(l, JK_LOG_WARNING,
                   "Status worker '%s' unknown attribute '%s'",
                   w->name, attribute);
            JK_TRACE_EXIT(l);
            return;
        }
    }
    if (jw->type == JK_LB_WORKER_TYPE) {
        lb = (lb_worker_t *)jw->worker_private;
        name = lb->name;
        if (JK_IS_DEBUG_LEVEL(l))
            jk_log(l, JK_LOG_DEBUG,
                   "Status worker '%s' committing changes for attribute '%s' [%s] of all members of lb worker '%s'",
                   w->name, attribute, aname, name);
    }
    else {
        jk_log(l, JK_LOG_WARNING,
               "Status worker '%s' worker type not implemented",
               w->name);
        JK_TRACE_EXIT(l);
        return;
    }

    if (lb) {
        for (j = 0; j < lb->num_of_workers; j++) {
            int sync_needed = JK_FALSE;
            lb_sub_worker_t *wr = &(lb->lb_workers[j]);
            jk_worker_t *jw = wr->worker;
            ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;;
            snprintf(vname, 32-1, "" JK_STATUS_ARG_MULT_VALUE_BASE "%d", j);

            if (!strcmp(attribute, JK_STATUS_ARG_LBM_FACTOR)) {
                if (set_int_if_changed(p, wr->name, "lbfactor", vname,
                                       1, INT_MAX, &wr->lb_factor, name, l)) {
                    rc = 2;
                    sync_needed = JK_TRUE;
                }
            }
            else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DISTANCE)) {
                if (set_int_if_changed(p, wr->name, "distance", vname,
                                       0, INT_MAX, &wr->distance, name, l))
                    sync_needed = JK_TRUE;
            }
            else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CACHE_TO)) {
                int old = aw->cache_timeout;
                if (set_int_if_changed(p, aw->name, "connection_pool_timeout", vname,
                                       0, INT_MAX, &aw->cache_timeout, name, l)) {
                    sync_needed = JK_TRUE;
                    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);
                        }
                    }
                }
            }
            else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PING_TO)) {
                if (set_int_if_changed(p, aw->name, "ping_timeout", vname,
                                       0, INT_MAX, &aw->ping_timeout, name, l))
                    sync_needed = JK_TRUE;
            }
            else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CONNECT_TO)) {
                if (set_int_if_changed(p, aw->name, "connect_timeout", vname,
                                       0, INT_MAX, &aw->connect_timeout, name, l))
                    sync_needed = JK_TRUE;
            }
            else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PREPOST_TO)) {
                if (set_int_if_changed(p, aw->name, "prepost_timeout", vname,
                                       0, INT_MAX, &aw->prepost_timeout, name, l))
                    sync_needed = JK_TRUE;
            }
            else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REPLY_TO)) {
                if (set_int_if_changed(p, aw->name, "reply_timeout", vname,
                                       0, INT_MAX, &aw->reply_timeout, name, l))
                    sync_needed = JK_TRUE;
            }
            else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRIES)) {
                if (set_int_if_changed(p, aw->name, "retries", vname,
                                       1, INT_MAX, &aw->retries, name, l))
                    sync_needed = JK_TRUE;
            }
            else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRY_INT)) {
                if (set_int_if_changed(p, aw->name, "retry_interval", vname,
                                       1, INT_MAX, &aw->retry_interval, name, l))
                    sync_needed = JK_TRUE;
            }
            else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CPING_INT)) {
                if (set_int_if_changed(p, aw->name, "connection_ping_interval", vname,
                                       1, INT_MAX, &aw->conn_ping_interval, name, l))
                    sync_needed = JK_TRUE;
            }
            else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REC_OPTS)) {
                if (set_uint_if_changed(p, aw->name, "recovery_options", vname,
                                       0, INT_MAX, 1, &aw->recovery_opts, name, l))
                    sync_needed = JK_TRUE;
            }
            else if (!strcmp(attribute, JK_STATUS_ARG_AJP_BUSY_LIMIT)) {
                if (set_int_if_changed(p, aw->name, "busy_limit", vname,
                                       0, INT_MAX, &aw->busy_limit, name, l))
                    sync_needed = JK_TRUE;
            }
            else if (!strcmp(attribute, JK_STATUS_ARG_AJP_MAX_PK_SZ)) {
                if (set_uint_if_changed(p, aw->name, "max_packet_size", vname,
                                       AJP13_DEF_PACKET_SIZE, AJP13_MAX_PACKET_SIZE, AJP13_PACKET_SIZE_ALIGN,
                                       &aw->max_packet_size, name, l)) {
                    sync_needed = JK_TRUE;
                    if (aw->max_packet_size > lb->max_packet_size) {
                        lb->max_packet_size = aw->max_packet_size;
                    }
                }
            }
            else {
                int rv = status_get_string(p, vname, NULL, &arg, l);
                if (!strcmp(attribute, JK_STATUS_ARG_LBM_ACTIVATION)) {
                    if (rv == 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, name, jk_lb_get_activation(wr, l), jk_lb_get_activation_direct(i, l));
                            wr->activation = i;
                            rc = 1;
                            sync_needed = JK_TRUE;
                        }
                    }
                }
                else if (!strcmp(attribute, JK_STATUS_ARG_LBM_ROUTE)) {
                    if (rv == 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, name, wr->route, arg);
                            sync_needed = JK_TRUE;
                            if (!wr->domain[0]) {
                                char * id_domain = strchr(wr->route, '.');
                                if (id_domain) {
                                    *id_domain = '\0';
                                    strcpy(wr->domain, wr->route);
                                    *id_domain = '.';
                                }
                            }
                        }
                    }
                }
                else if (!strcmp(attribute, JK_STATUS_ARG_LBM_REDIRECT)) {
                    if (rv == 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, name, wr->redirect, arg);
                            sync_needed = JK_TRUE;
                        }
                    }
                }
                else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DOMAIN)) {
                    if (rv == 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, name, wr->domain, arg);
                            sync_needed = JK_TRUE;
                        }
                    }
                }
            }
            if (sync_needed == JK_TRUE) {
                wr->sequence = -1;
                if (!rc)
                    rc = 3;
            }
        }
        if (rc == 1)
            reset_lb_values(lb, l);
        else if (rc == 2) {
            /* Recalculate the load multiplicators wrt. lb_factor */
            update_mult(lb, l);
            push_all_members = JK_TRUE;
        }
        if (rc) {
            lb->sequence = -1;
            jk_lb_push(lb, JK_TRUE, push_all_members, l);
        }
    }
    JK_TRACE_EXIT(l);
}