Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug]: Fatal Exception: java.util.ConcurrentModificationException #1857

Closed
1 task done
ayushi-sk opened this issue Oct 3, 2023 · 11 comments
Closed
1 task done

[Bug]: Fatal Exception: java.util.ConcurrentModificationException #1857

ayushi-sk opened this issue Oct 3, 2023 · 11 comments
Labels

Comments

@ayushi-sk
Copy link

ayushi-sk commented Oct 3, 2023

What happened?

Fatal Exception: java.util.ConcurrentModificationException:
       at java.util.ArrayList$Itr.next(ArrayList.java:860)
       at com.onesignal.common.modeling.ModelStore.persist(ModelStore.kt:140)
       at com.onesignal.common.modeling.ModelStore.addItem(ModelStore.kt:108)
       at com.onesignal.common.modeling.ModelStore.addItem$default(ModelStore.kt:98)
       at com.onesignal.common.modeling.ModelStore.add(ModelStore.kt:46)
       at com.onesignal.common.modeling.IModelStore$DefaultImpls.add$default(IModelStore.kt:37)
       at com.onesignal.core.internal.operations.impl.OperationRepo.internalEnqueue(OperationRepo.kt:76)
       at com.onesignal.core.internal.operations.impl.OperationRepo.enqueue(OperationRepo.kt:60)
       at com.onesignal.core.internal.operations.IOperationRepo$DefaultImpls.enqueue$default(IOperationRepo.kt:16)
       at com.onesignal.core.internal.operations.listeners.SingletonModelStoreListener.onModelUpdated(SingletonModelStoreListener.kt:51)
       at com.onesignal.common.modeling.SingletonModelStore$onModelUpdated$1.invoke(SingletonModelStore.kt:50)
       at com.onesignal.common.modeling.SingletonModelStore$onModelUpdated$1.invoke(SingletonModelStore.kt:50)
       at com.onesignal.common.events.EventProducer.fire(EventProducer.kt:44)
       at com.onesignal.common.modeling.SingletonModelStore.onModelUpdated(SingletonModelStore.kt:50)
       at com.onesignal.common.modeling.ModelStore$onChanged$1.invoke(ModelStore.kt:74)
       at com.onesignal.common.modeling.ModelStore$onChanged$1.invoke(ModelStore.kt:74)
       at com.onesignal.common.events.EventProducer.fire(EventProducer.kt:44)
       at com.onesignal.common.modeling.ModelStore.onChanged(ModelStore.kt:74)
       at com.onesignal.common.modeling.Model$notifyChanged$1.invoke(Model.kt:296)
       at com.onesignal.common.modeling.Model$notifyChanged$1.invoke(Model.kt:296)
       at com.onesignal.common.events.EventProducer.fire(EventProducer.kt:44)
       at com.onesignal.common.modeling.Model.notifyChanged(Model.kt:296)
       at com.onesignal.common.modeling.Model.notifyChanged(Model.kt:301)
       at com.onesignal.common.modeling.Model.setOptAnyProperty(Model.kt:201)
       at com.onesignal.common.modeling.Model.setOptAnyProperty$default(Model.kt:188)
       at com.onesignal.common.modeling.MapModel.put(MapModel.kt:47)
       at com.onesignal.common.modeling.MapModel.remove(MapModel.kt:8)
       at com.onesignal.common.modeling.MapModel.put(MapModel.kt:8)
       at com.onesignal.user.internal.UserManager.addTag(UserManager.kt:173)
       at kotlinx.coroutines.flow.FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2.emit(FlowKt__Transform.kt:223)
       at kotlinx.coroutines.flow.StateFlowImpl.collect(StateFlow.kt:396)
       at kotlinx.coroutines.flow.StateFlowImpl$collect$1.invokeSuspend(StateFlow.kt:1)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
       at kotlinx.coroutines.DispatchedTaskKt.resume(DispatchedTask.kt:235)
       at kotlinx.coroutines.DispatchedTaskKt.resumeUnconfined(DispatchedTask.kt:191)
       at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTask.kt:163)
       at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl.kt:474)
       at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl.kt:508)
       at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt:497)
       at kotlinx.coroutines.CancellableContinuationImpl.resumeWith(CancellableContinuationImpl.kt:368)
       at kotlinx.coroutines.flow.StateFlowSlot.makePending(StateFlowSlot.java:284)
       at kotlinx.coroutines.flow.StateFlowImpl.updateState(StateFlow.kt:349)
       at kotlinx.coroutines.flow.StateFlowImpl.compareAndSet(StateFlow.kt:319)
       at kotlinx.coroutines.flow.internal.SafeCollectorKt$emitFun$1.invoke(SafeCollector.kt:15)
       at kotlinx.coroutines.flow.internal.SafeCollectorKt$emitFun$1.invoke(SafeCollector.kt:15)
       at kotlinx.coroutines.flow.internal.SafeCollector.emit(SafeCollector.kt:87)
       at kotlinx.coroutines.flow.internal.SafeCollector.emit(SafeCollector.kt:66)
       at androidx.datastore.core.SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1$2.emit(SingleProcessDataStore.java:137)
       at kotlinx.coroutines.flow.FlowKt__LimitKt$dropWhile$1$1.emit(Limit.kt:40)
       at kotlinx.coroutines.flow.StateFlowImpl.collect(StateFlow.kt:396)
       at kotlinx.coroutines.flow.FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1.collect(SafeCollector.common.kt:115)
       at androidx.datastore.core.SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1.collect(SingleProcessDataStore.java:114)
       at kotlinx.coroutines.flow.FlowKt__CollectKt.emitAll(FlowKt__Collect.kt:109)
       at kotlinx.coroutines.flow.FlowKt.emitAll(Flow.kt:1)
       at androidx.datastore.core.SingleProcessDataStore$data$1.invokeSuspend(SingleProcessDataStore.kt:117)
       at androidx.datastore.core.SingleProcessDataStore$data$1.invoke(SingleProcessDataStore.kt:13)
       at androidx.datastore.core.SingleProcessDataStore$data$1.invoke(SingleProcessDataStore.kt:13)
       at kotlinx.coroutines.flow.SafeFlow.collectSafely(SafeFlow.java:61)
       at kotlinx.coroutines.flow.AbstractFlow.collect(AbstractFlow.java:230)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
       at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
       at android.os.Handler.handleCallback(Handler.java:938)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:257)
       at android.app.ActivityThread.main(ActivityThread.java:8185)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:626)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1015)

