From e13764ae84555034fedc430e189e056ea5af2d10 Mon Sep 17 00:00:00 2001 From: Andrey Borodin Date: Fri, 14 Feb 2025 23:13:55 +0500 Subject: [PATCH v2] Add option to check all IPs --- src/interfaces/libpq/fe-connect.c | 25 +++++++++++++++---------- src/interfaces/libpq/libpq-int.h | 1 + 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 85d1ca2864..11c9e0cf4c 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -372,6 +372,10 @@ static const internalPQconninfoOption PQconninfoOptions[] = { {"scram_server_key", NULL, NULL, NULL, "SCRAM-Server-Key", "D", SCRAM_MAX_KEY_LEN * 2, offsetof(struct pg_conn, scram_server_key)}, + {"check_all_addrs", "PGCHECKALLADDRS", + DefaultLoadBalanceHosts, NULL, + "Check-All-Addrs", "", 1, + offsetof(struct pg_conn, check_all_addrs)}, /* Terminating entry --- MUST BE LAST */ {NULL, NULL, NULL, NULL, @@ -4326,11 +4330,11 @@ keep_going: /* We will come back to here until there is conn->status = CONNECTION_OK; sendTerminateConn(conn); - /* - * Try next host if any, but we don't want to consider - * additional addresses for this host. - */ - conn->try_next_host = true; + if (conn->check_all_addrs && conn->check_all_addrs[0] == '1') + conn->try_next_addr = true; + else + conn->try_next_host = true; + goto keep_going; } } @@ -4381,11 +4385,11 @@ keep_going: /* We will come back to here until there is conn->status = CONNECTION_OK; sendTerminateConn(conn); - /* - * Try next host if any, but we don't want to consider - * additional addresses for this host. - */ - conn->try_next_host = true; + if (conn->check_all_addrs && conn->check_all_addrs[0] == '1') + conn->try_next_addr = true; + else + conn->try_next_host = true; + goto keep_going; } } @@ -5002,6 +5006,7 @@ freePGconn(PGconn *conn) free(conn->load_balance_hosts); free(conn->scram_client_key); free(conn->scram_server_key); + free(conn->check_all_addrs); termPQExpBuffer(&conn->errorMessage); termPQExpBuffer(&conn->workBuffer); diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h index 2546f9f8a5..a96d8ce482 100644 --- a/src/interfaces/libpq/libpq-int.h +++ b/src/interfaces/libpq/libpq-int.h @@ -432,6 +432,7 @@ struct pg_conn char *load_balance_hosts; /* load balance over hosts */ char *scram_client_key; /* base64-encoded SCRAM client key */ char *scram_server_key; /* base64-encoded SCRAM server key */ + char *check_all_addrs; /* whether to check all ips within a host or terminate on failure */ bool cancelRequest; /* true if this connection is used to send a * cancel request, instead of being a normal -- 2.39.5 (Apple Git-154)