From 9c8c52874a8cc905adf239a11a696211fbe57349 Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Thu, 7 Aug 2025 03:27:17 +0530 Subject: [PATCH] fix: cleanup logger DB in isolates (#20730) Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> --- .../test_utils/general_helper.dart | 29 +++++++------------ mobile/lib/main.dart | 4 ++- mobile/lib/services/background.service.dart | 4 ++- .../services/backup_verification.service.dart | 4 ++- mobile/lib/utils/bootstrap.dart | 7 ++--- mobile/lib/utils/isolate.dart | 5 +++- 6 files changed, 25 insertions(+), 28 deletions(-) diff --git a/mobile/integration_test/test_utils/general_helper.dart b/mobile/integration_test/test_utils/general_helper.dart index 8e17bae9d3..550f44b501 100644 --- a/mobile/integration_test/test_utils/general_helper.dart +++ b/mobile/integration_test/test_utils/general_helper.dart @@ -4,6 +4,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/entities/store.entity.dart'; +import 'package:immich_mobile/infrastructure/repositories/logger_db.repository.dart'; import 'package:immich_mobile/main.dart' as app; import 'package:immich_mobile/providers/db.provider.dart'; import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; @@ -40,16 +41,14 @@ class ImmichTestHelper { await EasyLocalization.ensureInitialized(); // Clear all data from Isar (reuse existing instance if available) final db = await Bootstrap.initIsar(); - await Bootstrap.initDomain(db); + final logDb = DriftLogger(); + await Bootstrap.initDomain(db, logDb); await Store.clear(); await db.writeTxn(() => db.clear()); // Load main Widget await tester.pumpWidget( ProviderScope( - overrides: [ - dbProvider.overrideWithValue(db), - isarProvider.overrideWithValue(db), - ], + overrides: [dbProvider.overrideWithValue(db), isarProvider.overrideWithValue(db)], child: const app.MainWidget(), ), ); @@ -59,18 +58,11 @@ class ImmichTestHelper { } @isTest -void immichWidgetTest( - String description, - Future Function(WidgetTester, ImmichTestHelper) test, -) { - testWidgets( - description, - (widgetTester) async { - await ImmichTestHelper.loadApp(widgetTester); - await test(widgetTester, ImmichTestHelper(widgetTester)); - }, - semanticsEnabled: false, - ); +void immichWidgetTest(String description, Future Function(WidgetTester, ImmichTestHelper) test) { + testWidgets(description, (widgetTester) async { + await ImmichTestHelper.loadApp(widgetTester); + await test(widgetTester, ImmichTestHelper(widgetTester)); + }, semanticsEnabled: false); } Future pumpUntilFound( @@ -79,8 +71,7 @@ Future pumpUntilFound( Duration timeout = const Duration(seconds: 120), }) async { bool found = false; - final timer = - Timer(timeout, () => throw TimeoutException("Pump until has timed out")); + final timer = Timer(timeout, () => throw TimeoutException("Pump until has timed out")); while (found != true) { await tester.pump(); found = tester.any(finder); diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index 0bac282694..19ed746833 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -14,6 +14,7 @@ import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/constants/locales.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/generated/codegen_loader.g.dart'; +import 'package:immich_mobile/infrastructure/repositories/logger_db.repository.dart'; import 'package:immich_mobile/providers/app_life_cycle.provider.dart'; import 'package:immich_mobile/providers/asset_viewer/share_intent_upload.provider.dart'; import 'package:immich_mobile/providers/db.provider.dart'; @@ -41,7 +42,8 @@ import 'package:worker_manager/worker_manager.dart'; void main() async { ImmichWidgetsBinding(); final db = await Bootstrap.initIsar(); - await Bootstrap.initDomain(db); + final logDb = DriftLogger(); + await Bootstrap.initDomain(db, logDb); await initApp(); // Warm-up isolate pool for worker manager await workerManager.init(dynamicSpawning: true); diff --git a/mobile/lib/services/background.service.dart b/mobile/lib/services/background.service.dart index dea20b6d98..3bcc93f19f 100644 --- a/mobile/lib/services/background.service.dart +++ b/mobile/lib/services/background.service.dart @@ -14,6 +14,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/entities/backup_album.entity.dart'; import 'package:immich_mobile/entities/store.entity.dart'; +import 'package:immich_mobile/infrastructure/repositories/logger_db.repository.dart'; import 'package:immich_mobile/models/backup/backup_candidate.model.dart'; import 'package:immich_mobile/models/backup/current_upload_asset.model.dart'; import 'package:immich_mobile/models/backup/error_upload_asset.model.dart'; @@ -331,7 +332,8 @@ class BackgroundService { Future _onAssetsChanged() async { final db = await Bootstrap.initIsar(); - await Bootstrap.initDomain(db); + final logDb = DriftLogger(); + await Bootstrap.initDomain(db, logDb); final ref = ProviderContainer(overrides: [dbProvider.overrideWithValue(db), isarProvider.overrideWithValue(db)]); diff --git a/mobile/lib/services/backup_verification.service.dart b/mobile/lib/services/backup_verification.service.dart index c0f3c0205e..8f39fd17e5 100644 --- a/mobile/lib/services/backup_verification.service.dart +++ b/mobile/lib/services/backup_verification.service.dart @@ -11,6 +11,7 @@ import 'package:immich_mobile/domain/services/user.service.dart'; import 'package:immich_mobile/entities/asset.entity.dart'; import 'package:immich_mobile/entities/store.entity.dart'; import 'package:immich_mobile/infrastructure/repositories/exif.repository.dart'; +import 'package:immich_mobile/infrastructure/repositories/logger_db.repository.dart'; import 'package:immich_mobile/infrastructure/utils/exif.converter.dart'; import 'package:immich_mobile/providers/infrastructure/exif.provider.dart'; import 'package:immich_mobile/providers/infrastructure/user.provider.dart'; @@ -116,7 +117,8 @@ class BackupVerificationService { final List result = []; BackgroundIsolateBinaryMessenger.ensureInitialized(tuple.rootIsolateToken); final db = await Bootstrap.initIsar(); - await Bootstrap.initDomain(db); + final logDb = DriftLogger(); + await Bootstrap.initDomain(db, logDb); await tuple.fileMediaRepository.enableBackgroundAccess(); final ApiService apiService = ApiService(); apiService.setEndpoint(tuple.endpoint); diff --git a/mobile/lib/utils/bootstrap.dart b/mobile/lib/utils/bootstrap.dart index 9cab9caf9e..d2ad5ea16f 100644 --- a/mobile/lib/utils/bootstrap.dart +++ b/mobile/lib/utils/bootstrap.dart @@ -47,14 +47,11 @@ abstract final class Bootstrap { ); } - static Future initDomain(Isar db, {bool shouldBufferLogs = true}) async { - // load drift dbs - final loggerDb = DriftLogger(); - + static Future initDomain(Isar db, DriftLogger logDb, {bool shouldBufferLogs = true}) async { await StoreService.init(storeRepository: IsarStoreRepository(db)); await LogService.init( - logRepository: LogRepository(loggerDb), + logRepository: LogRepository(logDb), storeRepository: IsarStoreRepository(db), shouldBuffer: shouldBufferLogs, ); diff --git a/mobile/lib/utils/isolate.dart b/mobile/lib/utils/isolate.dart index 01903cfc74..2dfd9d4f5f 100644 --- a/mobile/lib/utils/isolate.dart +++ b/mobile/lib/utils/isolate.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/domain/services/log.service.dart'; +import 'package:immich_mobile/infrastructure/repositories/logger_db.repository.dart'; import 'package:immich_mobile/providers/db.provider.dart'; import 'package:immich_mobile/providers/infrastructure/cancel.provider.dart'; import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; @@ -35,7 +36,8 @@ Cancelable runInIsolateGentle({ DartPluginRegistrant.ensureInitialized(); final db = await Bootstrap.initIsar(); - await Bootstrap.initDomain(db, shouldBufferLogs: false); + final logDb = DriftLogger(); + await Bootstrap.initDomain(db, logDb, shouldBufferLogs: false); final ref = ProviderContainer( overrides: [ // TODO: Remove once isar is removed @@ -57,6 +59,7 @@ Cancelable runInIsolateGentle({ } finally { try { await LogService.I.flush(); + await logDb.close(); await ref.read(driftProvider).close(); // Close Isar safely