From 07288c54582d2e9240d287c583ec8364642d6f67 Mon Sep 17 00:00:00 2001 From: SpiritCroc Date: Fri, 13 May 2022 12:22:41 +0200 Subject: [PATCH] Limit chunk reparation mechanisms to avoid too high delays Change-Id: I0512a911b8637cd62815e2570e1897a374bbcf5b --- .../session/room/timeline/LoadTimelineStrategy.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt index c9da412bc7..0c88c9b43f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt @@ -65,6 +65,8 @@ const val ENABLE_TIMELINE_LOOP_SPLITTING = true // TODO: once we feel comfortable that this is no longer necessary, // we probably want to disable this again for improving performance. const val ENABLE_TIMELINE_EMPTY_CHUNK_CLEANUP = true +// Performance consideration for huge timelines, when having ENABLE_TIMELINE_LOOP_SPLITTING or ENABLE_TIMELINE_EMPTY_CHUNK_CLEANUP set to true +const val MAX_CHUNK_REPAIR_CHECK_COUNT = 100 internal class LoadTimelineStrategy constructor( private val roomId: String, @@ -431,6 +433,10 @@ internal class LoadTimelineStrategy constructor( } } chunk = next + if (visited.size > MAX_CHUNK_REPAIR_CHECK_COUNT) { + Timber.i("Abort searching $directionName for empty chunks after ${visited.size} chunks") + return + } } } @@ -449,6 +455,10 @@ internal class LoadTimelineStrategy constructor( break } visited.add(chunk.identifier()) + if (visited.size > MAX_CHUNK_REPAIR_CHECK_COUNT) { + Timber.i("Abort searching $directionName for chunk loops after ${visited.size} chunks") + return + } chunk = directionFun(chunk) }