Skip to content

Commit 75b4a12

Browse files
committed
fixed the bug: when nginx is reloaded, work_process cann't exit for long time
1 parent d050059 commit 75b4a12

File tree

1 file changed

+33
-14
lines changed

1 file changed

+33
-14
lines changed

src/ngx_http_upsync_module.c

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -194,11 +194,15 @@ static ngx_int_t ngx_http_upsync_add_peers(ngx_cycle_t *cycle,
194194
ngx_http_upsync_server_t *upsync_server);
195195
static ngx_int_t ngx_http_upsync_del_peers(ngx_cycle_t *cycle,
196196
ngx_http_upsync_server_t *upsync_server);
197+
static ngx_int_t ngx_http_upsync_replace_peers(ngx_cycle_t *cycle,
198+
ngx_http_upsync_server_t *upsync_server);
199+
static void ngx_http_upsync_update_peer(ngx_http_upstream_rr_peers_t *peers,
200+
ngx_http_upstream_rr_peer_t *peer,
201+
ngx_http_upsync_conf_t *upstream_conf,
202+
ngx_uint_t *updated);
197203
static void ngx_http_upsync_diff_filter(ngx_cycle_t *cycle,
198204
ngx_http_upsync_server_t *upsync_server,
199205
ngx_uint_t *diff);
200-
static ngx_int_t ngx_http_upsync_replace_peers(ngx_cycle_t *cycle,
201-
ngx_http_upsync_server_t *upsync_server);
202206

203207
static void ngx_http_upsync_event_init(ngx_http_upstream_rr_peer_t *peer,
204208
ngx_http_upsync_server_t *upsync_server);
@@ -923,6 +927,7 @@ ngx_http_upsync_add_peers(ngx_cycle_t *cycle,
923927
return NGX_ERROR;
924928
}
925929

930+
926931
static void
927932
ngx_http_upsync_update_peer(ngx_http_upstream_rr_peers_t *peers,
928933
ngx_http_upstream_rr_peer_t *peer,
@@ -958,19 +963,21 @@ ngx_http_upsync_update_peer(ngx_http_upstream_rr_peers_t *peers,
958963
return;
959964
}
960965

966+
961967
static void
962968
ngx_http_upsync_diff_filter(ngx_cycle_t *cycle,
963969
ngx_http_upsync_server_t *upsync_server,
964970
ngx_uint_t *diff)
965971
{
966972
ngx_uint_t i, j, len, updated;
973+
ngx_uint_t *flags = NULL;
974+
ngx_array_t flag_array;
967975
ngx_http_upsync_ctx_t *ctx;
968-
ngx_http_upsync_conf_t *upstream_conf, *add_upstream, *del_upstream;
976+
ngx_http_upsync_conf_t *upstream_conf;
977+
ngx_http_upsync_conf_t *add_upstream, *del_upstream;
969978
ngx_http_upstream_rr_peer_t *peer = NULL;
970979
ngx_http_upstream_rr_peers_t *peers = NULL;
971980
ngx_http_upstream_srv_conf_t *uscf;
972-
ngx_uint_t *flags = NULL;
973-
ngx_array_t flag_array;
974981

975982
*diff = 0;
976983
ctx = &upsync_server->ctx;
@@ -983,14 +990,14 @@ ngx_http_upsync_diff_filter(ngx_cycle_t *cycle,
983990
sizeof(*add_upstream)) != NGX_OK)
984991
{
985992
ngx_log_error(NGX_LOG_ERR, cycle->log, 0,
986-
"upsync_add_check: alloc error");
993+
"upsync_diff_filter_add: alloc error");
987994
return;
988995
}
989996

990997
if (ngx_array_init(&ctx->del_upstream, ctx->pool, 16,
991998
sizeof(*del_upstream)) != NGX_OK) {
992999
ngx_log_error(NGX_LOG_ERR, cycle->log, 0,
993-
"upsync_del_check: alloc error");
1000+
"upsync_diff_filter_del: alloc error");
9941001
return;
9951002
}
9961003

