From 5618d5ebe9b61f7ece05e0f5ac555354088f2f74 Mon Sep 17 00:00:00 2001 From: Peter Koletzki Date: Thu, 12 Mar 2026 10:13:26 +0100 Subject: [PATCH] MDEV-39008 FederatedX: set time_zone on connection change When the underlying connection to the remote server changes (e.g. load balancer switching nodes or driver reconnect), the session variable time_zone was not set again. TIMESTAMP values could then be wrong. Track the connection (mysql.net.vio) and re-send SET time_zone='+00:00' when the vio changes so TIMESTAMP remains consistent. Made-with: Cursor --- storage/federatedx/federatedx_io_mysql.cc | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/storage/federatedx/federatedx_io_mysql.cc b/storage/federatedx/federatedx_io_mysql.cc index 408c82604bbad..88dd5b01daf8c 100644 --- a/storage/federatedx/federatedx_io_mysql.cc +++ b/storage/federatedx/federatedx_io_mysql.cc @@ -68,6 +68,8 @@ class federatedx_io_mysql :public federatedx_io DYNAMIC_ARRAY savepoints; bool requested_autocommit; bool actual_autocommit; + /** VIO for which time_zone was set; when vio changes (reconnect), set again */ + void *time_zone_set_vio; int actual_query(const char *buffer, size_t length); bool test_all_restrict() const; @@ -134,7 +136,8 @@ federatedx_io *instantiate_io_mysql(MEM_ROOT *server_root, federatedx_io_mysql::federatedx_io_mysql(FEDERATEDX_SERVER *aserver) : federatedx_io(aserver), - requested_autocommit(TRUE), actual_autocommit(TRUE) + requested_autocommit(TRUE), actual_autocommit(TRUE), + time_zone_set_vio(NULL) { DBUG_ENTER("federatedx_io_mysql::federatedx_io_mysql"); @@ -162,6 +165,7 @@ void federatedx_io_mysql::reset() { reset_dynamic(&savepoints); set_active(FALSE); + time_zone_set_vio= NULL; requested_autocommit= TRUE; mysql.reconnect= 1; @@ -455,8 +459,19 @@ int federatedx_io_mysql::actual_query(const char *buffer, size_t length) if ((error= mysql_real_query(&mysql, STRING_WITH_LEN("set time_zone='+00:00'")))) DBUG_RETURN(error); + time_zone_set_vio= mysql.net.vio; mysql.reconnect= 1; } + else if (mysql.net.vio != time_zone_set_vio) + { + /* + Connection changed (e.g. driver reconnect or new connection from pool). + Set time_zone so TIMESTAMP is consistent (avoids TZ mismatch with LB). + */ + if ((error= mysql_real_query(&mysql, STRING_WITH_LEN("set time_zone='+00:00'")))) + DBUG_RETURN(error); + time_zone_set_vio= mysql.net.vio; + } error= mysql_real_query(&mysql, buffer, (ulong)length);