Skip to content

Commit 2420672

Browse files
committed
Merge pull request #5 from CallMeFoxie/fixetcd2
Backport ETCD fix from upsync-module
2 parents 7d2fcaf + e8da4e3 commit 2420672

File tree

1 file changed

+100
-56
lines changed

1 file changed

+100
-56
lines changed

src/ngx_stream_upsync_module.c

+100-56
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,8 @@ static void ngx_stream_upsync_recv_handler(ngx_event_t *event);
183183
static void ngx_stream_upsync_send_handler(ngx_event_t *event);
184184
static void ngx_stream_upsync_timeout_handler(ngx_event_t *event);
185185
static void ngx_stream_upsync_clean_event(void *upsync_server);
186-
static ngx_int_t ngx_stream_upsync_parse_init(void *upsync_server);
186+
static ngx_int_t ngx_stream_upsync_etcd_parse_init(void *upsync_server);
187+
static ngx_int_t ngx_stream_upsync_consul_parse_init(void *upsync_server);
187188
static ngx_int_t ngx_stream_upsync_dump_server(
188189
ngx_stream_upsync_server_t *upsync_server);
189190
static ngx_int_t ngx_stream_upsync_init_server(ngx_event_t *event);
@@ -204,7 +205,6 @@ static void ngx_stream_upsync_event_init(ngx_stream_upstream_rr_peer_t *peer,
204205
ngx_stream_upsync_server_t *upsync_server);
205206

206207
static ngx_int_t ngx_stream_http_parser_init();
207-
static void ngx_stream_http_parser_execute(ngx_stream_upsync_ctx_t *ctx);
208208

209209
static int ngx_stream_http_status(http_parser *p, const char *buf, size_t len);
210210
static int ngx_stream_http_header_field_cb(http_parser *p, const char *buf,
@@ -329,15 +329,15 @@ static ngx_upsync_conf_t ngx_upsync_types[] = {
329329
NGX_STREAM_UPSYNC_CONSUL,
330330
ngx_stream_upsync_send_handler,
331331
ngx_stream_upsync_recv_handler,
332-
ngx_stream_upsync_parse_init,
332+
ngx_stream_upsync_consul_parse_init,
333333
ngx_stream_upsync_consul_parse_json,
334334
ngx_stream_upsync_clean_event },
335335

336336
{ ngx_string("etcd"),
337337
NGX_STREAM_UPSYNC_ETCD,
338338
ngx_stream_upsync_send_handler,
339339
ngx_stream_upsync_recv_handler,
340-
ngx_stream_upsync_parse_init,
340+
ngx_stream_upsync_etcd_parse_init,
341341
ngx_stream_upsync_etcd_parse_json,
342342
ngx_stream_upsync_clean_event },
343343

@@ -1347,6 +1347,18 @@ ngx_stream_upsync_etcd_parse_json(void *data)
13471347
"upsync_parse_json: root error");
13481348
return NGX_ERROR;
13491349
}
1350+
1351+
cJSON *errorCode = cJSON_GetObjectItem(root, "errorCode");
1352+
1353+
if (errorCode != NULL) {
1354+
if (errorCode->valueint == 401) { // trigger reload, we've gone too far with index
1355+
upsync_server->index = 0;
1356+
upsync_type_conf->clean(upsync_server);
1357+
ngx_add_timer(&upsync_server->upsync_ev, 0);
1358+
}
1359+
cJSON_Delete(root);
1360+
return NGX_ERROR;
1361+
}
13501362

