Fixing request_app_link reference counting for delayed requests.
Router built with debug may stop with assertion during stalled requests re-schedule. This was caused by missing reference counting increment before nxt_router_port_select() call.
This commit is contained in:
@@ -4152,6 +4152,13 @@ nxt_router_app_port_release(nxt_task_t *task, nxt_port_t *port,
|
|||||||
state.req_app_link = re_ra;
|
state.req_app_link = re_ra;
|
||||||
state.app = app;
|
state.app = app;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Need to increment use count "in advance" because
|
||||||
|
* nxt_router_port_select() will remove re_ra from lists
|
||||||
|
* and decrement use count.
|
||||||
|
*/
|
||||||
|
nxt_request_app_link_inc_use(re_ra);
|
||||||
|
|
||||||
nxt_router_port_select(task, &state);
|
nxt_router_port_select(task, &state);
|
||||||
|
|
||||||
goto re_ra_cancelled;
|
goto re_ra_cancelled;
|
||||||
@@ -4217,16 +4224,18 @@ re_ra_cancelled:
|
|||||||
if (re_ra != NULL) {
|
if (re_ra != NULL) {
|
||||||
if (nxt_router_port_post_select(task, &state) == NXT_OK) {
|
if (nxt_router_port_post_select(task, &state) == NXT_OK) {
|
||||||
/*
|
/*
|
||||||
* There should be call nxt_request_app_link_inc_use(re_ra),
|
* Reference counter already incremented above, this will
|
||||||
* because of one more link in the queue.
|
* keep re_ra while nxt_router_app_process_request()
|
||||||
* Corresponding decrement is in nxt_router_app_process_request().
|
* task is in queue. Reference counter decreased in
|
||||||
|
* nxt_router_app_process_request() after processing.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
nxt_request_app_link_inc_use(re_ra);
|
|
||||||
|
|
||||||
nxt_work_queue_add(&task->thread->engine->fast_work_queue,
|
nxt_work_queue_add(&task->thread->engine->fast_work_queue,
|
||||||
nxt_router_app_process_request,
|
nxt_router_app_process_request,
|
||||||
&task->thread->engine->task, app, re_ra);
|
&task->thread->engine->task, app, re_ra);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
nxt_request_app_link_use(task, re_ra, -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4234,15 +4243,14 @@ re_ra_cancelled:
|
|||||||
/*
|
/*
|
||||||
* There should be call nxt_request_app_link_inc_use(req_app_link),
|
* There should be call nxt_request_app_link_inc_use(req_app_link),
|
||||||
* because of one more link in the queue. But one link was
|
* because of one more link in the queue. But one link was
|
||||||
* recently removed from app->requests link.
|
* recently removed from app->requests linked list.
|
||||||
|
* Corresponding decrement is in nxt_router_app_process_request().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
nxt_work_queue_add(&task->thread->engine->fast_work_queue,
|
nxt_work_queue_add(&task->thread->engine->fast_work_queue,
|
||||||
nxt_router_app_process_request,
|
nxt_router_app_process_request,
|
||||||
&task->thread->engine->task, app, req_app_link);
|
&task->thread->engine->task, app, req_app_link);
|
||||||
|
|
||||||
/* ... skip nxt_request_app_link_use(task, req_app_link, -1) too. */
|
|
||||||
|
|
||||||
goto adjust_use;
|
goto adjust_use;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5185,6 +5193,13 @@ nxt_router_app_timeout(nxt_task_t *task, void *obj, void *data)
|
|||||||
state.req_app_link = pending_ra;
|
state.req_app_link = pending_ra;
|
||||||
state.app = app;
|
state.app = app;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Need to increment use count "in advance" because
|
||||||
|
* nxt_router_port_select() will remove pending_ra from lists
|
||||||
|
* and decrement use count.
|
||||||
|
*/
|
||||||
|
nxt_request_app_link_inc_use(pending_ra);
|
||||||
|
|
||||||
nxt_router_port_select(task, &state);
|
nxt_router_port_select(task, &state);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -5196,7 +5211,19 @@ nxt_router_app_timeout(nxt_task_t *task, void *obj, void *data)
|
|||||||
|
|
||||||
if (pending_ra != NULL) {
|
if (pending_ra != NULL) {
|
||||||
if (nxt_router_port_post_select(task, &state) == NXT_OK) {
|
if (nxt_router_port_post_select(task, &state) == NXT_OK) {
|
||||||
nxt_router_app_prepare_request(task, pending_ra);
|
/*
|
||||||
|
* Reference counter already incremented above, this will
|
||||||
|
* keep pending_ra while nxt_router_app_process_request()
|
||||||
|
* task is in queue. Reference counter decreased in
|
||||||
|
* nxt_router_app_process_request() after processing.
|
||||||
|
*/
|
||||||
|
|
||||||
|
nxt_work_queue_add(&task->thread->engine->fast_work_queue,
|
||||||
|
nxt_router_app_process_request,
|
||||||
|
&task->thread->engine->task, app, pending_ra);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
nxt_request_app_link_use(task, pending_ra, -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user