Steps to reproduce?

On using
OneSignal.User.addTag

What did you expect to happen?

Not crash the app

OneSignal Android SDK version

5.0.2

Android version

11, 10

Specific Android models

No response

Relevant log output

No response

Code of Conduct

  • I agree to follow this project's Code of Conduct
@jennantilla
Copy link
Contributor

Thanks for the report, @ayushi-sk. We're investigating this along with the similar crash you reported.

@jennantilla jennantilla added the Bug label Oct 6, 2023
@michael-winkler
Copy link

Here is also another crash report:

Fatal Exception: java.util.ConcurrentModificationException:
at java.util.ArrayList$Itr.next(ArrayList.java:860)
at com.onesignal.common.modeling.ModelStore.persist(ModelStore.kt:140)
at com.onesignal.common.modeling.ModelStore.addItem(ModelStore.kt:108)
at com.onesignal.common.modeling.ModelStore.addItem$default(ModelStore.kt:98)
at com.onesignal.common.modeling.ModelStore.add(ModelStore.kt:46)
at com.onesignal.common.modeling.IModelStore$DefaultImpls.add$default(IModelStore.kt:37)
at com.onesignal.core.internal.operations.impl.OperationRepo.internalEnqueue(OperationRepo.kt:76)
at com.onesignal.core.internal.operations.impl.OperationRepo.enqueue(OperationRepo.kt:60)
at com.onesignal.core.internal.operations.IOperationRepo$DefaultImpls.enqueue$default(IOperationRepo.kt:16)
at com.onesignal.core.internal.operations.listeners.ModelStoreListener.onModelUpdated(ModelStoreListener.kt:49)
at com.onesignal.common.modeling.ModelStore$onChanged$1.invoke(ModelStore.kt:74)
at com.onesignal.common.modeling.ModelStore$onChanged$1.invoke(ModelStore.kt:74)
at com.onesignal.common.events.EventProducer.fire(EventProducer.kt:44)
at com.onesignal.common.modeling.ModelStore.onChanged(ModelStore.kt:74)
at com.onesignal.common.modeling.Model$notifyChanged$1.invoke(Model.kt:296)
at com.onesignal.common.modeling.Model$notifyChanged$1.invoke(Model.kt:296)
at com.onesignal.common.events.EventProducer.fire(EventProducer.kt:44)
at com.onesignal.common.modeling.Model.notifyChanged(Model.kt:296)
at com.onesignal.common.modeling.Model.setOptAnyProperty(Model.kt:201)
at com.onesignal.common.modeling.Model.setOptStringProperty$default(Model.kt:180)
at com.onesignal.common.modeling.Model.setOptStringProperty(Model.kt:180)
at com.onesignal.common.modeling.Model.setStringProperty$default(Model.kt:168)
at com.onesignal.common.modeling.Model.setStringProperty(Model.kt:168)
at com.onesignal.common.modeling.Model.setStringProperty$default(Model.kt:168)
at com.onesignal.user.internal.subscriptions.SubscriptionModel.setAddress(SubscriptionModel.kt:95)
at com.onesignal.user.internal.subscriptions.impl.SubscriptionManager.addOrUpdatePushSubscription(SubscriptionManager.kt:68)
at com.onesignal.notifications.internal.listeners.DeviceRegistrationListener$retrievePushTokenAndUpdateSubscription$1.invokeSuspend(DeviceRegistrationListener.kt:74)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.internal.ScopeCoroutine.afterResume(Scopes.kt:32)
at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.kt:102)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:280)
at kotlinx.coroutines.BlockingCoroutine.joinBlocking(BlockingCoroutine.java:85)
at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(BuildersKt__Builders.kt:59)
at kotlinx.coroutines.BuildersKt.runBlocking(Builders.kt:1)
at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(BuildersKt__Builders.kt:38)
at kotlinx.coroutines.BuildersKt.runBlocking$default(Builders.kt:1)
at com.onesignal.common.threading.ThreadUtilsKt$suspendifyOnThread$1.invoke(ThreadUtils.kt:60)
at com.onesignal.common.threading.ThreadUtilsKt$suspendifyOnThread$1.invoke(ThreadUtils.kt:59)
at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Threads.kt:30)