13511363
cJSON *action = cJSON_GetObjectItem(root, "action");
13521364
if (action != NULL) {
@@ -2470,9 +2482,9 @@ ngx_stream_upsync_send_handler(ngx_event_t *event)
24702482

24712483
if (upsync_type_conf->upsync_type == NGX_STREAM_UPSYNC_ETCD) {
24722484
if (upsync_server->index != 0) {
2473-
ngx_sprintf(request, "GET %V?wait=true&recursive=true&waitIndex=%d"
2485+
ngx_sprintf(request, "GET %V?wait=true&recursive=true&waitIndex=%d"
24742486
" HTTP/1.0\r\nHost: %V\r\nAccept: */*\r\n\r\n",
2475-
&upscf->upsync_send, upsync_server->index,
2487+
&upscf->upsync_send, upsync_server->index,
24762488
&upscf->conf_server.name);
24772489

24782490
} else {
@@ -2637,33 +2649,100 @@ ngx_stream_upsync_recv_handler(ngx_event_t *event)
26372649

26382650

26392651
static ngx_int_t
2640-
ngx_stream_upsync_parse_init(void *data)
2652+
ngx_stream_upsync_consul_parse_init(void *data)
26412653
{
2642-
ngx_upsync_conf_t *upsync_type_conf;
2654+
char *buf;
2655+
size_t parsed;
26432656
ngx_stream_upsync_ctx_t *ctx;
26442657
ngx_stream_upsync_server_t *upsync_server = data;
26452658

2646-
upsync_type_conf = upsync_server->upscf->upsync_type_conf;
26472659
ctx = &upsync_server->ctx;
26482660

2649-
if (upsync_type_conf->upsync_type == NGX_STREAM_UPSYNC_CONSUL
2650-
|| upsync_type_conf->upsync_type == NGX_STREAM_UPSYNC_ETCD)
2651-
{
2652-
if (ngx_stream_http_parser_init() == NGX_ERROR) {
2653-
return NGX_ERROR;
2661+
if (ngx_stream_http_parser_init() == NGX_ERROR) {
2662+
return NGX_ERROR;
2663+
}
2664+
2665+
buf = (char *)ctx->recv.pos;
2666+
2667+
ctx->body.pos = ctx->body.last = NULL;
2668+
2669+
parsed = http_parser_execute(parser, &settings, buf, ngx_strlen(buf));
2670+
if (parsed != ngx_strlen(buf)) {
2671+
ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,
2672+
"upsync_consul_parse_init: parsed body size is wrong");
2673+
return NGX_ERROR;
2674+
}
2675+
2676+
if (ngx_strncmp(state.status, "OK", 2) == 0) {
2677+
2678+
if (ngx_strlen(state.http_body) != 0) {
2679+
ctx->body.pos = state.http_body;
2680+
ctx->body.last = state.http_body + ngx_strlen(state.http_body);
2681+
26542682
}
2683+
}
26552684

2656-
ngx_stream_http_parser_execute(ctx);
2657-
if (ctx->body.pos != ctx->body.last) {
2658-
*(ctx->body.last + 1) = '\0';
2685+
if (parser != NULL) {
2686+
ngx_free(parser);
2687+
parser = NULL;
2688+
}
2689+
2690+
if (ctx->body.pos != ctx->body.last) {
2691+
*(ctx->body.last + 1) = '\0';
2692+
2693+
} else {
2694+
return NGX_ERROR;
2695+
}
2696+
2697+
return NGX_OK;
2698+
}
2699+
2700+
2701+
static ngx_int_t
2702+
ngx_stream_upsync_etcd_parse_init(void *data)
2703+
{
2704+
char *buf;
2705+
size_t parsed;
2706+
ngx_stream_upsync_ctx_t *ctx;
2707+
ngx_stream_upsync_server_t *upsync_server = data;
2708+
2709+
ctx = &upsync_server->ctx;
2710+
2711+
if (ngx_stream_http_parser_init() == NGX_ERROR) {
2712+
return NGX_ERROR;
2713+
}
2714+
2715+
buf = (char *)ctx->recv.pos;
2716+
2717+
ctx->body.pos = ctx->body.last = NULL;
2718+
2719+
parsed = http_parser_execute(parser, &settings, buf, ngx_strlen(buf));
2720+
if (parsed != ngx_strlen(buf)) {
2721+
ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,
2722+
"upsync_etcd_parse_init: parsed body size is wrong");
2723+
return NGX_ERROR;
2724+
}
2725+
2726+
if (ngx_strncmp(state.status, "OK", 2) == 0
2727+
|| ngx_strncmp(state.status, "Bad", 3) == 0) {
2728+
2729+
if (ngx_strlen(state.http_body) != 0) {
2730+
ctx->body.pos = state.http_body;
2731+
ctx->body.last = state.http_body + ngx_strlen(state.http_body);
26592732

2660-
} else {
2661-
return NGX_ERROR;
26622733
}
2734+
}
2735+
2736+
if (parser != NULL) {
2737+
ngx_free(parser);
2738+
parser = NULL;
2739+
}
2740+
2741+
if (ctx->body.pos != ctx->body.last) {
2742+
*(ctx->body.last + 1) = '\0';
26632743

26642744
} else {
2665-
ctx->body.pos = ctx->recv.pos;
2666-
ctx->body.last = ctx->recv.last;
2745+
return NGX_ERROR;
26672746
}
26682747

26692748
return NGX_OK;
@@ -3032,41 +3111,6 @@ ngx_stream_http_parser_init()
30323111
}
30333112

30343113

3035-
static void
3036-
ngx_stream_http_parser_execute(ngx_stream_upsync_ctx_t *ctx)
3037-
{
3038-
char *buf;
3039-
size_t parsed;
3040-
3041-
buf = (char *)ctx->recv.pos;
3042-
3043-
ctx->body.pos = ctx->body.last = NULL;
3044-
3045-
parsed = http_parser_execute(parser, &settings, buf, ngx_strlen(buf));
3046-
if (parsed != ngx_strlen(buf)) {
3047-
ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,
3048-
"http_parser_execute: parsed body size is wrong");
3049-
return;
3050-
}
3051-
3052-
if (ngx_strncmp(state.status, "OK", 2) == 0) {
3053-
3054-
if (ngx_strlen(state.http_body) != 0) {
3055-
ctx->body.pos = state.http_body;
3056-
ctx->body.last = state.http_body + ngx_strlen(state.http_body);
3057-
3058-
} else if (ngx_strlen(state.http_body) == 0) {
3059-
return;
3060-
}
3061-
}
3062-
3063-
ngx_free(parser);
3064-
parser = NULL;
3065-
3066-
return;
3067-
}
3068-
3069-
30703114
static int
30713115
ngx_stream_http_status(http_parser *p, const char *buf, size_t len)
30723116
{

0 commit comments

Comments
 (0)