def reconnect_to_writer()

in aws_advanced_python_wrapper/writer_failover_handler.py [0:0]


    def reconnect_to_writer(self, initial_writer_host: HostInfo):
        """
        Task A: Attempt to reconnect to the writer that originally failed.

        :param initial_writer_host: the writer host that originally failed.
        :return: the :py:class:`WriterFailoverResult` of the failover process.
        """
        logger.debug("WriterFailoverHandler.TaskAAttemptReconnectToWriterInstance", initial_writer_host.url,
                     PropertiesUtils.mask_properties(self._initial_connection_properties))

        conn: Optional[Connection] = None
        latest_topology: Optional[Tuple[HostInfo, ...]] = None
        success: bool = False

        try:
            while not self._timeout_event.is_set() and (latest_topology is None or len(latest_topology) == 0):
                try:
                    if conn is not None:
                        conn.close()

                    conn = self._plugin_service.force_connect(initial_writer_host, self._initial_connection_properties, self._timeout_event)
                    self._plugin_service.force_refresh_host_list(conn)
                    latest_topology = self._plugin_service.all_hosts

                except Exception as ex:
                    if not self._plugin_service.is_network_exception(ex):
                        logger.debug("WriterFailoverHandler.TaskAEncounteredException", ex)
                        return WriterFailoverResult(False, False, None, None, "TaskA", ex)

                if latest_topology is None or len(latest_topology) == 0:
                    sleep(self._reconnect_writer_interval_sec)
                else:
                    success = self.is_current_host_writer(latest_topology, initial_writer_host)

            self._plugin_service.set_availability(initial_writer_host.as_aliases(), HostAvailability.AVAILABLE)
            return WriterFailoverResult(success, False, latest_topology, conn if success else None, "TaskA", None)

        except Exception as ex:
            logger.error("WriterFailoverHandler.TaskAEncounteredException", ex)
            return WriterFailoverResult(False, False, None, None, "TaskA", None)

        finally:
            try:
                if conn is not None and not success:
                    conn.close()
            except Exception:
                pass
            logger.debug("WriterFailoverHandler.TaskAFinished")