Skip to content

bug(core): fix connection pool eviction and exception wrapping in SQLite and MySQL #332

Description

@ZhuchkaTriplesix

Описание задачи

Выявлены архитектурные недочеты в реализации пулов подключений SqliteConnectionPool и MysqlConnectionPool: утечка соединений поверх лимита maxEntries, незакрытые таймеры простоя и отсутствие нормализации исключений при подключении.

Зачем

  • Предотвратить неконтролируемое разрастание пула соединений SQLite (maxEntries overflow) при интенсивной работе или открытии множества вкладок.
  • Исключить фантомные срабатывания таймеров простоя (idleTimer) после вытеснения соединения из пула.
  • Обеспечить корректный перехват и отображение в UI ошибок аутентификации и сетевых сбоев MySQL.

Предлагаемые изменения

  1. Для SqliteConnectionPool (lib/core/database/sqlite_connection_pool.dart):
    • В _evictIfNeededBeforeNewSlot() заменить break; при отсутствии свободных (refs == 0) слотов на выброс StateError('SQLite connection pool exhausted: $maxEntries slots in use.') по аналогии с PostgreSQL и MySQL.
    • При вытеснении старой записи из пула обязательно отменять таймер: oldestEntry?.idleTimer?.cancel(); и использовать асинхронное закрытие unawaited(oldestEntry?.connection.disconnect());.
  2. Для MysqlConnectionPool (lib/core/database/mysql_connection_pool.dart):
    • Обернуть блок создания соединения в _creationLock.createIfAbsent в try/catch с пробросом MysqlConnectionException и сохранением stackTrace (Error.throwWithStackTrace), как это сделано в PostgresConnectionPool.acquire.

Технические требования

  • Исправить вытеснение слотов в SqliteConnectionPool._evictIfNeededBeforeNewSlot().
  • Добавить отмену таймеров перед закрытием соединений в SQLite пуле.
  • Добавить try/catch обертку в MysqlConnectionPool.acquire().
  • Добавить unit-тесты в test/core/database/sqlite_connection_pool_test.dart (на вытеснение и выброс ошибки при переполнении) и в mysql_connection_pool_test.dart.

Место в коде (ориентир)

  • lib/core/database/sqlite_connection_pool.dart
  • lib/core/database/mysql_connection_pool.dart
  • test/core/database/sqlite_connection_pool_test.dart (создать при необходимости)
  • test/core/database/mysql_connection_pool_test.dart

Acceptance Criteria

  • При попытке открыть 33-е одновременное активное соединение SQLite выбрасывается StateError('SQLite connection pool exhausted...'), а не создаются лишние соединения.
  • Таймеры простоя отменяются при вытеснении из пула.
  • Ошибки подключения MySQL оборачиваются в MysqlConnectionException.
  • Все unit-тесты пулов проходят успешно.

Scope

  • Scope: desktop
  • Component: Core / Database / ConnectionPool
  • Kind: bug

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions