Обработка закрытия соединения со стороны оборудования.
Сейчас при закрытии соединения со стороны оборудования (например при истечении таймаута CLI) со стороны активатора остаётся висеть подключение. Это приводит к ошибкам выполнения следующих команд и сбою последующих опросов:
Подобное поведение происходит из-за обработки завершения соединения со стороны оборудования. В этом случае мы попадаем на код core.script.cli.cli.read_until_prompt
try:
metrics["cli_reads", ("proto", self.name)] += 1
r = await self.stream.read(self.BUFFER_SIZE)
except (asyncio.TimeoutError, TimeoutError):
self.logger.info("Timeout error")
metrics["cli_timeouts", ("proto", self.name)] += 1
# Stream must be closed to prevent hanging read callbacks
# @todo: Really? May be changed during migration to asyncio
self.close_stream()
raise self.timeout_exception_cls()
if not r:
self.logger.debug("Connection reset")
await self.on_failure(r, None, error_cls=CLIConnectionReset)
срабатывает условие
if not r:
self.logger.debug("Connection reset")
await self.on_failure(r, None, error_cls=CLIConnectionReset)
при этом self.close_stream()
не вызывается и соединение остаётся висеть до закрытия сессии. При этом какого-то признака закрытия соединения со стороны оборудования нет (просто сокет возвращает b""
). Необходимо понять как нам обрабатывать эту ситуацию.
Трейс при закрытии соединения со стороны оборудования: actiivator_device_close_trace1.txt