@arthurgeron-work
Copy link

More stack traces of this error happening in different places from within onesignal.core:

Exception java.util.ConcurrentModificationException:
  at java.util.LinkedHashMap$LinkedHashIterator.nextNode (LinkedHashMap.java:760)
  at java.util.LinkedHashMap$LinkedEntryIterator.next (LinkedHashMap.java:792)
  at java.util.LinkedHashMap$LinkedEntryIterator.next (LinkedHashMap.java:790)
  at com.onesignal.common.modeling.Model.initializeFromModel (Model.kt:27)
  at com.onesignal.core.internal.config.impl.ConfigModelStoreListener$fetchParams$1.invokeSuspend (ConfigModelStoreListener.kt:155)
  at wm.a.resumeWith (ContinuationImpl.kt:9)
  at kotlinx.coroutines.internal.r.Z (Scopes.kt:7)
  at tp.a.resumeWith (AbstractCoroutine.kt:23)
  at wm.a.resumeWith (ContinuationImpl.kt:32)
  at tp.n0.run (DispatchedTask.kt:107)
  at tp.u0.S0 (EventLoop.common.kt:154)
  at tp.f.c
  at com.onesignal.common.threading.ThreadUtilsKt$suspendifyOnThread$1.invoke (ThreadUtils.kt:2)
  at com.onesignal.common.threading.ThreadUtilsKt$suspendifyOnThread$1.invoke (ThreadUtils.kt:1)
  at tm.a.run (Thread.kt:3)

