From 609e5a2c7113cb7847104122d35dbd7eaca26f7e Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Fri, 10 Mar 2023 14:19:45 +0100 Subject: [PATCH] Use WorkManager queue to chain workers. This is necessary as many of the workers store user data. When running in parallel, there are race conditions and user data that was stored by one worker gets directly overwritten by the next worker. E.g. this happened with the "externalSignalingServer" attribute of user: SignalingSettingsWorker saved the user with the externalSignalingServer value, but then CapabilitiesWorker kicked in and saved the user without this value. Because of this, in WebsocketConnectionsWorker getExternalSignalingServer() of the user was null. Because of this, webSocketConnectionHelper.getExternalSignalingInstanceForServer(..) was not called. So the webSocketInstanceMap in WebSocketConnectionHelper was never filled. This is why WebSocketConnectionHelper.getMagicWebSocketInstanceForUserId(..) in ChatController failed to get a webSocketInstance. Signed-off-by: Marcel Hibbe --- .../application/NextcloudTalkApplication.kt | 19 ++++++++++++------- .../AccountVerificationController.kt | 15 ++++++++++----- .../talk/jobs/SignalingSettingsWorker.java | 7 ------- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt index e99ec721c..c8efea780 100644 --- a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt +++ b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt @@ -61,6 +61,7 @@ import com.nextcloud.talk.dagger.modules.ViewModelModule import com.nextcloud.talk.jobs.AccountRemovalWorker import com.nextcloud.talk.jobs.CapabilitiesWorker import com.nextcloud.talk.jobs.SignalingSettingsWorker +import com.nextcloud.talk.jobs.WebsocketConnectionsWorker import com.nextcloud.talk.ui.theme.ThemeModule import com.nextcloud.talk.utils.ClosedInterfaceImpl import com.nextcloud.talk.utils.DeviceUtils @@ -177,18 +178,22 @@ class NextcloudTalkApplication : MultiDexApplication(), LifecycleObserver { DeviceUtils.ignoreSpecialBatteryFeatures() val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java).build() + val capabilitiesUpdateWork = OneTimeWorkRequest.Builder(CapabilitiesWorker::class.java).build() + val signalingSettingsWork = OneTimeWorkRequest.Builder(SignalingSettingsWorker::class.java).build() + val websocketConnectionsWorker = OneTimeWorkRequest.Builder(WebsocketConnectionsWorker::class.java).build() + + WorkManager.getInstance(applicationContext) + .beginWith(accountRemovalWork) + .then(capabilitiesUpdateWork) + .then(signalingSettingsWork) + .then(websocketConnectionsWorker) + .enqueue() + val periodicCapabilitiesUpdateWork = PeriodicWorkRequest.Builder( CapabilitiesWorker::class.java, HALF_DAY, TimeUnit.HOURS ).build() - - val capabilitiesUpdateWork = OneTimeWorkRequest.Builder(CapabilitiesWorker::class.java).build() - val signalingSettingsWork = OneTimeWorkRequest.Builder(SignalingSettingsWorker::class.java).build() - - WorkManager.getInstance(applicationContext).enqueue(accountRemovalWork) - WorkManager.getInstance(applicationContext).enqueue(capabilitiesUpdateWork) - WorkManager.getInstance(applicationContext).enqueue(signalingSettingsWork) WorkManager.getInstance(applicationContext).enqueueUniquePeriodicWork( "DailyCapabilitiesUpdateWork", ExistingPeriodicWorkPolicy.REPLACE, diff --git a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt index df017ac8c..f275b6fba 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt @@ -48,6 +48,7 @@ import com.nextcloud.talk.events.EventStatus import com.nextcloud.talk.jobs.CapabilitiesWorker import com.nextcloud.talk.jobs.PushRegistrationWorker import com.nextcloud.talk.jobs.SignalingSettingsWorker +import com.nextcloud.talk.jobs.WebsocketConnectionsWorker import com.nextcloud.talk.models.json.capabilities.Capabilities import com.nextcloud.talk.models.json.capabilities.CapabilitiesOverall import com.nextcloud.talk.models.json.generic.Status @@ -434,11 +435,15 @@ class AccountVerificationController(args: Bundle? = null) : Data.Builder() .putLong(KEY_INTERNAL_USER_ID, internalAccountId) .build() - val signalingSettings = - OneTimeWorkRequest.Builder(SignalingSettingsWorker::class.java) - .setInputData(userData) - .build() - WorkManager.getInstance().enqueue(signalingSettings) + val signalingSettings = OneTimeWorkRequest.Builder(SignalingSettingsWorker::class.java) + .setInputData(userData) + .build() + val websocketConnectionsWorker = OneTimeWorkRequest.Builder(WebsocketConnectionsWorker::class.java).build() + + WorkManager.getInstance(applicationContext!!) + .beginWith(signalingSettings) + .then(websocketConnectionsWorker) + .enqueue() } private fun proceedWithLogin() { diff --git a/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsWorker.java b/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsWorker.java index dc8546b89..a0e4e7d07 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsWorker.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsWorker.java @@ -42,8 +42,6 @@ import javax.inject.Inject; import androidx.annotation.NonNull; import androidx.work.Data; -import androidx.work.OneTimeWorkRequest; -import androidx.work.WorkManager; import androidx.work.Worker; import androidx.work.WorkerParameters; import autodagger.AutoInjector; @@ -159,11 +157,6 @@ public class SignalingSettingsWorker extends Worker { }); } - OneTimeWorkRequest websocketConnectionsWorker = new OneTimeWorkRequest - .Builder(WebsocketConnectionsWorker.class) - .build(); - WorkManager.getInstance().enqueue(websocketConnectionsWorker); - return Result.success(); } }