static int update_worker()

in native/common/jk_status.c [4332:4496]


static int update_worker(jk_ws_service_t *s,
                         status_endpoint_t *p,
                         jk_log_context_t *l)
{
    const char *worker;
    const char *sub_worker;
    status_worker_t *w = p->worker;
    jk_worker_t *jw = NULL;
    lb_worker_t *lb = NULL;
    lb_sub_worker_t *wr = NULL;
    ajp_worker_t *aw = NULL;
    int rc = JK_TRUE;
    int rv;

    JK_TRACE_ENTER(l);
    if (fetch_worker_and_sub_worker(p, "updating", &worker, &sub_worker, l) == JK_FALSE ||
        search_worker(s, p, &jw, worker, l) == JK_FALSE) {
        JK_TRACE_EXIT(l);
        return JK_FALSE;
    }

    if (jw->type == JK_LB_WORKER_TYPE) {
        if (check_valid_lb(s, p, jw, worker, &lb, 0, l) == JK_FALSE) {
            JK_TRACE_EXIT(l);
            return JK_FALSE;
        }

        if (lb->sequence != lb->s->h.sequence)
            jk_lb_pull(lb, JK_TRUE, l);
        if (!sub_worker || !sub_worker[0]) {
            const char *arg;
            if (status_get_string(p, JK_STATUS_ARG_ATTRIBUTE,
                                  NULL, &arg, l) == JK_TRUE) {
                if (JK_IS_DEBUG_LEVEL(l))
                    jk_log(l, JK_LOG_DEBUG,
                           "Status worker '%s' %s lb worker '%s' with all sub workers",
                           w->name, "updating", lb->name);
                commit_all_members(s, p, jw, arg, l);
            }
            else {
                if (JK_IS_DEBUG_LEVEL(l))
                    jk_log(l, JK_LOG_DEBUG,
                           "Status worker '%s' %s lb worker '%s'",
                           w->name, "updating", lb->name);
                commit_worker(s, p, jw, l);
            }
            JK_TRACE_EXIT(l);
            return JK_TRUE;
        }
        else {
            unsigned int idx = 0;
            unsigned int *wi = NULL;
            int is_wildchar = JK_FALSE;

            if (strchr(sub_worker, '*') || strchr(sub_worker, '?')) {
                /* We have a wildchar matching rule */
                wi = &idx;
                is_wildchar = JK_TRUE;
            }
            for (;;) {
                if (search_sub_worker(s, p, jw, worker, &wr, sub_worker,
                                      wi, l) == JK_FALSE) {
                    if (!idx) {
                        JK_TRACE_EXIT(l);
                        return JK_FALSE;
                    }
                    else {
                        /* We have found at least one match previously */
                        p->msg = "OK";
                        break;
                    }
                }
                if (JK_IS_DEBUG_LEVEL(l))
                    jk_log(l, JK_LOG_DEBUG,
                           "Status worker '%s' %s lb worker '%s' sub worker '%s'",
                           w->name, "updating", lb->name, wr->name);
                aw = (ajp_worker_t *)wr->worker->worker_private;
                rv = 0;
                rc = commit_member(s, p, lb, wr, aw, &rv, l);
                if (rv & JK_STATUS_NEEDS_ADDR_PUSH) {
                    aw->addr_sequence = -1;
                }
                if (rv & JK_STATUS_NEEDS_RESET_LB_VALUES)
                    reset_lb_values(lb, l);
                if (rv & JK_STATUS_NEEDS_UPDATE_MULT)
                    /* Recalculate the load multiplicators wrt. lb_factor */
                    update_mult(lb, l);
                if (rv & (JK_STATUS_NEEDS_PUSH | JK_STATUS_NEEDS_ADDR_PUSH)) {
                    wr->sequence = -1;
                    lb->sequence = -1;
                    jk_lb_push(lb, JK_TRUE, rv & JK_STATUS_NEEDS_UPDATE_MULT ? JK_TRUE: JK_FALSE, l);
                }
                if (rc == JK_FALSE) {
                    jk_log(l, JK_LOG_ERROR,
                           "Status worker '%s' failed updating sub worker '%s' (at least partially).%s",
                           w->name, aw->name, (is_wildchar == JK_TRUE) ? " Aborting further wildcard updates." : "");
                    if (!strncmp("OK", p->msg, 3)) {
                        const char *msg = "Update failed (at least partially) for sub worker '%s'";
                        size_t size = strlen(msg) + strlen(aw->name) + 1;
                        p->msg = jk_pool_alloc(s->pool, size);
                        snprintf(p->msg, size, msg, aw->name);
                    }
                    if (is_wildchar == JK_TRUE) {
                        const char *msg = " Aborting further wildcard updates.";
                        size_t size = strlen(msg) + strlen(p->msg) + 1;
                        p->msg = jk_pool_realloc(s->pool, size, p->msg, strlen(p->msg) + 1);
                        strcat(p->msg, msg);
                    }
                    break;
                }
                if (!wi)
                    break;
            }
            JK_TRACE_EXIT(l);
            return rc;
        }
    }
    else if (jw->type == JK_AJP13_WORKER_TYPE ||
             jw->type == JK_AJP14_WORKER_TYPE) {
        ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;
        if (aw) {
            if (JK_IS_DEBUG_LEVEL(l))
                jk_log(l, JK_LOG_DEBUG,
                       "Status worker '%s' %s ajp worker '%s'",
                       w->name, "updating", aw->name);
            if (aw->sequence != aw->s->h.sequence)
                jk_ajp_pull(aw, JK_TRUE, l);
            rv = 0;
            rc = commit_member(s, p, NULL, NULL, aw, &rv, l);
            if (rv & JK_STATUS_NEEDS_ADDR_PUSH) {
                aw->addr_sequence = -1;
            }
            if (rv & (JK_STATUS_NEEDS_PUSH | JK_STATUS_NEEDS_ADDR_PUSH)) {
                aw->sequence = -1;
                jk_ajp_push(aw, JK_TRUE, l);
            }
            if (rc == JK_FALSE) {
                jk_log(l, JK_LOG_ERROR,
                       "Status worker '%s' failed updating worker '%s' (at least partially).",
                       w->name, aw->name);
                if (!strncmp("OK", p->msg, 3)) {
                    const char *msg = "Update failed (at least partially) for worker '%s'";
                    size_t size = strlen(msg) + strlen(aw->name) + 1;
                    p->msg = jk_pool_alloc(s->pool, size);
                    snprintf(p->msg, size, msg, aw->name);
                }
            }
            JK_TRACE_EXIT(l);
            return rc;
        }
        else {
            jk_log(l, JK_LOG_WARNING,
                   "Status worker '%s' aw worker is (null)",
                   w->name);
        }
    }
    else {
        if (JK_IS_DEBUG_LEVEL(l))
            jk_log(l, JK_LOG_DEBUG,
                   "Status worker '%s' worker type not implemented",
                   w->name);
    }
    JK_TRACE_EXIT(l);
    return JK_FALSE;
}