From 9d944b51f42eeaf166ee5aa976e853778e5603ff Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Thu, 15 Feb 2018 16:06:46 +0300 Subject: [PATCH] odissey: move server connection close out of pooler --- sources/backend.c | 40 ++++++++++++++++++++++++++++++---------- sources/backend.h | 2 +- sources/cancel.c | 1 + sources/periodic.c | 6 +----- sources/router.c | 27 +++++++-------------------- 5 files changed, 40 insertions(+), 36 deletions(-) diff --git a/sources/backend.c b/sources/backend.c index b3d166ba..f06d9e18 100644 --- a/sources/backend.c +++ b/sources/backend.c @@ -52,15 +52,8 @@ void od_backend_close(od_server_t *server) { assert(server->route == NULL); - if (server->io) { - machine_close(server->io); - machine_io_free(server->io); - server->io = NULL; - } - if (server->tls) { - machine_tls_free(server->tls); - server->tls = NULL; - } + assert(server->io == NULL); + assert(server->tls == NULL); server->is_transaction = 0; server->idle_time = 0; shapito_key_init(&server->key); @@ -68,7 +61,8 @@ void od_backend_close(od_server_t *server) od_server_free(server); } -int od_backend_terminate(od_server_t *server, shapito_stream_t *stream) +static inline int +od_backend_terminate(od_server_t *server, shapito_stream_t *stream) { shapito_stream_reset(stream); int rc; @@ -81,6 +75,32 @@ int od_backend_terminate(od_server_t *server, shapito_stream_t *stream) return 0; } +void od_backend_close_connection(od_server_t *server) +{ + od_instance_t *instance = server->system->instance; + + if (server->io == NULL) + return; + + if (machine_connected(server->io)) { + shapito_stream_t *stream; + stream = shapito_cache_pop(&instance->stream_cache); + if (stream) { + od_backend_terminate(server, stream); + shapito_cache_push(&instance->stream_cache, stream); + } + } + + machine_close(server->io); + machine_io_free(server->io); + server->io = NULL; + + if (server->tls) { + machine_tls_free(server->tls); + server->tls = NULL; + } +} + void od_backend_error(od_server_t *server, char *context, char *data, int size) { od_instance_t *instance = server->system->instance; diff --git a/sources/backend.h b/sources/backend.h index fb40be4a..fa88ecb0 100644 --- a/sources/backend.h +++ b/sources/backend.h @@ -10,8 +10,8 @@ int od_backend_connect(od_server_t*, shapito_stream_t*, char*); int od_backend_connect_cancel(od_server_t*, shapito_stream_t*, od_schemestorage_t*, shapito_key_t*); +void od_backend_close_connection(od_server_t*); void od_backend_close(od_server_t*); -int od_backend_terminate(od_server_t*, shapito_stream_t*); void od_backend_error(od_server_t*, char*, char*, int); int od_backend_ready(od_server_t*, char*, char*, int); int od_backend_ready_wait(od_server_t*, shapito_stream_t*, char*, int, uint32_t); diff --git a/sources/cancel.c b/sources/cancel.c index f4d9c640..d90a224f 100644 --- a/sources/cancel.c +++ b/sources/cancel.c @@ -64,6 +64,7 @@ int od_cancel(od_system_t *system, od_server_init(&server); server.system = system; od_backend_connect_cancel(&server, stream, server_scheme, key); + od_backend_close_connection(&server); od_backend_close(&server); return 0; } diff --git a/sources/periodic.c b/sources/periodic.c index 1573b787..11847428 100644 --- a/sources/periodic.c +++ b/sources/periodic.c @@ -277,11 +277,7 @@ od_periodic_expire(od_periodic_t *periodic) if (instance->is_shared) machine_io_attach(server->io); - shapito_stream_t *stream; - stream = shapito_cache_pop(&instance->stream_cache); - od_backend_terminate(server, stream); - shapito_cache_push(&instance->stream_cache, stream); - + od_backend_close_connection(server); od_backend_close(server); } diff --git a/sources/router.c b/sources/router.c index 7b880bda..f0d5b0fd 100644 --- a/sources/router.c +++ b/sources/router.c @@ -389,7 +389,7 @@ od_router(void *arg) case OD_MROUTER_CLOSE: { - /* detach and close server connection */ + /* detach closed server connection */ od_msgrouter_t *msg_detach; msg_detach = machine_msg_get_data(msg); @@ -405,8 +405,7 @@ od_router(void *arg) server->client = NULL; server->route = NULL; - if (instance->is_shared) - machine_io_attach(server->io); + assert(server->io == NULL); od_backend_close(server); msg_detach->status = OD_ROK; @@ -416,8 +415,7 @@ od_router(void *arg) case OD_MROUTER_CLOSE_AND_UNROUTE: { - /* detach and close server connection, - * unroute client */ + /* detach closed server connection and unroute client */ od_msgrouter_t *msg_close; msg_close = machine_msg_get_data(msg); @@ -430,19 +428,12 @@ od_router(void *arg) /* remove client from route client pool */ client->server = NULL; - client->route = NULL; + client->route = NULL; od_clientpool_set(&route->client_pool, client, OD_CUNDEF); assert(router->clients > 0); router->clients--; - if (machine_connected(server->io)) { - if (instance->is_shared) - machine_io_attach(server->io); - shapito_stream_t *stream; - stream = shapito_cache_pop(&instance->stream_cache); - od_backend_terminate(server, stream); - shapito_cache_push(&instance->stream_cache, stream); - } + assert(server->io == NULL); od_backend_close(server); msg_close->status = OD_ROK; @@ -600,20 +591,16 @@ od_router_detach_and_unroute(od_client_t *client) od_routerstatus_t od_router_close(od_client_t *client) { - od_instance_t *instance = client->system->instance; od_server_t *server = client->server; - if (instance->is_shared) - machine_io_detach(server->io); + od_backend_close_connection(server); return od_router_do(client, OD_MROUTER_CLOSE, 1); } od_routerstatus_t od_router_close_and_unroute(od_client_t *client) { - od_instance_t *instance = client->system->instance; od_server_t *server = client->server; - if (instance->is_shared) - machine_io_detach(server->io); + od_backend_close_connection(server); return od_router_do(client, OD_MROUTER_CLOSE_AND_UNROUTE, 1); }