@@ -1000,12 +1007,11 @@ ngx_http_upsync_diff_filter(ngx_cycle_t *cycle,
10001007
}
10011008

10021009
peers = (ngx_http_upstream_rr_peers_t *)uscf->peer.data;
1003-
10041010
if (peers->number != 0) {
10051011
if (ngx_array_init(&flag_array, ctx->pool, peers->number,
10061012
sizeof(*flags)) != NGX_OK) {
10071013
ngx_log_error(NGX_LOG_ERR, cycle->log, 0,
1008-
"upsync_del_flags: alloc error");
1014+
"upsync_diff_filter: alloc error");
10091015
return;
10101016
}
10111017

@@ -1021,17 +1027,17 @@ ngx_http_upsync_diff_filter(ngx_cycle_t *cycle,
10211027
if (*(flags + j) == 1) {
10221028
continue;
10231029
}
1024-
1030+
10251031
if (ngx_memn2cmp(peer->name.data, upstream_conf->sockaddr,
10261032
peer->name.len,
10271033
ngx_strlen(upstream_conf->sockaddr)) == 0) {
10281034
// update peer
10291035
ngx_http_upsync_update_peer(peers, peer, upstream_conf, &updated);
10301036
*diff |= updated;
1031-
1037+
10321038
// set flag, not to be deleted
10331039
*(flags + j) = 1;
1034-
1040+
10351041
break;
10361042
}
10371043
}
@@ -1048,7 +1054,7 @@ ngx_http_upsync_diff_filter(ngx_cycle_t *cycle,
10481054
if (*(flags + j) == 1) {
10491055
continue;
10501056
}
1051-
1057+
10521058
del_upstream = ngx_array_push(&ctx->del_upstream);
10531059
ngx_memzero(del_upstream, sizeof(*del_upstream));
10541060
ngx_memcpy(&del_upstream->sockaddr, peer->name.data, peer->name.len);
@@ -3485,7 +3491,7 @@ ngx_http_upsync_timeout_handler(ngx_event_t *event)
34853491
upsync_server = event->data;
34863492

34873493
ngx_log_error(NGX_LOG_ERR, event->log, 0,
3488-
"upsync_timeout: timed out reading upsync_server: %V ",
3494+
"[WARN] upsync_timeout: timed out reading upsync_server: %V ",
34893495
upsync_server->pc.name);
34903496

34913497
ngx_http_upsync_clean_event(upsync_server);
@@ -3566,7 +3572,9 @@ static void
35663572
ngx_http_upsync_clear_all_events(ngx_cycle_t *cycle)
35673573
{
35683574
ngx_uint_t i;
3575+
ngx_queue_t *head, *next;
35693576
ngx_connection_t *c;
3577+
ngx_delay_event_t *queue_event;
35703578
ngx_upsync_conf_t *upsync_type_conf;
35713579
ngx_http_upsync_server_t *upsync_server;
35723580

@@ -3598,6 +3606,17 @@ ngx_http_upsync_clear_all_events(ngx_cycle_t *cycle)
35983606
}
35993607
ngx_del_timer(&upsync_server[i].upsync_timeout_ev);
36003608
}
3609+
3610+
head = &upsync_server[i].delete_ev;
3611+
for (next = ngx_queue_head(head);
3612+
next != ngx_queue_sentinel(head);
3613+
next = ngx_queue_next(next)) {
3614+
3615+
queue_event = ngx_queue_data(next, ngx_delay_event_t, delay_delete_ev);
3616+
if (queue_event->delay_delete_ev.timer_set) {
3617+
ngx_del_timer(&queue_event->delay_delete_ev);
3618+
}
3619+
}
36013620
}
36023621

36033622
if (upsync_type_conf->upsync_type == NGX_HTTP_UPSYNC_CONSUL

0 commit comments

Comments
 (0)