diff --git a/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/sync/internal/SyncManager.kt b/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/sync/internal/SyncManager.kt index 68f2cb6f81c..d89eff4c337 100644 --- a/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/sync/internal/SyncManager.kt +++ b/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/sync/internal/SyncManager.kt @@ -78,6 +78,7 @@ import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicReference private const val QUERIES_TO_RETRY = 3 +private const val SYNC_MAX_CIDS = 100 /** * This class is responsible to sync messages, reactions and channel data. It tries to sync then, if necessary, @@ -303,10 +304,11 @@ internal class SyncManager( val lastSyncAt = syncState?.lastSyncedAt ?: Date(now()) val rawLastSyncAt = syncState?.rawLastSyncedAt logger.v { "[performSync] lastSyncAt: $lastSyncAt, rawLastSyncAt: $rawLastSyncAt" } + val cappedCids = cids.take(SYNC_MAX_CIDS) val result = if (rawLastSyncAt != null) { - chatClient.getSyncHistory(cids, rawLastSyncAt).await() + chatClient.getSyncHistory(cappedCids, rawLastSyncAt).await() } else { - chatClient.getSyncHistory(cids, lastSyncAt).await() + chatClient.getSyncHistory(cappedCids, lastSyncAt).await() } if (result.isTooManyEventsToSyncError()) { logger.e { "[performSync] failed (too many events to sync): $result" } diff --git a/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/internal/SyncManagerTest.kt b/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/internal/SyncManagerTest.kt index c1a0d8fd7a6..52a1cc03e3a 100644 --- a/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/internal/SyncManagerTest.kt +++ b/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/internal/SyncManagerTest.kt @@ -70,6 +70,7 @@ import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestInstance import org.mockito.kotlin.any import org.mockito.kotlin.doReturn +import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.mockito.kotlin.never import org.mockito.kotlin.times @@ -223,6 +224,27 @@ internal class SyncManagerTest { } } + @Test + fun `performSync caps channel_cids at 100`() = runTest(testDispatcher) { + /* Given */ + _syncState.value = null + whenever(repositoryFacade.selectSyncState(any())) doReturn null + val cids = (1..150).map { "messaging:channel-$it" } + val expectedCids = cids.take(100) + + whenever(chatClient.getSyncHistory(any(), any())) doReturn TestCall( + Result.Success(emptyList()), + ) + + val syncManager = buildSyncManager() + + /* When */ + syncManager.performSync(cids = cids) + + /* Then */ + verify(chatClient).getSyncHistory(eq(expectedCids), any()) + } + @Test fun `test sync max threshold for messages`() = runTest(testDispatcher) { /* Given */