fix: cleanup logger DB in isolates (#20730)

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
This commit is contained in:
shenlong 2025-08-07 03:27:17 +05:30 committed by GitHub
parent 68b617130a
commit 9c8c52874a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 25 additions and 28 deletions

View File

@ -4,6 +4,7 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/entities/store.entity.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/main.dart' as app;
import 'package:immich_mobile/providers/db.provider.dart'; import 'package:immich_mobile/providers/db.provider.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
@ -40,16 +41,14 @@ class ImmichTestHelper {
await EasyLocalization.ensureInitialized(); await EasyLocalization.ensureInitialized();
// Clear all data from Isar (reuse existing instance if available) // Clear all data from Isar (reuse existing instance if available)
final db = await Bootstrap.initIsar(); final db = await Bootstrap.initIsar();
await Bootstrap.initDomain(db); final logDb = DriftLogger();
await Bootstrap.initDomain(db, logDb);
await Store.clear(); await Store.clear();
await db.writeTxn(() => db.clear()); await db.writeTxn(() => db.clear());
// Load main Widget // Load main Widget
await tester.pumpWidget( await tester.pumpWidget(
ProviderScope( ProviderScope(
overrides: [ overrides: [dbProvider.overrideWithValue(db), isarProvider.overrideWithValue(db)],
dbProvider.overrideWithValue(db),
isarProvider.overrideWithValue(db),
],
child: const app.MainWidget(), child: const app.MainWidget(),
), ),
); );
@ -59,18 +58,11 @@ class ImmichTestHelper {
} }
@isTest @isTest
void immichWidgetTest( void immichWidgetTest(String description, Future<void> Function(WidgetTester, ImmichTestHelper) test) {
String description, testWidgets(description, (widgetTester) async {
Future<void> Function(WidgetTester, ImmichTestHelper) test,
) {
testWidgets(
description,
(widgetTester) async {
await ImmichTestHelper.loadApp(widgetTester); await ImmichTestHelper.loadApp(widgetTester);
await test(widgetTester, ImmichTestHelper(widgetTester)); await test(widgetTester, ImmichTestHelper(widgetTester));
}, }, semanticsEnabled: false);
semanticsEnabled: false,
);
} }
Future<void> pumpUntilFound( Future<void> pumpUntilFound(
@ -79,8 +71,7 @@ Future<void> pumpUntilFound(
Duration timeout = const Duration(seconds: 120), Duration timeout = const Duration(seconds: 120),
}) async { }) async {
bool found = false; bool found = false;
final timer = final timer = Timer(timeout, () => throw TimeoutException("Pump until has timed out"));
Timer(timeout, () => throw TimeoutException("Pump until has timed out"));
while (found != true) { while (found != true) {
await tester.pump(); await tester.pump();
found = tester.any(finder); found = tester.any(finder);

View File

@ -14,6 +14,7 @@ import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/constants/locales.dart'; import 'package:immich_mobile/constants/locales.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/generated/codegen_loader.g.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/app_life_cycle.provider.dart';
import 'package:immich_mobile/providers/asset_viewer/share_intent_upload.provider.dart'; import 'package:immich_mobile/providers/asset_viewer/share_intent_upload.provider.dart';
import 'package:immich_mobile/providers/db.provider.dart'; import 'package:immich_mobile/providers/db.provider.dart';
@ -41,7 +42,8 @@ import 'package:worker_manager/worker_manager.dart';
void main() async { void main() async {
ImmichWidgetsBinding(); ImmichWidgetsBinding();
final db = await Bootstrap.initIsar(); final db = await Bootstrap.initIsar();
await Bootstrap.initDomain(db); final logDb = DriftLogger();
await Bootstrap.initDomain(db, logDb);
await initApp(); await initApp();
// Warm-up isolate pool for worker manager // Warm-up isolate pool for worker manager
await workerManager.init(dynamicSpawning: true); await workerManager.init(dynamicSpawning: true);

View File

@ -14,6 +14,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/backup_album.entity.dart'; import 'package:immich_mobile/entities/backup_album.entity.dart';
import 'package:immich_mobile/entities/store.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/backup_candidate.model.dart';
import 'package:immich_mobile/models/backup/current_upload_asset.model.dart'; import 'package:immich_mobile/models/backup/current_upload_asset.model.dart';
import 'package:immich_mobile/models/backup/error_upload_asset.model.dart'; import 'package:immich_mobile/models/backup/error_upload_asset.model.dart';
@ -331,7 +332,8 @@ class BackgroundService {
Future<bool> _onAssetsChanged() async { Future<bool> _onAssetsChanged() async {
final db = await Bootstrap.initIsar(); 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)]); final ref = ProviderContainer(overrides: [dbProvider.overrideWithValue(db), isarProvider.overrideWithValue(db)]);

View File

@ -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/asset.entity.dart';
import 'package:immich_mobile/entities/store.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/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/infrastructure/utils/exif.converter.dart';
import 'package:immich_mobile/providers/infrastructure/exif.provider.dart'; import 'package:immich_mobile/providers/infrastructure/exif.provider.dart';
import 'package:immich_mobile/providers/infrastructure/user.provider.dart'; import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
@ -116,7 +117,8 @@ class BackupVerificationService {
final List<Asset> result = []; final List<Asset> result = [];
BackgroundIsolateBinaryMessenger.ensureInitialized(tuple.rootIsolateToken); BackgroundIsolateBinaryMessenger.ensureInitialized(tuple.rootIsolateToken);
final db = await Bootstrap.initIsar(); final db = await Bootstrap.initIsar();
await Bootstrap.initDomain(db); final logDb = DriftLogger();
await Bootstrap.initDomain(db, logDb);
await tuple.fileMediaRepository.enableBackgroundAccess(); await tuple.fileMediaRepository.enableBackgroundAccess();
final ApiService apiService = ApiService(); final ApiService apiService = ApiService();
apiService.setEndpoint(tuple.endpoint); apiService.setEndpoint(tuple.endpoint);

View File

@ -47,14 +47,11 @@ abstract final class Bootstrap {
); );
} }
static Future<void> initDomain(Isar db, {bool shouldBufferLogs = true}) async { static Future<void> initDomain(Isar db, DriftLogger logDb, {bool shouldBufferLogs = true}) async {
// load drift dbs
final loggerDb = DriftLogger();
await StoreService.init(storeRepository: IsarStoreRepository(db)); await StoreService.init(storeRepository: IsarStoreRepository(db));
await LogService.init( await LogService.init(
logRepository: LogRepository(loggerDb), logRepository: LogRepository(logDb),
storeRepository: IsarStoreRepository(db), storeRepository: IsarStoreRepository(db),
shouldBuffer: shouldBufferLogs, shouldBuffer: shouldBufferLogs,
); );

View File

@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/services/log.service.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/db.provider.dart';
import 'package:immich_mobile/providers/infrastructure/cancel.provider.dart'; import 'package:immich_mobile/providers/infrastructure/cancel.provider.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
@ -35,7 +36,8 @@ Cancelable<T?> runInIsolateGentle<T>({
DartPluginRegistrant.ensureInitialized(); DartPluginRegistrant.ensureInitialized();
final db = await Bootstrap.initIsar(); final db = await Bootstrap.initIsar();
await Bootstrap.initDomain(db, shouldBufferLogs: false); final logDb = DriftLogger();
await Bootstrap.initDomain(db, logDb, shouldBufferLogs: false);
final ref = ProviderContainer( final ref = ProviderContainer(
overrides: [ overrides: [
// TODO: Remove once isar is removed // TODO: Remove once isar is removed
@ -57,6 +59,7 @@ Cancelable<T?> runInIsolateGentle<T>({
} finally { } finally {
try { try {
await LogService.I.flush(); await LogService.I.flush();
await logDb.close();
await ref.read(driftProvider).close(); await ref.read(driftProvider).close();
// Close Isar safely // Close Isar safely