improved report log for source init/refresh

This commit is contained in:
Thibault Deckers 2024-09-02 23:40:57 +02:00
parent 6869839b44
commit 467093e283
2 changed files with 20 additions and 18 deletions

View file

@ -37,6 +37,7 @@ class MediaStoreSource extends CollectionSource {
bool loadTopEntriesFirst = false, bool loadTopEntriesFirst = false,
bool canAnalyze = true, bool canAnalyze = true,
}) async { }) async {
await reportService.log('$runtimeType init directory=$directory');
if (_initState == SourceInitializationState.none) { if (_initState == SourceInitializationState.none) {
await _loadEssentials(); await _loadEssentials();
} }
@ -81,7 +82,7 @@ class MediaStoreSource extends CollectionSource {
required bool loadTopEntriesFirst, required bool loadTopEntriesFirst,
required bool canAnalyze, required bool canAnalyze,
}) async { }) async {
debugPrint('$runtimeType refresh start'); unawaited(reportService.log('$runtimeType load start'));
final stopwatch = Stopwatch()..start(); final stopwatch = Stopwatch()..start();
state = SourceState.loading; state = SourceState.loading;
clearEntries(); clearEntries();
@ -90,17 +91,17 @@ class MediaStoreSource extends CollectionSource {
if (loadTopEntriesFirst) { if (loadTopEntriesFirst) {
final topIds = settings.topEntryIds?.toSet(); final topIds = settings.topEntryIds?.toSet();
if (topIds != null) { if (topIds != null) {
debugPrint('$runtimeType refresh ${stopwatch.elapsed} load ${topIds.length} top entries'); debugPrint('$runtimeType load ${stopwatch.elapsed} load ${topIds.length} top entries');
topEntries.addAll(await localMediaDb.loadEntriesById(topIds)); topEntries.addAll(await localMediaDb.loadEntriesById(topIds));
addEntries(topEntries); addEntries(topEntries);
} }
} }
debugPrint('$runtimeType refresh ${stopwatch.elapsed} fetch known entries'); debugPrint('$runtimeType load ${stopwatch.elapsed} fetch known entries');
final knownEntries = await localMediaDb.loadEntries(origin: EntryOrigins.mediaStoreContent, directory: directory); final knownEntries = await localMediaDb.loadEntries(origin: EntryOrigins.mediaStoreContent, directory: directory);
final knownLiveEntries = knownEntries.where((entry) => !entry.trashed).toSet(); final knownLiveEntries = knownEntries.where((entry) => !entry.trashed).toSet();
debugPrint('$runtimeType refresh ${stopwatch.elapsed} check obsolete entries'); debugPrint('$runtimeType load ${stopwatch.elapsed} check obsolete entries');
final knownDateByContentId = Map.fromEntries(knownLiveEntries.map((entry) => MapEntry(entry.contentId, entry.dateModifiedSecs))); final knownDateByContentId = Map.fromEntries(knownLiveEntries.map((entry) => MapEntry(entry.contentId, entry.dateModifiedSecs)));
final knownContentIds = knownDateByContentId.keys.toList(); final knownContentIds = knownDateByContentId.keys.toList();
final removedContentIds = (await mediaStoreService.checkObsoleteContentIds(knownContentIds)).toSet(); final removedContentIds = (await mediaStoreService.checkObsoleteContentIds(knownContentIds)).toSet();
@ -112,14 +113,14 @@ class MediaStoreSource extends CollectionSource {
knownEntries.removeAll(removedEntries); knownEntries.removeAll(removedEntries);
// show known entries // show known entries
debugPrint('$runtimeType refresh ${stopwatch.elapsed} add known entries'); debugPrint('$runtimeType load ${stopwatch.elapsed} add known entries');
// add entries without notifying, so that the collection is not refreshed // add entries without notifying, so that the collection is not refreshed
// with items that may be hidden right away because of their metadata // with items that may be hidden right away because of their metadata
addEntries(knownEntries, notify: false); addEntries(knownEntries, notify: false);
await _loadVaultEntries(directory); await _loadVaultEntries(directory);
debugPrint('$runtimeType refresh ${stopwatch.elapsed} load metadata'); debugPrint('$runtimeType load ${stopwatch.elapsed} load metadata');
if (directory != null) { if (directory != null) {
final ids = knownLiveEntries.map((entry) => entry.id).toSet(); final ids = knownLiveEntries.map((entry) => entry.id).toSet();
await loadCatalogMetadata(ids: ids); await loadCatalogMetadata(ids: ids);
@ -144,12 +145,12 @@ class MediaStoreSource extends CollectionSource {
// clean up obsolete entries // clean up obsolete entries
if (removedEntries.isNotEmpty) { if (removedEntries.isNotEmpty) {
debugPrint('$runtimeType refresh ${stopwatch.elapsed} remove obsolete entries'); debugPrint('$runtimeType load ${stopwatch.elapsed} remove obsolete entries');
await localMediaDb.removeIds(removedEntries.map((entry) => entry.id).toSet()); await localMediaDb.removeIds(removedEntries.map((entry) => entry.id).toSet());
} }
// verify paths because some apps move files without updating their `last modified date` // verify paths because some apps move files without updating their `last modified date`
debugPrint('$runtimeType refresh ${stopwatch.elapsed} check obsolete paths'); debugPrint('$runtimeType load ${stopwatch.elapsed} check obsolete paths');
final knownPathByContentId = Map.fromEntries(knownLiveEntries.map((entry) => MapEntry(entry.contentId, entry.path))); final knownPathByContentId = Map.fromEntries(knownLiveEntries.map((entry) => MapEntry(entry.contentId, entry.path)));
final movedContentIds = (await mediaStoreService.checkObsoletePaths(knownPathByContentId)).toSet(); final movedContentIds = (await mediaStoreService.checkObsoletePaths(knownPathByContentId)).toSet();
movedContentIds.forEach((contentId) { movedContentIds.forEach((contentId) {
@ -161,13 +162,13 @@ class MediaStoreSource extends CollectionSource {
final newEntries = <AvesEntry>{}; final newEntries = <AvesEntry>{};
// recover untracked trash items // recover untracked trash items
debugPrint('$runtimeType refresh ${stopwatch.elapsed} recover untracked entries'); debugPrint('$runtimeType load ${stopwatch.elapsed} recover untracked entries');
if (directory == null) { if (directory == null) {
newEntries.addAll(await recoverUntrackedTrashItems()); newEntries.addAll(await recoverUntrackedTrashItems());
} }
// fetch new & modified entries // fetch new & modified entries
debugPrint('$runtimeType refresh ${stopwatch.elapsed} fetch new entries'); debugPrint('$runtimeType load ${stopwatch.elapsed} fetch new entries');
mediaStoreService.getEntries(_safeMode, knownDateByContentId, directory: directory).listen( mediaStoreService.getEntries(_safeMode, knownDateByContentId, directory: directory).listen(
(entry) { (entry) {
// when discovering modified entry with known content ID, // when discovering modified entry with known content ID,
@ -180,7 +181,7 @@ class MediaStoreSource extends CollectionSource {
}, },
onDone: () async { onDone: () async {
if (newEntries.isNotEmpty) { if (newEntries.isNotEmpty) {
debugPrint('$runtimeType refresh ${stopwatch.elapsed} save new entries'); debugPrint('$runtimeType load ${stopwatch.elapsed} save new entries');
await localMediaDb.insertEntries(newEntries); await localMediaDb.insertEntries(newEntries);
// TODO TLAD find duplication cause // TODO TLAD find duplication cause
@ -203,7 +204,7 @@ class MediaStoreSource extends CollectionSource {
updateDirectories(); updateDirectories();
} }
debugPrint('$runtimeType refresh ${stopwatch.elapsed} analyze'); debugPrint('$runtimeType load ${stopwatch.elapsed} analyze');
Set<AvesEntry>? analysisEntries; Set<AvesEntry>? analysisEntries;
final analysisIds = analysisController?.entryIds; final analysisIds = analysisController?.entryIds;
if (analysisIds != null) { if (analysisIds != null) {
@ -220,8 +221,7 @@ class MediaStoreSource extends CollectionSource {
// so we manually notify change for potential home screen filters // so we manually notify change for potential home screen filters
notifyAlbumsChanged(); notifyAlbumsChanged();
debugPrint('$runtimeType refresh ${stopwatch.elapsed} done'); unawaited(reportService.log('$runtimeType load done in ${stopwatch.elapsed.inSeconds}s for ${knownEntries.length} known, ${newEntries.length} new, ${removedEntries.length} removed'));
unawaited(reportService.log('Source refresh complete in ${stopwatch.elapsed.inSeconds}s for ${knownEntries.length} known, ${newEntries.length} new, ${removedEntries.length} removed'));
}, },
onError: (error) => debugPrint('$runtimeType stream error=$error'), onError: (error) => debugPrint('$runtimeType stream error=$error'),
); );
@ -238,7 +238,7 @@ class MediaStoreSource extends CollectionSource {
state = SourceState.loading; state = SourceState.loading;
debugPrint('$runtimeType refreshUris ${changedUris.length} uris'); unawaited(reportService.log('$runtimeType refresh start for ${changedUris.length} uris'));
final changedUriByContentId = Map.fromEntries(changedUris.map((uri) { final changedUriByContentId = Map.fromEntries(changedUris.map((uri) {
final pathSegments = Uri.parse(uri).pathSegments; final pathSegments = Uri.parse(uri).pathSegments;
// e.g. URI `content://media/` has no path segment // e.g. URI `content://media/` has no path segment
@ -297,8 +297,6 @@ class MediaStoreSource extends CollectionSource {
invalidateAlbumFilterSummary(directories: existingDirectories); invalidateAlbumFilterSummary(directories: existingDirectories);
state = SourceState.ready;
if (newEntries.isNotEmpty) { if (newEntries.isNotEmpty) {
await localMediaDb.insertEntries(newEntries); await localMediaDb.insertEntries(newEntries);
@ -323,6 +321,10 @@ class MediaStoreSource extends CollectionSource {
await refreshEntries(entriesToRefresh, EntryDataType.values.toSet()); await refreshEntries(entriesToRefresh, EntryDataType.values.toSet());
} }
unawaited(reportService.log('$runtimeType refresh end for ${changedUris.length} uris'));
state = SourceState.ready;
return tempUris; return tempUris;
} }

View file

@ -411,7 +411,7 @@ class _AvesAppState extends State<AvesApp> with WidgetsBindingObserver {
@override @override
void didHaveMemoryPressure() { void didHaveMemoryPressure() {
super.didHaveMemoryPressure(); super.didHaveMemoryPressure();
reportService.log('App memory pressure'); debugPrint('App memory pressure');
imageCache.clear(); imageCache.clear();
} }