diff --git a/src/odyssey/sources/backend.c b/src/odyssey/sources/backend.c index 5284e9caab7a..0882f5cf778b 100644 --- a/src/odyssey/sources/backend.c +++ b/src/odyssey/sources/backend.c @@ -72,6 +72,8 @@ void od_backend_error(od_server_t *server, char *context, char *data, { od_instance_t *instance = server->global->instance; kiwi_fe_error_t error; + int detail_len = 0; + int hint_len = 0; od_client_t *yb_server_client = server->client; od_client_t *yb_external_client = (yb_server_client->yb_is_authenticating) ? @@ -92,6 +94,7 @@ void od_backend_error(od_server_t *server, char *context, char *data, if (error.detail) { od_error(&instance->logger, context, yb_external_client, server, "DETAIL: %s", error.detail); + detail_len = strlen(error.detail); } /* catch and store error to be forwarded later if we are in deploy phase */ @@ -104,6 +107,7 @@ void od_backend_error(od_server_t *server, char *context, char *data, if (error.hint) { od_error(&instance->logger, context, yb_external_client, server, "HINT: %s", error.hint); + hint_len = strlen(error.hint); if (strcmp(error.hint, "Database might have been dropped by another user") == 0) { @@ -113,10 +117,16 @@ void od_backend_error(od_server_t *server, char *context, char *data, if (yb_external_client != NULL && ((od_client_t *)yb_external_client)->type == OD_POOL_CLIENT_EXTERNAL) - od_frontend_error( - yb_external_client, - KIWI_CONNECTION_DOES_NOT_EXIST, - error.hint, od_io_error(&server->io)); + { + machine_msg_t *msg; + msg = kiwi_be_write_error_as(NULL, error.severity, error.code, + error.detail, detail_len, error.hint, + hint_len, error.message, strlen(error.message)); + /* YB: best-effort forward to client, already handling error */ + if (msg == NULL) + return; + od_write(&yb_external_client->io, msg); + } } } @@ -126,8 +136,17 @@ void od_backend_error(od_server_t *server, char *context, char *data, if (yb_external_client != NULL && ((od_client_t *)yb_external_client)->type == OD_POOL_CLIENT_EXTERNAL) - od_frontend_error(yb_external_client, KIWI_CONNECTION_DOES_NOT_EXIST, error.message); - } + { + machine_msg_t *msg; + msg = kiwi_be_write_error_as(NULL, error.severity, error.code, + error.detail, detail_len, error.hint, + hint_len, error.message, strlen(error.message)); + /* YB: best-effort forward to client, already handling error */ + if (msg == NULL) + return; + od_write(&yb_external_client->io, msg); + } + } } int od_backend_ready(od_server_t *server, char *data, uint32_t size) diff --git a/src/odyssey/sources/frontend.c b/src/odyssey/sources/frontend.c index 84e4b2d796e0..b2f7d85e6230 100644 --- a/src/odyssey/sources/frontend.c +++ b/src/odyssey/sources/frontend.c @@ -322,6 +322,7 @@ od_frontend_attach(od_client_t *client, char *context, continue; } + /* YB: check auth failure status codes to update OID status */ if (yb_frontend_error_is_db_does_not_exist(client)) ((od_route_t *)server->route)->yb_database_entry->status = YB_OID_DROPPED; else if (yb_frontend_error_is_role_does_not_exist(client)) @@ -1977,22 +1978,6 @@ static od_frontend_status_t od_frontend_remote(od_client_t *client) for (;;) { for (;;) { - rc = yb_is_route_invalid(client->route); - if (rc == ROUTE_INVALID_DB_OID) { - od_frontend_fatal( - client, KIWI_CONNECTION_FAILURE, - "Database might have been dropped by another user"); - status = OD_ECLIENT_READ; - break; - } else if (rc == ROUTE_INVALID_ROLE_OID) { - od_frontend_fatal( - client, KIWI_CONNECTION_FAILURE, - "invalid role OID: %d", - ((od_route_t *)(client->route))->yb_user_entry->oid); - status = OD_ECLIENT_READ; - break; - } - if (od_should_drop_connection(client, server)) { /* Odyssey is going to shut down or client conn is dropped * due some idle timeout, we drop the connection */