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 + -
显示快捷键?