Request additional sync point on discard. (#584)

* Drop bin, add gitignore

* Request additional sync point on discard.

* Update sources/reset.c

Co-authored-by: Yury Frolov <57130330+EinKrebs@users.noreply.github.com>

---------

Co-authored-by: Yury Frolov <57130330+EinKrebs@users.noreply.github.com>
This commit is contained in:
reshke 2024-03-04 13:39:59 +05:00 committed by GitHub
parent 2848982b30
commit 9d0de5d4e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 64 additions and 0 deletions

2
docker/prep_stmts/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
pstst
psmst

Binary file not shown.

View File

@ -24,6 +24,7 @@ set(od_src
deploy.c
reset.c
frontend.c
backend_sync.c
backend.c
instance.c
main.c

34
sources/backend_sync.c Normal file
View File

@ -0,0 +1,34 @@
/*
* Odyssey.
*
* Scalable PostgreSQL connection pooler.
*/
#include <kiwi.h>
#include <machinarium.h>
#include <odyssey.h>
int od_backend_request_sync_point(od_server_t *server)
{
od_instance_t *instance = server->global->instance;
int rc;
machine_msg_t *msg;
msg = kiwi_fe_write_sync(NULL);
if (msg == NULL) {
return -1;
}
rc = od_write(&server->io, msg);
if (rc == -1) {
od_error(&instance->logger, "sync-point", server->client,
server, "write error: %s", od_io_error(&server->io));
return NOT_OK_RESPONSE;
}
/* update server sync state */
od_server_sync_request(server, 1);
return od_backend_ready_wait(server, "sync-point", 1 /*count*/,
UINT32_MAX /* timeout */,
0 /*ignore error?*/);
}

12
sources/backend_sync.h Normal file
View File

@ -0,0 +1,12 @@
#ifndef ODYSSEY_BACKEND_SYNC_H
#define ODYSSEY_BACKEND_SYNC_H
/*
* Odyssey.
*
* Scalable PostgreSQL connection pooler.
*/
int od_backend_request_sync_point(od_server_t *);
#endif /* ODYSSEY_BACKEND_SYNC_H */

View File

@ -112,6 +112,21 @@ int od_reset(od_server_t *server)
assert(od_server_synchronized(server));
break;
}
/* Request one more sync point here.
* In `od_server_synchronized` we
* count number of sync/query msg send to connection
* and number of RFQ received, if this numbers are equal,
* we decide server connection as sync. However, this might be
* not true, if client-server relay advanced some extended proto
* msgs without sync. To safely execute discard queries, we need to
* advadance sync point first.
*/
if (od_backend_request_sync_point(server) == NOT_OK_RESPONSE) {
goto error;
}
od_debug(&instance->logger, "reset", server->client, server,
"synchronized");