From 09894f98185bd41f1879a57db41fda701fa59129 Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Mon, 5 Feb 2018 17:16:06 +0300 Subject: [PATCH] odissey: properly reset client stream during deploy --- sources/backend.c | 10 +++++++--- sources/frontend.c | 28 +++++++++++++++++++--------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/sources/backend.c b/sources/backend.c index 71c2e7e0..61562fc6 100644 --- a/sources/backend.c +++ b/sources/backend.c @@ -474,14 +474,18 @@ od_backend_deploy(od_server_t *server, char *context, rc = shapito_fe_read_parameter(request, request_size, &name, &name_len, &value, &value_len); if (rc == -1) { - od_error(&instance->logger, context, NULL, server, + od_error(&instance->logger, context, server->client, server, "failed to parse ParameterStatus message"); return -1; } - rc = shapito_parameters_add(&server->params, name, name_len, - value, value_len); + /* update parameter */ + rc = shapito_parameters_update(&server->params, name, name_len, + value, value_len); if (rc == -1) return -1; + od_debug(&instance->logger, context, server->client, server, + "%.*s = %.*s", + name_len, name, value_len, value); break; } case 'E': diff --git a/sources/frontend.c b/sources/frontend.c index b4632e54..2a31f35a 100644 --- a/sources/frontend.c +++ b/sources/frontend.c @@ -556,6 +556,8 @@ od_frontend_remote_client(od_client_t *client) shapito_stream_t *stream = &client->stream; od_server_t *server = client->server; + od_frontend_stream_reset(client); + int request_count = 0; int terminate = 0; @@ -570,7 +572,6 @@ od_frontend_remote_client(od_client_t *client) request_count = server->deploy_sync; } - od_frontend_stream_reset(client); int rc; for (;;) { @@ -581,15 +582,24 @@ od_frontend_remote_client(od_client_t *client) char *request = stream->start + request_start; int request_size = shapito_stream_used(stream) - request_start; + /* update client recv stat */ + od_server_stat_recv_client(server, request_size); + int type = *request; od_debug(&instance->logger, "main", client, server, "%c", type); /* Terminate (client graceful shutdown) */ if (type == 'X') { + /* discard terminate request */ stream->pos = stream->start + request_start; terminate = 1; + + if (request_count == server->deploy_sync) { + od_frontend_stream_reset(client); + server->deploy_sync = 0; + } break; } @@ -634,16 +644,16 @@ od_frontend_remote_client(od_client_t *client) break; } - /* update client recv stat */ - od_server_stat_recv_client(server, shapito_stream_used(stream)); - /* forward to server */ - rc = od_write(server->io, stream); - if (rc == -1) - return OD_FE_ESERVER_WRITE; + if (shapito_stream_used(stream) > 0) + { + rc = od_write(server->io, stream); + if (rc == -1) + return OD_FE_ESERVER_WRITE; - /* update server sync state */ - od_server_stat_request(server, request_count); + /* update server sync state */ + od_server_stat_request(server, request_count); + } if (terminate) return OD_FE_TERMINATE;