jk_lb_worker.c

来自「以便Apache与其他服务进行整合 Mod_JK安装」· C语言 代码 · 共 1,498 行 · 第 1/4 页

C
1,498
字号
                        rec->s->state = JK_LB_STATE_ERROR;                        rec->s->error_time = time(NULL);                        jk_log(l, JK_LOG_INFO,                               "service failed, worker %s is in error state",                               rec->s->name);                    }                }                if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)                    jk_shm_unlock();            }            if ( rc == -1 ) {                /*                 * Error is recoverable by submitting the request to                 * another worker... Lets try to do that.                 */                if (JK_IS_DEBUG_LEVEL(l))                    jk_log(l, JK_LOG_DEBUG,                           "recoverable error... will try to recover on other worker");            }            if (first == 1 && s->add_log_items) {                first = 0;                lb_add_log_items(s, lb_first_log_names, prec, l);            }        }        else {            /* NULL record, no more workers left ... */            if (!was_forced) {                int nf;                /* Force recovery only once.                 * If it still fails, Tomcat is still disconnected.                 */                jk_shm_lock();                nf = force_recovery(p->worker, l);                jk_shm_unlock();                was_forced = 1;                if (nf) {                    /* We have forced recovery.                     * Reset the service loop and go again                     */                    prec = NULL;                    rc   = -1;                    jk_log(l, JK_LOG_INFO,                           "Forcing recovery once for %d workers", nf);                    continue;                }                else {                    /* No workers in error state.                     * Somebody set them all to disabled?                     */                    jk_log(l, JK_LOG_ERROR,                           "All tomcat instances failed, no more workers left for recovery");                    *is_error = JK_HTTP_SERVER_BUSY;                    rc = JK_FALSE;                }            }            else {                jk_log(l, JK_LOG_ERROR,                       "All tomcat instances failed, no more workers left");                *is_error = JK_HTTP_SERVER_BUSY;                rc = JK_FALSE;            }        }        attempt++;    }    if ( rc == -1 ) {        jk_log(l, JK_LOG_INFO,               "All tomcat instances are busy or in error state");        /* Set error to Timeout */        *is_error = JK_HTTP_SERVER_BUSY;        rc = JK_FALSE;    }    if (prec && s->add_log_items) {        lb_add_log_items(s, lb_last_log_names, prec, l);    }    JK_TRACE_EXIT(l);    return rc;}static int JK_METHOD done(jk_endpoint_t **e, jk_logger_t *l){    JK_TRACE_ENTER(l);    if (e && *e && (*e)->endpoint_private) {        lb_endpoint_t *p = (*e)->endpoint_private;        free(p);        *e = NULL;        JK_TRACE_EXIT(l);        return JK_TRUE;    }    JK_LOG_NULL_PARAMS(l);    JK_TRACE_EXIT(l);    return JK_FALSE;}static int JK_METHOD validate(jk_worker_t *pThis,                              jk_map_t *props,                              jk_worker_env_t *we, jk_logger_t *l){    JK_TRACE_ENTER(l);    if (pThis && pThis->worker_private) {        lb_worker_t *p = pThis->worker_private;        char **worker_names;        unsigned int num_of_workers;        const char *secret;        p->sticky_session = jk_get_is_sticky_session(props, p->s->name);        p->sticky_session_force = jk_get_is_sticky_session_force(props, p->s->name);        secret = jk_get_worker_secret(props, p->s->name);        if (jk_get_lb_worker_list(props,                                  p->s->name,                                  &worker_names,                                  &num_of_workers) && num_of_workers) {            unsigned int i = 0;            unsigned int j = 0;            p->max_packet_size = DEF_BUFFER_SZ;            p->lb_workers = jk_pool_alloc(&p->p,                                          num_of_workers *                                          sizeof(worker_record_t));            if (!p->lb_workers) {                JK_TRACE_EXIT(l);                return JK_FALSE;            }            for (i = 0; i < num_of_workers; i++) {                p->lb_workers[i].s = jk_shm_alloc_worker(&p->p);                if (p->lb_workers[i].s == NULL) {                    jk_log(l, JK_LOG_ERROR,                           "allocating worker record from shared memory");                    JK_TRACE_EXIT(l);                    return JK_FALSE;                }            }            for (i = 0; i < num_of_workers; i++) {                const char *s;                unsigned int ms;                strncpy(p->lb_workers[i].s->name, worker_names[i],                        JK_SHM_STR_SIZ);                p->lb_workers[i].s->lb_factor =                    jk_get_lb_factor(props, worker_names[i]);                if (p->lb_workers[i].s->lb_factor < 1) {                    p->lb_workers[i].s->lb_factor = 1;                }                /* Calculate the maximum packet size from all workers                 * for the recovery buffer.                 */                ms = jk_get_max_packet_size(props, worker_names[i]);                if (ms > p->max_packet_size)                    p->max_packet_size = ms;                p->lb_workers[i].s->distance =                    jk_get_distance(props, worker_names[i]);                if ((s = jk_get_worker_route(props, worker_names[i], NULL)))                    strncpy(p->lb_workers[i].s->route, s, JK_SHM_STR_SIZ);                else                    strncpy(p->lb_workers[i].s->route, worker_names[i], JK_SHM_STR_SIZ);                if ((s = jk_get_worker_domain(props, worker_names[i], NULL)))                    strncpy(p->lb_workers[i].s->domain, s, JK_SHM_STR_SIZ);                if ((s = jk_get_worker_redirect(props, worker_names[i], NULL)))                    strncpy(p->lb_workers[i].s->redirect, s, JK_SHM_STR_SIZ);                p->lb_workers[i].s->lb_value = 0;                p->lb_workers[i].s->state = JK_LB_STATE_IDLE;                p->lb_workers[i].s->error_time = 0;                p->lb_workers[i].s->activation =                    jk_get_worker_activation(props, worker_names[i]);                if (!wc_create_worker(p->lb_workers[i].s->name, 0,                                      props,                                      &(p->lb_workers[i].w),                                      we, l) || !p->lb_workers[i].w) {                    break;                }                if (secret && (p->lb_workers[i].w->type == JK_AJP13_WORKER_TYPE ||                    p->lb_workers[i].w->type == JK_AJP14_WORKER_TYPE)) {                    ajp_worker_t *aw = (ajp_worker_t *)p->lb_workers[i].w->worker_private;                    if (!aw->secret)                        aw->secret = secret;                }            }            if (i != num_of_workers) {                jk_log(l, JK_LOG_ERROR,                       "Failed creating worker %s",                       p->lb_workers[i].s->name);                close_workers(p, i, l);            }            else {                /* Update domain names if route contains period '.' */                for (i = 0; i < num_of_workers; i++) {                    if (!p->lb_workers[i].s->domain[0]) {                        char * id_domain = strchr(p->lb_workers[i].s->route, '.');                        if (id_domain) {                            *id_domain = '\0';                            strcpy(p->lb_workers[i].s->domain, p->lb_workers[i].s->route);                            *id_domain = '.';                        }                    }                    if (JK_IS_DEBUG_LEVEL(l)) {                        jk_log(l, JK_LOG_DEBUG,                               "Balanced worker %i has name %s and route %s in domain %s",                               i,                               p->lb_workers[i].s->name,                               p->lb_workers[i].s->route,                               p->lb_workers[i].s->domain);                    }                }                p->num_of_workers = num_of_workers;                update_mult(p, l);                for (i = 0; i < num_of_workers; i++) {                    for (j = 0; j < i; j++) {                        if (strcmp(p->lb_workers[i].s->route, p->lb_workers[j].s->route) == 0) {                            jk_log(l, JK_LOG_ERROR,                                   "Balanced workers number %i (%s) and %i (%s) share the same route %s - aborting configuration!",                                   i,                                   p->lb_workers[i].s->name,                                   j,                                   p->lb_workers[j].s->name,                                   p->lb_workers[i].s->route);                            JK_TRACE_EXIT(l);                            return JK_FALSE;                        }                    }                }                JK_TRACE_EXIT(l);                return JK_TRUE;            }        }    }    JK_LOG_NULL_PARAMS(l);    JK_TRACE_EXIT(l);    return JK_FALSE;}static int JK_METHOD init(jk_worker_t *pThis,                          jk_map_t *props,                          jk_worker_env_t *we, jk_logger_t *log){    int i;    lb_worker_t *p = (lb_worker_t *)pThis->worker_private;    JK_TRACE_ENTER(log);    pThis->retries = jk_get_worker_retries(props, p->s->name,                                           JK_RETRIES);    p->retries = pThis->retries;    p->recover_wait_time = jk_get_worker_recover_timeout(props, p->s->name,                                                            WAIT_BEFORE_RECOVER);    if (p->recover_wait_time < 1)        p->recover_wait_time = 1;    p->max_reply_timeouts = jk_get_worker_max_reply_timeouts(props, p->s->name,                                                             0);    p->maintain_time = jk_get_worker_maintain_time(props);    if(p->maintain_time < 0)        p->maintain_time = 0;    p->s->last_maintain_time = time(NULL);    p->lbmethod = jk_get_lb_method(props, p->s->name);    p->lblock   = jk_get_lb_lock(props, p->s->name);    JK_INIT_CS(&(p->cs), i);    if (i == JK_FALSE) {        jk_log(log, JK_LOG_ERROR,               "creating thread lock (errno=%d)",               errno);        JK_TRACE_EXIT(log);        return JK_FALSE;    }    jk_shm_lock();    p->sequence++;    jk_lb_push(p, log);    jk_shm_unlock();    JK_TRACE_EXIT(log);    return JK_TRUE;}static int JK_METHOD get_endpoint(jk_worker_t *pThis,                                  jk_endpoint_t **pend, jk_logger_t *l){    JK_TRACE_ENTER(l);    if (pThis && pThis->worker_private && pend) {        lb_endpoint_t *p = (lb_endpoint_t *) malloc(sizeof(lb_endpoint_t));        p->worker = pThis->worker_private;        p->endpoint.endpoint_private = p;        p->endpoint.service = service;        p->endpoint.done = done;        *pend = &p->endpoint;        JK_TRACE_EXIT(l);        return JK_TRUE;    }    else {        JK_LOG_NULL_PARAMS(l);    }    JK_TRACE_EXIT(l);    return JK_FALSE;}static int JK_METHOD destroy(jk_worker_t **pThis, jk_logger_t *l){    JK_TRACE_ENTER(l);    if (pThis && *pThis && (*pThis)->worker_private) {        unsigned int i;        lb_worker_t *private_data = (*pThis)->worker_private;        close_workers(private_data, private_data->num_of_workers, l);        JK_DELETE_CS(&(private_data->cs), i);        jk_close_pool(&private_data->p);        free(private_data);        JK_TRACE_EXIT(l);        return JK_TRUE;    }    JK_LOG_NULL_PARAMS(l);    JK_TRACE_EXIT(l);    return JK_FALSE;}int JK_METHOD lb_worker_factory(jk_worker_t **w,                                const char *name, jk_logger_t *l){    JK_TRACE_ENTER(l);    if (NULL != name && NULL != w) {        lb_worker_t *private_data =            (lb_worker_t *) calloc(1, sizeof(lb_worker_t));        jk_open_pool(&private_data->p,                        private_data->buf,                        sizeof(jk_pool_atom_t) * TINY_POOL_SIZE);        private_data->s = jk_shm_alloc_worker(&private_data->p);        if (!private_data->s) {            free(private_data);            JK_TRACE_EXIT(l);            return 0;        }        strncpy(private_data->s->name, name, JK_SHM_STR_SIZ);        private_data->lb_workers = NULL;        private_data->num_of_workers = 0;        private_data->worker.worker_private = private_data;        private_data->worker.validate = validate;        private_data->worker.init = init;        private_data->worker.get_endpoint = get_endpoint;        private_data->worker.destroy = destroy;        private_data->worker.maintain = maintain_workers;        private_data->worker.retries = JK_RETRIES;        private_data->recover_wait_time = WAIT_BEFORE_RECOVER;        private_data->max_reply_timeouts = 0;        private_data->sequence = 0;        *w = &private_data->worker;        JK_TRACE_EXIT(l);        return JK_LB_WORKER_TYPE;    }    else {        JK_LOG_NULL_PARAMS(l);    }    JK_TRACE_EXIT(l);    return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?