Exception java.util.ConcurrentModificationException:
at java.util.LinkedHashMap$LinkedHashIterator.nextNode (LinkedHashMap.java:757)
at java.util.LinkedHashMap$LinkedEntryIterator.next (LinkedHashMap.java:790)
at java.util.LinkedHashMap$LinkedEntryIterator.next (LinkedHashMap.java:788)
at com.onesignal.common.modeling.Model.toJSON (Model.kt:22)
at com.onesignal.common.modeling.ModelStore.persist (ModelStore.kt:32)
at com.onesignal.common.modeling.SingletonModelStore.replace (SingletonModelStore.kt:22)
at com.onesignal.core.internal.config.impl.ConfigModelStoreListener$fetchParams$1.invokeSuspend (ConfigModelStoreListener.kt:592)
at wm.a.resumeWith (ContinuationImpl.kt:9)
at kotlinx.coroutines.internal.r.Z (Scopes.kt:7)
at tp.a.resumeWith (AbstractCoroutine.kt:23)
at wm.a.resumeWith (ContinuationImpl.kt:32)
at tp.n0.run (DispatchedTask.kt:107)
at tp.u0.S0 (EventLoop.common.kt:154)
at tp.f.c
at com.onesignal.common.threading.ThreadUtilsKt$suspendifyOnThread$1.invoke (ThreadUtils.kt:2)
at com.onesignal.common.threading.ThreadUtilsKt$suspendifyOnThread$1.invoke (ThreadUtils.kt:1)
at tm.a.run (Thread.kt:3)

@nan-li
Copy link
Contributor

nan-li commented Oct 12, 2023

Hi all, I apologize for any delay,

We have identified the cause and are working on the fix for all the methods this crash is reported.

@isles1217
Copy link

Seems like the same issue, but sharing my stack trace on 5.0.3 in case it's helpful

Fatal Exception: java.util.ConcurrentModificationException:
       at java.util.ArrayList$Itr.next(ArrayList.java:860)
       at com.onesignal.common.modeling.ModelStore.persist(ModelStore.java:25)
       at com.onesignal.common.modeling.ModelStore.addItem(ModelStore.java:20)
       at com.onesignal.common.modeling.ModelStore.addItem$default(ModelStore.java:7)
       at com.onesignal.common.modeling.ModelStore.add(ModelStore.java:2)
       at com.onesignal.common.modeling.IModelStore$DefaultImpls.add$default(IModelStore.java:2)
       at com.onesignal.core.internal.operations.impl.OperationRepo.internalEnqueue(OperationRepo.java:18)
       at com.onesignal.core.internal.operations.impl.OperationRepo.enqueue(OperationRepo.java:61)
       at com.onesignal.core.internal.operations.IOperationRepo$DefaultImpls.enqueue$default(IOperationRepo.java:7)
       at com.onesignal.core.internal.operations.listeners.ModelStoreListener.onModelUpdated(ModelStoreListener.java:56)
       at com.onesignal.common.modeling.ModelStore$onChanged$1.invoke(ModelStore.java:2)
       at com.onesignal.common.modeling.ModelStore$onChanged$1.invoke(ModelStore.java:1)
       at com.onesignal.common.events.EventProducer.fire(EventProducer.java:21)
       at com.onesignal.common.modeling.ModelStore.onChanged(ModelStore.java:20)
       at com.onesignal.common.modeling.Model$notifyChanged$1.invoke(Model.java:2)
       at com.onesignal.common.modeling.Model$notifyChanged$1.invoke(Model.java:1)
       at com.onesignal.common.events.EventProducer.fire(EventProducer.java:21)
       at com.onesignal.common.modeling.Model.notifyChanged(Model.java:18)
       at com.onesignal.common.modeling.Model.setOptAnyProperty(Model.java:49)
       at com.onesignal.user.internal.subscriptions.SubscriptionModel.setStatus(SubscriptionModel.java:14)
       at com.onesignal.user.internal.subscriptions.impl.SubscriptionManager.addOrUpdatePushSubscription(SubscriptionManager.java:43)
       at com.onesignal.notifications.internal.listeners.DeviceRegistrationListener$retrievePushTokenAndUpdateSubscription$1.invokeSuspend(DeviceRegistrationListener.java:70)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(BaseContinuationImpl.java:8)
       at kotlinx.coroutines.internal.ScopeCoroutine.afterResume(ScopeCoroutine.java:6)
       at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.java:22)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(BaseContinuationImpl.java:31)
       at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.java:105)
       at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoopImplBase.java:162)
       at kotlinx.coroutines.BlockingCoroutine.joinBlocking(BlockingCoroutine.java:98)
       at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(BuildersKt__Builders.kt:98)
       at kotlinx.coroutines.BuildersKt.runBlocking(Builders.kt:98)
       at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(BuildersKt__Builders.kt:2)
       at kotlinx.coroutines.BuildersKt.runBlocking$default(Builders.kt:2)
       at com.onesignal.common.threading.ThreadUtilsKt$suspendifyOnThread$1.invoke(ThreadUtils.kt:2)
       at com.onesignal.common.threading.ThreadUtilsKt$suspendifyOnThread$1.invoke(ThreadUtils.kt:1)
       at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Threads.kt:2)

