Skip to content

Commit c1e33f9

Browse files
authored
fix: incorrect writer host details in ClusterTopologyMonitorImpl (#1095)
1 parent 170e524 commit c1e33f9

File tree

3 files changed

+34
-13
lines changed

3 files changed

+34
-13
lines changed

aws_advanced_python_wrapper/cluster_topology_monitor.py

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@
2020
from concurrent.futures import ThreadPoolExecutor
2121
from typing import TYPE_CHECKING, Dict, Optional, Tuple
2222

23+
from aws_advanced_python_wrapper.host_availability import HostAvailability
2324
from aws_advanced_python_wrapper.hostinfo import HostInfo
2425
from aws_advanced_python_wrapper.utils.atomic import AtomicReference
2526
from aws_advanced_python_wrapper.utils.cache_map import CacheMap
2627
from aws_advanced_python_wrapper.utils.messages import Messages
28+
from aws_advanced_python_wrapper.utils.rdsutils import RdsUtils
2729
from aws_advanced_python_wrapper.utils.thread_safe_connection_holder import \
2830
ThreadSafeConnectionHolder
2931
from aws_advanced_python_wrapper.utils.utils import LogUtils
@@ -87,6 +89,7 @@ def __init__(self, plugin_service: PluginService, topology_utils: TopologyUtils,
8789
self._refresh_rate_nano = refresh_rate_nano
8890
self._high_refresh_rate_nano = high_refresh_rate_nano
8991

92+
self._rds_utils = RdsUtils()
9093
self._writer_host_info: AtomicReference[Optional[HostInfo]] = AtomicReference(None)
9194
self._monitoring_connection: ThreadSafeConnectionHolder = ThreadSafeConnectionHolder(None)
9295

@@ -300,16 +303,34 @@ def _open_any_connection_and_update_topology(self) -> Tuple[HostInfo, ...]:
300303
try:
301304
conn = self._plugin_service.force_connect(self._initial_host_info, self._monitoring_properties)
302305
self._monitoring_connection.set(conn, close_previous=False)
303-
logger.debug("ClusterTopologyMonitorImpl.OpenedMonitoringConnection", self._cluster_id, self._initial_host_info.host)
306+
logger.debug("ClusterTopologyMonitorImpl.OpenedMonitoringConnection",
307+
self._cluster_id, self._initial_host_info.host)
304308

305309
try:
306-
writer_host = self._topology_utils.get_writer_host_if_connected(
307-
conn, self._plugin_service.driver_dialect)
308-
if writer_host:
310+
writer_id = self._topology_utils.get_writer_id_if_connected(
311+
conn, self._plugin_service.driver_dialect)
312+
if writer_id:
309313
self._is_verified_writer_connection = True
310314
writer_verified_by_this_thread = True
311-
self._writer_host_info.set(HostInfo(writer_host, self._initial_host_info.port))
312-
logger.debug("ClusterTopologyMonitorImpl.WriterMonitoringConnection", self._cluster_id, writer_host)
315+
316+
if self._rds_utils.is_rds_instance(self._initial_host_info.host):
317+
writer_host_info = self._initial_host_info
318+
self._writer_host_info.set(writer_host_info)
319+
else:
320+
writer_host = self._instance_template.host.replace("?", writer_id)
321+
port = self._instance_template.port \
322+
if self._instance_template.is_port_specified() \
323+
else self._initial_host_info.port
324+
writer_host_info = HostInfo(
325+
writer_host,
326+
port,
327+
HostRole.WRITER,
328+
HostAvailability.AVAILABLE,
329+
host_id=writer_id)
330+
self._writer_host_info.set(writer_host_info)
331+
332+
logger.debug("ClusterTopologyMonitorImpl.WriterMonitoringConnection",
333+
self._cluster_id, writer_host_info.host)
313334
except Exception:
314335
pass
315336
except Exception:
@@ -321,7 +342,7 @@ def _open_any_connection_and_update_topology(self) -> Tuple[HostInfo, ...]:
321342
self._ignore_new_topology_requests_end_time_nano = 0
322343
else:
323344
self._ignore_new_topology_requests_end_time_nano = (
324-
time.time_ns() + self.IGNORE_TOPOLOGY_REQUEST_NANO)
345+
time.time_ns() + self.IGNORE_TOPOLOGY_REQUEST_NANO)
325346

326347
if len(hosts) == 0:
327348
self._monitoring_connection.clear()
@@ -472,7 +493,7 @@ def __call__(self) -> None:
472493
if connection is not None:
473494
is_writer = False
474495
try:
475-
is_writer = self._monitor._topology_utils.get_writer_host_if_connected(
496+
is_writer = self._monitor._topology_utils.get_writer_id_if_connected(
476497
connection, self._monitor._plugin_service.driver_dialect) is not None
477498
except Exception:
478499
self._monitor._close_connection(connection)

aws_advanced_python_wrapper/host_list_provider.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,7 @@ def _get_host_id(self, conn: Connection):
606606
cursor.execute(self._dialect.host_id_query)
607607
return cursor.fetchone()
608608

609-
def get_writer_host_if_connected(self, connection: Connection, driver_dialect: DriverDialect) -> Optional[str]:
609+
def get_writer_id_if_connected(self, connection: Connection, driver_dialect: DriverDialect) -> Optional[str]:
610610
try:
611611
cursor_execute_func_with_timeout = preserve_transaction_status_with_timeout(
612612
self._thread_pool, self._max_timeout_sec, driver_dialect, connection)(self._get_writer_id)

tests/unit/test_cluster_topology_monitor.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def topology_utils_mock():
4444
HostInfo("reader1.com", 5432, HostRole.READER),
4545
HostInfo("reader2.com", 5432, HostRole.READER)
4646
)
47-
mock.get_writer_host_if_connected.return_value = "writer.com"
47+
mock.get_writer_id_if_connected.return_value = "writer.com"
4848
mock.get_host_role.return_value = HostRole.WRITER
4949
return mock
5050

@@ -204,7 +204,7 @@ def test_open_any_connection_and_update_topology_verifies_writer(self, cluster_m
204204
connection_mock = MagicMock()
205205
cluster_monitor._writer_host_info.set(None)
206206
cluster_monitor._plugin_service.force_connect.return_value = connection_mock
207-
topology_utils_mock.get_writer_host_if_connected.return_value = "writer"
207+
topology_utils_mock.get_writer_id_if_connected.return_value = "writer"
208208
cluster_monitor._fetch_topology_and_update_cache = MagicMock(return_value=expected_hosts)
209209

210210
result = cluster_monitor._open_any_connection_and_update_topology()
@@ -248,7 +248,7 @@ def test_call_connection_success_writer_detected(self, monitor_impl_mock, topolo
248248
monitor = HostMonitor(monitor_impl_mock, host_info, None)
249249
connection_mock = MagicMock()
250250
monitor_impl_mock._plugin_service.force_connect.return_value = connection_mock
251-
topology_utils_mock.get_writer_host_if_connected.return_value = "writer.com"
251+
topology_utils_mock.get_writer_id_if_connected.return_value = "writer.com"
252252
topology_utils_mock.get_host_role.return_value = HostRole.WRITER
253253

254254
call_count = [0]
@@ -272,7 +272,7 @@ def test_call_connection_success_reader_detected(self, monitor_impl_mock, topolo
272272
monitor = HostMonitor(monitor_impl_mock, host_info, None)
273273
connection_mock = MagicMock()
274274
monitor_impl_mock._plugin_service.force_connect.return_value = connection_mock
275-
topology_utils_mock.get_writer_host_if_connected.return_value = None
275+
topology_utils_mock.get_writer_id_if_connected.return_value = None
276276

277277
call_count = [0]
278278

0 commit comments

Comments
 (0)