fix: periodically execute pragma optimize (#28241)

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
This commit is contained in:
shenlong
2026-05-07 21:54:35 +07:00
committed by GitHub
parent 7f43c6a3a3
commit bd58db4fcc
2 changed files with 20 additions and 9 deletions
@@ -176,15 +176,8 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
final backgroundSyncManager = _ref?.read(backgroundSyncProvider); final backgroundSyncManager = _ref?.read(backgroundSyncProvider);
final nativeSyncApi = _ref?.read(nativeSyncApiProvider); final nativeSyncApi = _ref?.read(nativeSyncApiProvider);
await _drift.close();
await _driftLogger.close();
_ref?.dispose();
_ref = null;
_cancellationToken.complete();
_logger.info("Cleaning up background worker"); _logger.info("Cleaning up background worker");
_cancellationToken.complete();
final cleanupFutures = [ final cleanupFutures = [
nativeSyncApi?.cancelHashing(), nativeSyncApi?.cancelHashing(),
workerManagerPatch.dispose().catchError((_) async { workerManagerPatch.dispose().catchError((_) async {
@@ -195,10 +188,15 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
Store.dispose(), Store.dispose(),
backgroundSyncManager?.cancel(), backgroundSyncManager?.cancel(),
_drift.optimize(allTables: true),
]; ];
await Future.wait(cleanupFutures.nonNulls); await Future.wait(cleanupFutures.nonNulls);
_logger.info("Background worker resources cleaned up"); await _drift.close();
await _driftLogger.close();
_ref?.dispose();
_ref = null;
} catch (error, stack) { } catch (error, stack) {
dPrint(() => 'Failed to cleanup background worker: $error with stack: $stack'); dPrint(() => 'Failed to cleanup background worker: $error with stack: $stack');
} }
@@ -30,6 +30,7 @@ import 'package:immich_mobile/infrastructure/entities/user.entity.dart';
import 'package:immich_mobile/infrastructure/entities/user_metadata.entity.dart'; import 'package:immich_mobile/infrastructure/entities/user_metadata.entity.dart';
import 'package:immich_mobile/infrastructure/repositories/db.repository.drift.dart'; import 'package:immich_mobile/infrastructure/repositories/db.repository.drift.dart';
import 'package:immich_mobile/infrastructure/repositories/db.repository.steps.dart'; import 'package:immich_mobile/infrastructure/repositories/db.repository.steps.dart';
import 'package:logging/logging.dart';
@DriftDatabase( @DriftDatabase(
tables: [ tables: [
@@ -85,6 +86,17 @@ class Drift extends $Drift {
}); });
} }
Future<void> optimize({bool allTables = false}) async {
try {
if (allTables) {
await customStatement('PRAGMA optimize=0x10002');
}
await customStatement('PRAGMA optimize');
} catch (error) {
Logger('Drift').fine('Failed to optimize database', error);
}
}
@override @override
int get schemaVersion => 25; int get schemaVersion => 25;
@@ -265,6 +277,7 @@ class Drift extends $Drift {
} }
await customStatement('PRAGMA foreign_keys = ON;'); await customStatement('PRAGMA foreign_keys = ON;');
await optimize();
}, },
beforeOpen: (details) async { beforeOpen: (details) async {
await customStatement('PRAGMA foreign_keys = ON'); await customStatement('PRAGMA foreign_keys = ON');