odissey: move server connection close out of pooler

This commit is contained in:
Dmitry Simonenko 2018-02-15 16:06:46 +03:00
parent 15f4977c09
commit 9d944b51f4
5 changed files with 40 additions and 36 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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);
}