From 5b3935e95f79d6d6c5ec4ac6932630862f366f0f Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Fri, 9 Jun 2017 15:49:55 +0300 Subject: [PATCH] odissey: do discard optimistically and only for new clients --- src/od_backend.c | 21 +++++++++++---------- src/od_backend.h | 1 + src/od_frontend.c | 11 +++++++++++ 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/od_backend.c b/src/od_backend.c index 8af8f1de..49a58614 100644 --- a/src/od_backend.c +++ b/src/od_backend.c @@ -484,19 +484,20 @@ int od_backend_reset(od_server_t *server) } } - /* send reset query */ - if (route->scheme->discard) { - char query_reset[] = "DISCARD ALL"; - rc = od_backend_query(server, "reset", query_reset, - sizeof(query_reset)); - if (rc == -1) - goto error; - } - - /* ready to use */ + /* ready to use (yet maybe discard is required) */ return 1; drop: return 0; error: return -1; } + +int od_backend_discard(od_server_t *server) +{ + od_instance_t *instance = server->system->instance; + char query_discard[] = "DISCARD ALL"; + od_debug_server(&instance->log, server->id, "discard", + "%s", query_discard); + return od_backend_query(server, "reset", query_discard, + sizeof(query_discard)); +} diff --git a/src/od_backend.h b/src/od_backend.h index 05613b82..29fff112 100644 --- a/src/od_backend.h +++ b/src/od_backend.h @@ -15,5 +15,6 @@ int od_backend_terminate(od_server_t*); int od_backend_reset(od_server_t*); int od_backend_ready(od_server_t*, uint8_t*, int); int od_backend_configure(od_server_t*, so_bestartup_t*); +int od_backend_discard(od_server_t*); #endif /* OD_BACKEND_H */ diff --git a/src/od_frontend.c b/src/od_frontend.c index d7ef60d5..73283db5 100644 --- a/src/od_frontend.c +++ b/src/od_frontend.c @@ -298,6 +298,17 @@ od_frontend_main(od_client_t *client) "previously owned, no need to reconfigure S%" PRIu64, server->id); } else { + /* discard last server configuration, unless + * server has been just connected. */ + od_route_t *route = client->route; + if (route->scheme->discard) { + if (server->last_client_id != UINT64_MAX) { + rc = od_backend_discard(client->server); + if (rc == -1) + return OD_RS_ESERVER_CONFIGURE; + } + } + /* set client parameters */ rc = od_backend_configure(client->server, &client->startup); if (rc == -1) return OD_RS_ESERVER_CONFIGURE;