Skip to content
GitLab
  • Menu
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Sign in / Register
  • N noc
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Locked Files
  • Issues 449
    • Issues 449
    • List
    • Boards
    • Service Desk
    • Milestones
    • Iterations
    • Requirements
  • Merge requests 25
    • Merge requests 25
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
    • Test Cases
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages & Registries
    • Packages & Registries
    • Package Registry
    • Container Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Code review
    • Insights
    • Issue
    • Repository
  • External wiki
    • External wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • noc
  • noc
  • Issues
  • #1365
Closed
Open
Created Aug 16, 2020 by Andrey Vertiprahov@aversantDeveloper

Обработка закрытия соединения со стороны оборудования.

Сейчас при закрытии соединения со стороны оборудования (например при истечении таймаута CLI) со стороны активатора остаётся висеть подключение. Это приводит к ошибкам выполнения следующих команд и сбою последующих опросов:

image

Подобное поведение происходит из-за обработки завершения соединения со стороны оборудования. В этом случае мы попадаем на код 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

Assignee
Assign to
Time tracking