Skip to content

Commit 4524a41

Browse files
committed
Merge pull request #2 from weibocom/delay_delete_router-old
Delay delete router-old
2 parents 7d06365 + 909d603 commit 4524a41

File tree

2 files changed

+86
-6
lines changed

2 files changed

+86
-6
lines changed

README.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ Table of Contents
1515
* [update_interval](#update_interval)
1616
* [update_timeout](#update_timeout)
1717
* [strong_dependency](#strong_dependency)
18-
* [delay_delete](#delay_delete)
1918
* [upstream_show](#upstream_show)
2019
* [Consul_interface](#consul_interface)
2120
* [TODO](#todo)
@@ -104,11 +103,17 @@ description: Pull upstream servers from consul.
104103

105104
The parameters' meanings are:
106105

107-
* update_interval: pulling servers from consul interval time.
108-
* update_timeout: pulling servers from consul request timeout.
109-
* strong_dependency: when nginx start up if depending on consul, and consul is not working, nginx will boot failed, otherwise booting normally.
106+
* update_interval
110107

111-
* delay_delete: being setted carefully. Defaultly it is 75s, and it is enough content be feeding back during adding or deleting servers removing old router information. But if content is very large, and it needs minutes, then delay_delete should be setted longer than that time.
108+
pulling servers from consul interval time.
109+
110+
* update_timeout
111+
112+
pulling servers from consul request timeout.
113+
114+
* strong_dependency
115+
116+
when nginx start up if depending on consul, and consul is not working, nginx will boot failed, otherwise booting normally.
112117

113118
[Back to TOC](#table-of-contents)
114119

@@ -167,7 +172,6 @@ http_interface example:
167172
TODO
168173
====
169174

170-
* timely resolve consul server domain, if it is domain
171175
* support least_conn load_balancing
172176

173177
[Back to TOC](#table-of-contents)

src/ngx_http_dynamic_update_upstream_module.c

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
#define NGX_MAX_VALUE 65535
2121

22+
#define NGX_DELAY_DELETE 150 * 1000
23+
2224
#define NGX_ADD 0
2325
#define NGX_DEL 1
2426

@@ -118,6 +120,9 @@ typedef struct {
118120

119121
ngx_queue_t queue;
120122

123+
time_t start_sec;
124+
ngx_msec_t start_msec;
125+
121126
void *data;
122127
} ngx_delay_event_t;
123128

@@ -2077,6 +2082,7 @@ static void
20772082
ngx_http_dynamic_update_upstream_event_init(ngx_http_upstream_rr_peers_t *tmp_peers,
20782083
ngx_http_dynamic_update_upstream_server_t *conf_server, ngx_flag_t flag)
20792084
{
2085+
ngx_time_t *tp;
20802086
ngx_delay_event_t *delay_event;
20812087
ngx_http_dynamic_update_upstream_srv_conf_t *conf;
20822088

@@ -2089,6 +2095,10 @@ ngx_http_dynamic_update_upstream_event_init(ngx_http_upstream_rr_peers_t *tmp_pe
20892095
return;
20902096
}
20912097

2098+
tp = ngx_timeofday();
2099+
delay_event->start_sec = tp->sec;
2100+
delay_event->start_msec = tp->msec;
2101+
20922102
if (flag == NGX_ADD) {
20932103
delay_event->delay_delete_ev.handler = ngx_http_dynamic_update_upstream_add_delay_delete;
20942104
delay_event->delay_delete_ev.log = ngx_cycle->log;
@@ -2117,10 +2127,44 @@ ngx_http_dynamic_update_upstream_event_init(ngx_http_upstream_rr_peers_t *tmp_pe
21172127
static void
21182128
ngx_http_dynamic_update_upstream_add_delay_delete(ngx_event_t *event)
21192129
{
2130+
ngx_uint_t i;
2131+
ngx_connection_t *c;
21202132
ngx_delay_event_t *delay_event;
2133+
ngx_http_request_t *r=NULL;
2134+
ngx_http_log_ctx_t *ctx=NULL;
21212135
ngx_http_upstream_rr_peers_t *tmp_peers=NULL, *tmp_backup=NULL;
21222136

21232137
delay_event = event->data;
2138+
2139+
c = ngx_cycle->connections;
2140+
for (i = 0; i < ngx_cycle->connection_n; i++) {
2141+
2142+
if (c[i].fd == (ngx_socket_t) -1) {
2143+
continue;
2144+
} else {
2145+
2146+
if (c[i].log->data != NULL) {
2147+
ctx = c[i].log->data;
2148+
r = ctx->current_request;
2149+
}
2150+
}
2151+
2152+
if (r) {
2153+
if (r->start_sec < delay_event->start_sec) {
2154+
ngx_add_timer(&delay_event->delay_delete_ev, NGX_DELAY_DELETE);
2155+
return;
2156+
}
2157+
2158+
if (r->start_sec == delay_event->start_sec) {
2159+
2160+
if (r->start_msec <= delay_event->start_msec) {
2161+
ngx_add_timer(&delay_event->delay_delete_ev, NGX_DELAY_DELETE);
2162+
return;
2163+
}
2164+
}
2165+
}
2166+
}
2167+
21242168
tmp_peers = delay_event->data;
21252169
tmp_backup = tmp_peers->next;
21262170

@@ -2149,7 +2193,10 @@ static void
21492193
ngx_http_dynamic_update_upstream_del_delay_delete(ngx_event_t *event)
21502194
{
21512195
ngx_uint_t i;
2196+
ngx_connection_t *c;
21522197
ngx_delay_event_t *delay_event;
2198+
ngx_http_request_t *r=NULL;
2199+
ngx_http_log_ctx_t *ctx=NULL;
21532200
ngx_http_upstream_rr_peers_t *tmp_peers=NULL;
21542201

21552202
u_char *namep = NULL;
@@ -2158,6 +2205,35 @@ ngx_http_dynamic_update_upstream_del_delay_delete(ngx_event_t *event)
21582205
delay_event = event->data;
21592206
tmp_peers = delay_event->data;
21602207

2208+
c = ngx_cycle->connections;
2209+
for (i = 0; i < ngx_cycle->connection_n; i++) {
2210+
2211+
if (c[i].fd == (ngx_socket_t) -1) {
2212+
continue;
2213+
} else {
2214+
2215+
if (c[i].log->data != NULL) {
2216+
ctx = c[i].log->data;
2217+
r = ctx->request;
2218+
}
2219+
}
2220+
2221+
if (r) {
2222+
if (r->start_sec < delay_event->start_sec) {
2223+
ngx_add_timer(&delay_event->delay_delete_ev, NGX_DELAY_DELETE);
2224+
return;
2225+
}
2226+
2227+
if (r->start_sec == delay_event->start_sec) {
2228+
2229+
if (r->start_msec <= delay_event->start_msec) {
2230+
ngx_add_timer(&delay_event->delay_delete_ev, NGX_DELAY_DELETE);
2231+
return;
2232+
}
2233+
}
2234+
}
2235+
}
2236+
21612237
if (tmp_peers != NULL) {
21622238
for (i = 0; i < tmp_peers->number; i++) {
21632239

0 commit comments

Comments
 (0)