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 на диск.

Activity

  1. added
    bugSomething isn't working
    sqliteSQLite database driver and workspace
    coreCore library logic and services
    on Jul 10, 2026
  2. ZhuchkaTriplesix commented on Jul 10, 2026

    @ZhuchkaTriplesix
    MemberAuthor

    Already fixed in #283 — SqliteService.instance.disconnectAll() is called from disconnectAllExternalServices().

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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