From 29e2d15386ece40002f499d23df6ea5b8df5bad4 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Wed, 10 Dec 2025 11:14:19 -0300 Subject: [PATCH] [db] Update repositoriesState atomically in RepoManager Otherwise, concurrency issues may cause a broken state such as the same repo being in the list two times. --- .../src/main/java/org/fdroid/index/RepoManager.kt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/libs/database/src/main/java/org/fdroid/index/RepoManager.kt b/libs/database/src/main/java/org/fdroid/index/RepoManager.kt index 273324e98..5a8cdf2da 100644 --- a/libs/database/src/main/java/org/fdroid/index/RepoManager.kt +++ b/libs/database/src/main/java/org/fdroid/index/RepoManager.kt @@ -87,13 +87,13 @@ public class RepoManager @JvmOverloads constructor( init { // we need to load the repositories first off the UiThread, so it doesn't deadlock GlobalScope.launch(coroutineContext) { - _repositoriesState.value = repositoryDao.getRepositories() + _repositoriesState.update { repositoryDao.getRepositories() } repoCountDownLatch.countDown() withContext(Dispatchers.Main) { // keep observing the repos from the DB // and update internal cache when changes happen db.getRepositoryDao().getLiveRepositories().observeForever { repositories -> - _repositoriesState.value = repositories + _repositoriesState.update { repositories } } } } @@ -149,7 +149,7 @@ public class RepoManager @JvmOverloads constructor( // while this will get updated automatically, getting the update may be slow, // so to speed up the UI, we emit the state change right away (deletion is unlikely to fail) _repositoriesState.update { - _repositoriesState.value.filter { repo -> + it.filter { repo -> // keep only repos that are not the deleted one repo.repoId != repoId } @@ -186,8 +186,10 @@ public class RepoManager @JvmOverloads constructor( val addedRepo = repoAdder.addFetchedRepository() // if repo was added, update state right away, so it becomes available asap if (addedRepo != null) withContext(Dispatchers.Main) { - _repositoriesState.value = _repositoriesState.value.toMutableList().apply { - add(addedRepo) + _repositoriesState.update { + it.toMutableList().apply { + add(addedRepo) + } } } }