mirror of
https://github.com/immich-app/immich.git
synced 2025-08-11 09:16:31 -04:00
fix: cleanup logger DB in isolates (#20730)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
This commit is contained in:
parent
68b617130a
commit
9c8c52874a
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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)]);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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,
|
||||||
);
|
);
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user