And here is a more conservative patch for MySQL client retries.
It closes the server connection after every error, and it delays
making a new server connection only after specific errors.
Closing the connection eliminates the possibility that the client
becomes stuck.
Wietse
20230417
Cleanup: in the MySQL client, temporarily stay away from a
server only if the last error was caused by a connection-level
or protocol-level failure. File: global/dict_mysql.c.
diff -ur /var/tmp/postfix-3.9-20230416/src/global/dict_mysql.c
./src/global/dict_mysql.c
--- /var/tmp/postfix-3.9-20230416/src/global/dict_mysql.c 2023-04-16
16:44:39.000000000 -0400
+++ ./src/global/dict_mysql.c 2023-04-17 19:17:02.000000000 -0400
@@ -108,6 +108,7 @@
/* Application-specific. */
#include "dict_mysql.h"
+#include "mysql/errmsg.h"
/* MySQL 8.x API change */
@@ -179,7 +180,7 @@
static int plmysql_query(DICT_MYSQL *, const char *, VSTRING *, MYSQL_RES **);
static void plmysql_dealloc(PLMYSQL *);
static void plmysql_close_host(HOST *);
-static void plmysql_down_host(HOST *);
+static void plmysql_down_host(HOST *, int);
static void plmysql_connect_single(DICT_MYSQL *, HOST *);
static const char *dict_mysql_lookup(DICT *, const char *);
DICT *dict_mysql_open(const char *, int, int);
@@ -546,7 +547,16 @@
* See what we got.
*/
if (query_error) {
- plmysql_down_host(host);
+ switch (mysql_errno(host->db)) {
+ case CR_COMMANDS_OUT_OF_SYNC:
+ case CR_SERVER_GONE_ERROR:
+ case CR_SERVER_LOST:
+ plmysql_down_host(host, RETRY_CONN_INTV);
+ break;
+ default:
+ plmysql_down_host(host, 0);
+ break;
+ }
if (errno == 0)
errno = ENOTSUP;
if (first_result) {
@@ -609,7 +619,7 @@
} else {
msg_warn("connect to mysql server %s: %s",
host->hostname, mysql_error(host->db));
- plmysql_down_host(host);
+ plmysql_down_host(host, RETRY_CONN_INTV);
}
}
@@ -625,11 +635,11 @@
* plmysql_down_host - close a failed connection AND set a "stay away from
* this host" timer
*/
-static void plmysql_down_host(HOST *host)
+static void plmysql_down_host(HOST *host, int delay)
{
mysql_close(host->db);
host->db = 0;
- host->ts = time((time_t *) 0) + RETRY_CONN_INTV;
+ host->ts = time((time_t *) 0) + delay;
host->stat = STATFAIL;
event_cancel_timer(dict_mysql_event, (void *) host);
}
_______________________________________________
Postfix-users mailing list -- [email protected]
To unsubscribe send an email to [email protected]