Skip to content

Commit

Permalink
Request additional sync point on discard.
Browse files Browse the repository at this point in the history
  • Loading branch information
reshke committed Mar 4, 2024
1 parent 9d6d32d commit 6725501
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 0 deletions.
1 change: 1 addition & 0 deletions sources/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ set(od_src
deploy.c
reset.c
frontend.c
backend_sync.c
backend.c
instance.c
main.c
Expand Down
34 changes: 34 additions & 0 deletions sources/backend_sync.c
Original file line number Diff line number Diff line change
@@ -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 changes: 12 additions & 0 deletions sources/backend_sync.h
Original file line number Diff line number Diff line change
@@ -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 */
15 changes: 15 additions & 0 deletions sources/reset.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");

Expand Down

0 comments on commit 6725501

Please sign in to comment.