@isles1217
Copy link

Spotted one other instance of the same issue:

atal Exception: java.util.ConcurrentModificationException:
       at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:760)
       at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:792)
       at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:790)
       at com.onesignal.common.modeling.Model.toJSON(Model.java:21)
       at com.onesignal.common.modeling.ModelStore.persist(ModelStore.java:31)
       at com.onesignal.common.modeling.SingletonModelStore.replace(SingletonModelStore.java:21)
       at com.onesignal.core.internal.config.impl.ConfigModelStoreListener$fetchParams$1.invokeSuspend(ConfigModelStoreListener.java:591)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(BaseContinuationImpl.java:8)
       at kotlinx.coroutines.internal.ScopeCoroutine.afterResume(ScopeCoroutine.java:6)
       at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.java:22)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(BaseContinuationImpl.java:31)
       at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.java:105)
       at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoopImplBase.java:162)
       at kotlinx.coroutines.BlockingCoroutine.joinBlocking(BlockingCoroutine.java:98)
       at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(BuildersKt__Builders.kt:98)
       at kotlinx.coroutines.BuildersKt.runBlocking(Builders.kt:98)
       at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(BuildersKt__Builders.kt:2)
       at kotlinx.coroutines.BuildersKt.runBlocking$default(Builders.kt:2)
       at com.onesignal.common.threading.ThreadUtilsKt$suspendifyOnThread$1.invoke(ThreadUtils.kt:2)
       at com.onesignal.common.threading.ThreadUtilsKt$suspendifyOnThread$1.invoke(ThreadUtils.kt:1)
       at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Threads.kt:2)

@arthurgeron-work
Copy link

arthurgeron-work commented Oct 18, 2023

I've found a way to consistently reproduce this issue:

  • User must have denied Notifications Permission
  • Code must call canRequestNotification and requestPermission more than once, simultaneously, eg:
import { OneSignal } from 'react-native-onesignal'; // V5

function requestNotificationsPermission() {
     OneSignal.Notifications.canRequestPermission().then(async (canRequest) => {
        canRequest && OneSignal.Notifications.requestPermission(false); // If notifications permission was already denied, this will be resolved immediately
      });
}

// Two or more parallel calls will reproduce the crash
requestNotificationsPermission();
requestNotificationsPermission();

It seems the ModelStore is not thread safe, hence attempting to access/change it more than once, simultaneously, causes this crash.
This sounds confusing at first since the stack trace doesn't seem to originate from the Notification calls themselves, but apparently, the notification check/request triggers an internal Android event, which itself triggers a write/read operation in a non-thread safe store in OneSignal's core android module, so if more than one event is triggered at the same time a ConcurrentException will be thrown.

On OneSignal's side, the fix would be to make the store safe for concurrent changes (e.g. Datastore), as it's recommended for stores with read/write based on events.

A simple, but temporary, fix on our side would be to implement notification permissions somewhat like this:

