Skip to content

bug(core): app shutdown disconnectAllExternalServices omits SQLite service, causing resource and file lock leaks #271

Description

@ZhuchkaTriplesix

Summary / Описание проблемы

При завершении работы приложения (в жизненном цикле AppLifecycleState.detached или при вызове dispose виджета AppLifecycleCleanup) выполняется функция disconnectAllExternalServices() из app_shutdown.dart.
Она закрывает соединения с PostgreSQL, MySQL, MongoDB и Redis (PostgresService.instance.disconnectAll(), MysqlService.instance.disconnectAll(), и т.д.).
При этом вызов await SqliteService.instance.disconnectAll(); в этой функции пропущен. В результате при завершении работы приложения или закрытии окна соединения с локальными файлами SQLite не закрываются штатно, что может приводить к оставшимся на диске временным файлам блокировок (.db-wal, .db-shm) и потенциальному повреждению данных (в то время как в панели подключений disconnectAll() разработчики уже вручную добавили вызов SqliteService.instance.disconnectAll()).

Scope & Component

  • Scope: desktop
  • Component: Core / Lifecycle & Storage
  • Kind: bug
  • Severity: high
  • Detected in version: dev / 0.5.0

Местоположение в коде

  • Файлы:
    • lib/app/app_shutdown.dart (строки ~8-13, функция disconnectAllExternalServices)
    • lib/app/app_lifecycle_cleanup.dart (строки ~31-39)

Шаги воспроизведения

  1. Открыть или подключиться к локальной базе данных SQLite в приложении (при этом создаются файлы .db-wal и .db-shm в режиме WAL).
  2. Закрыть окно десктопного приложения (AppLifecycleState.detached).
  3. Проверить папку с файлом базы данных SQLite на диске.
  4. Фактический результат: Функция disconnectAllExternalServices() не вызывает закрытие соединений в SqliteService. Файлы блокировок/WAL могут остаться незакрытыми в ОС.
  5. Ожидаемый результат: Функция disconnectAllExternalServices() (или аналог disconnectAllServices()) должна вызывать await SqliteService.instance.disconnectAll(); наравне со всеми остальными сервисами.

Acceptance Criteria / Критерии приемки

  • В функцию disconnectAllExternalServices() (или новую единую функцию закрытия всех сервисов) в lib/app/app_shutdown.dart добавлен вызов await SqliteService.instance.disconnectAll();.
  • При закрытии приложения (AppLifecycleCleanup) все активные SQLite-соединения корректно закрываются и сбрасывают буферы WAL на диск.

Metadata

Metadata

Labels

bugSomething isn't workingcoreCore library logic and servicessqliteSQLite database driver and workspace

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions