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)
Шаги воспроизведения
- Открыть или подключиться к локальной базе данных SQLite в приложении (при этом создаются файлы
.db-wal и .db-shm в режиме WAL).
- Закрыть окно десктопного приложения (
AppLifecycleState.detached).
- Проверить папку с файлом базы данных SQLite на диске.
- Фактический результат: Функция
disconnectAllExternalServices() не вызывает закрытие соединений в SqliteService. Файлы блокировок/WAL могут остаться незакрытыми в ОС.
- Ожидаемый результат: Функция
disconnectAllExternalServices() (или аналог disconnectAllServices()) должна вызывать await SqliteService.instance.disconnectAll(); наравне со всеми остальными сервисами.
Acceptance Criteria / Критерии приемки
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
desktopCore / Lifecycle & Storagebughighdev / 0.5.0Местоположение в коде
lib/app/app_shutdown.dart(строки ~8-13, функцияdisconnectAllExternalServices)lib/app/app_lifecycle_cleanup.dart(строки ~31-39)Шаги воспроизведения
.db-walи.db-shmв режиме WAL).AppLifecycleState.detached).disconnectAllExternalServices()не вызывает закрытие соединений вSqliteService. Файлы блокировок/WAL могут остаться незакрытыми в ОС.disconnectAllExternalServices()(или аналогdisconnectAllServices()) должна вызыватьawait SqliteService.instance.disconnectAll();наравне со всеми остальными сервисами.Acceptance Criteria / Критерии приемки
disconnectAllExternalServices()(или новую единую функцию закрытия всех сервисов) вlib/app/app_shutdown.dartдобавлен вызовawait SqliteService.instance.disconnectAll();.AppLifecycleCleanup) все активные SQLite-соединения корректно закрываются и сбрасывают буферы WAL на диск.