function useManageOneSignalPermissions() {
  const loading = useRef(false);

  useEffect(
    function checkForNotificationPermissions() {
      // Requesting permission more than once, simultaneously causes a crash on Android if the user has denied Notification Permissions
      if (!loading.current) {
        loading.current = true;
        OneSignal.Notifications.canRequestPermission()
          .then(async (canRequest) => {
            canRequest && await OneSignal.Notifications.requestPermission(false);
          })
          .finally(() => {
            loading.current = false
          });
      }
    },
    []
  )
}

I came up with this fix while thinking about how this error sounded familiar, which reminded me of a similar error I'd fixed over react-native-iap, which also turned out to be due to a racing condition triggered by parallel async calls; So I started searching for async calls in onesig and figured out that the notification permission's methods were causing this exception.

@israellot
Copy link

Exception java.util.ConcurrentModificationException: at java.util.LinkedHashMap$LinkedHashIterator.nextNode (LinkedHashMap.java:760) at java.util.LinkedHashMap$LinkedEntryIterator.next (LinkedHashMap.java:792) at java.util.LinkedHashMap$LinkedEntryIterator.next (LinkedHashMap.java:790) at com.onesignal.common.modeling.Model.initializeFromModel (Model.kt:124) at com.onesignal.core.internal.config.impl.ConfigModelStoreListener$fetchParams$1.invokeSuspend (ConfigModelStoreListener.kt:69) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (ContinuationImpl.kt:33) at kotlinx.coroutines.internal.ScopeCoroutine.afterResume (Scopes.kt:33) at kotlinx.coroutines.AbstractCoroutine.resumeWith (AbstractCoroutine.kt:102) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (ContinuationImpl.kt:46) at kotlinx.coroutines.DispatchedTask.run (DispatchedTask.kt:106) at kotlinx.coroutines.EventLoopImplBase.processNextEvent (EventLoop.common.kt:284) at kotlinx.coroutines.BlockingCoroutine.joinBlocking (Builders.kt:85) at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking (Builders.kt:59) at kotlinx.coroutines.BuildersKt.runBlocking (Builders.kt) at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default (Builders.kt:38) at kotlinx.coroutines.BuildersKt.runBlocking$default (Builders.kt) at com.onesignal.common.threading.ThreadUtilsKt$suspendifyOnThread$1.invoke (ThreadUtils.kt:60) at com.onesignal.common.threading.ThreadUtilsKt$suspendifyOnThread$1.invoke (ThreadUtils.kt:59) at kotlin.concurrent.ThreadsKt$thread$thread$1.run (Thread.kt:30)

adding to the list

@chokokatana
Copy link

The crashes keep coming, Xiaomi Xiaomi 11 T Android 13:

Fatal Exception: java.util.ConcurrentModificationException:
       at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:760)
       at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:792)
       at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:790)
       at com.onesignal.common.modeling.Model.initializeFromModel(Model.kt:124)
       at com.onesignal.core.internal.config.impl.ConfigModelStoreListener$fetchParams$1.invokeSuspend(ConfigModelStoreListener.kt:69)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
       at kotlinx.coroutines.internal.ScopeCoroutine.afterResume(Scopes.kt:32)
       at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.kt:102)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
       at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
       at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:280)
       at kotlinx.coroutines.BlockingCoroutine.joinBlocking(BlockingCoroutine.java:85)
       at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(BuildersKt__Builders.kt:59)
       at kotlinx.coroutines.BuildersKt.runBlocking(Builders.kt:1)
       at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(BuildersKt__Builders.kt:38)
       at kotlinx.coroutines.BuildersKt.runBlocking$default(Builders.kt:1)
       at com.onesignal.common.threading.ThreadUtilsKt$suspendifyOnThread$1.invoke(ThreadUtils.kt:60)
       at com.onesignal.common.threading.ThreadUtilsKt$suspendifyOnThread$1.invoke(ThreadUtils.kt:59)
       at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Threads.kt:30)

@jennantilla
Copy link
Contributor

Hello everyone! Thank you for your patience here. We have introduced a fix for this crash in our latest release, 5.0.4. Please update your SDK and let us know if you are still having any issues.

@jennantilla
Copy link
Contributor

Closing out this issue. Please let us know if you are seeing any further occurrences of this exception. Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

8 participants