1515from __future__ import annotations
1616
1717import socket
18- from datetime import datetime
18+ from datetime import datetime , timedelta
1919from time import perf_counter_ns
2020from typing import TYPE_CHECKING , FrozenSet , List , cast
2121
4444from aws_advanced_python_wrapper .iam_plugin import IamAuthPlugin
4545from aws_advanced_python_wrapper .pep249_methods import DbApiMethod
4646from aws_advanced_python_wrapper .plugin import Plugin , PluginFactory
47+ from aws_advanced_python_wrapper .utils import services_container
4748from aws_advanced_python_wrapper .utils .atomic import AtomicInt
4849from aws_advanced_python_wrapper .utils .concurrent import (ConcurrentDict ,
4950 ConcurrentSet )
51+ from aws_advanced_python_wrapper .utils .events import MonitorResetEvent
5052from aws_advanced_python_wrapper .utils .log import Logger
5153from aws_advanced_python_wrapper .utils .messages import Messages
5254from aws_advanced_python_wrapper .utils .properties import (Properties ,
@@ -901,6 +903,9 @@ def _run(self):
901903
902904 finally :
903905 self ._close_connection ()
906+ if self ._host_list_provider is not None :
907+ self ._host_list_provider .stop_monitor ()
908+ self ._host_list_provider = None
904909 logger .debug ("BlueGreenStatusMonitor.ThreadCompleted" , self ._bg_role )
905910
906911 def _open_connection (self ):
@@ -1237,6 +1242,8 @@ def __init__(self, plugin_service: PluginService, props: Properties, bg_id: str)
12371242 self ._green_dns_removed = False
12381243 self ._green_topology_changed = False
12391244 self ._all_green_hosts_changed_name = False
1245+ self ._monitor_reset_on_in_progress_completed = False
1246+ self ._monitor_reset_on_topology_completed = False
12401247 self ._post_status_end_time_ns = 0
12411248 self ._process_status_lock = RLock ()
12421249 self ._status_check_intervals_ms : Dict [BlueGreenIntervalRate , int ] = {}
@@ -1258,6 +1265,8 @@ def __init__(self, plugin_service: PluginService, props: Properties, bg_id: str)
12581265 Messages .get_formatted (
12591266 "BlueGreenStatusProvider.UnsupportedDialect" , self ._bg_id , dialect .__class__ .__name__ ))
12601267
1268+ services_container .get_storage_service ().register (BlueGreenStatus , item_expiration_time = timedelta (hours = 1 ))
1269+
12611270 current_host_info = self ._plugin_service .current_host_info
12621271 blue_monitor = BlueGreenStatusMonitor (
12631272 BlueGreenRole .SOURCE ,
@@ -1476,6 +1485,7 @@ def _update_summary_status(self, bg_role: BlueGreenRole, interim_status: BlueGre
14761485 elif self ._latest_phase == BlueGreenPhase .IN_PROGRESS :
14771486 self ._update_dns_flags (bg_role , interim_status )
14781487 self ._summary_status = self ._get_status_of_in_progress ()
1488+ self ._reset_monitors ("_monitor_reset_on_in_progress_completed" , "- start" )
14791489
14801490 elif self ._latest_phase == BlueGreenPhase .POST :
14811491 self ._update_dns_flags (bg_role , interim_status )
@@ -1503,6 +1513,7 @@ def _update_dns_flags(self, bg_role: BlueGreenRole, interim_status: BlueGreenInt
15031513 logger .debug ("BlueGreenStatusProvider.GreenTopologyChanged" , self ._bg_id )
15041514 self ._green_topology_changed = True
15051515 self ._store_event_phase_time ("Green topology changed" )
1516+ self ._reset_monitors ("_monitor_reset_on_topology_completed" , "- green topology" )
15061517
15071518 def _store_event_phase_time (self , key_prefix : str , phase : Optional [BlueGreenPhase ] = None ):
15081519 rollback_str = " (rollback)" if self ._rollback else ""
@@ -1846,6 +1857,20 @@ def _update_status_cache(self):
18461857 with latest_status .cv :
18471858 latest_status .cv .notify_all ()
18481859
1860+ def _reset_monitors (self , completed_flag_attr : str , event_name : str ):
1861+ if getattr (self , completed_flag_attr ):
1862+ return
1863+ setattr (self , completed_flag_attr , True )
1864+
1865+ blue_endpoints = frozenset (
1866+ host for host , role in self ._roles_by_host .items ()
1867+ if role == BlueGreenRole .SOURCE )
1868+
1869+ cluster_id = self ._plugin_service .host_list_provider .get_cluster_id ()
1870+ services_container .get_event_publisher ().publish (
1871+ MonitorResetEvent (cluster_id = cluster_id , endpoints = blue_endpoints ))
1872+ self ._store_event_phase_time (f"Monitor reset { event_name } " )
1873+
18491874 def _log_current_context (self ):
18501875 logger .debug (f"[bg_id: '{ self ._bg_id } '] Summary status: \n { self ._summary_status } " )
18511876 hosts_str = "\n " .join (
@@ -1913,6 +1938,8 @@ def _reset_context_when_completed(self):
19131938 self ._green_dns_removed = False
19141939 self ._green_topology_changed = False
19151940 self ._all_green_hosts_changed_name = False
1941+ self ._monitor_reset_on_in_progress_completed = False
1942+ self ._monitor_reset_on_topology_completed = False
19161943 self ._post_status_end_time_ns = 0
19171944 self ._interim_status_hashes = [0 , 0 ]
19181945 self ._latest_context_hash = 0
0 commit comments