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]: ConcurrentModificationException - com.onesignal.common.modeling.Model.toJSON(Model.kt:311) #1820

Closed
1 task done
tajchert opened this issue Aug 26, 2023 · 9 comments · Fixed by #1849
Closed
1 task done

Comments

@tajchert
Copy link

tajchert commented Aug 26, 2023

What happened?

Crash affecting some of users - 43 of them. Different versions of Android.

Steps to reproduce?

-

What did you expect to happen?

No crash.

OneSignal Android SDK version

5.0.0

Android version

13, 12, 11, 10, 9, 8

Specific Android models

No response

Relevant log output

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.toJSON(Model.kt:311)
       at com.onesignal.common.modeling.ModelStore.persist(ModelStore.kt:141)
       at com.onesignal.common.modeling.SingletonModelStore.replace(SingletonModelStore.kt:36)
       at com.onesignal.core.internal.config.impl.ConfigModelStoreListener$fetchParams$1.invokeSuspend(ConfigModelStoreListener.kt:101)
       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:1)
       at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(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(Thread.kt:30)

Code of Conduct

  • I agree to follow this project's Code of Conduct
@tajchert
Copy link
Author

I also have crashes with a bit different stacktrace. Not sure if I should create a separate issue for each of them or they are all connected.

@jennantilla
Copy link
Contributor

jennantilla commented Aug 28, 2023

@tajchert thanks for providing the stack trace for this additional crash. We're looking into these crashes, but if you have any others with ConcurrentModificationException, please feel free to add them to this issue for consolidation.

@tajchert
Copy link
Author

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.onModelAdded(ModelStoreListener.kt:38)
       at com.onesignal.common.modeling.ModelStore$addItem$1.invoke(ModelStore.kt:110)
       at com.onesignal.common.modeling.ModelStore$addItem$1.invoke(ModelStore.kt:110)
       at com.onesignal.common.events.EventProducer.fire(EventProducer.kt:44)
       at com.onesignal.common.modeling.ModelStore.addItem(ModelStore.kt:110)
       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.user.internal.subscriptions.impl.SubscriptionManager.addSubscriptionToModels(SubscriptionManager.kt:101)
       at com.onesignal.user.internal.subscriptions.impl.SubscriptionManager.addOrUpdatePushSubscription(SubscriptionManager.kt:63)
       at com.onesignal.notifications.internal.listeners.DeviceRegistrationListener.retrievePushTokenAndUpdateSubscription(DeviceRegistrationListener.kt:69)
       at com.onesignal.notifications.internal.listeners.DeviceRegistrationListener.onModelReplaced(DeviceRegistrationListener.kt:54)
       at com.onesignal.notifications.internal.listeners.DeviceRegistrationListener.onModelReplaced(DeviceRegistrationListener.kt:26)
       at com.onesignal.common.modeling.SingletonModelStore$replace$1.invoke(SingletonModelStore.kt:37)
       at com.onesignal.common.modeling.SingletonModelStore$replace$1.invoke(SingletonModelStore.kt:37)
       at com.onesignal.common.events.EventProducer.fire(EventProducer.kt:44)
       at com.onesignal.common.modeling.SingletonModelStore.replace(SingletonModelStore.kt:37)
       at com.onesignal.core.internal.config.impl.ConfigModelStoreListener$fetchParams$1.invokeSuspend(ConfigModelStoreListener.kt:101)
       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:1)
       at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(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(Thread.kt:30)

@tajchert
Copy link
Author

Fatal Exception: java.util.ConcurrentModificationException:
       at java.util.ArrayList$Itr.next(ArrayList.java:860)
       at kotlin.collections.CollectionsKt___CollectionsKt.firstOrNull(CollectionsKt___Collections.kt:288)
       at com.onesignal.common.modeling.ModelStore.add(ModelStore.kt:41)
       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:295)
       at com.onesignal.common.modeling.Model$notifyChanged$1.invoke(Model.kt:295)
       at com.onesignal.common.events.EventProducer.fire(EventProducer.kt:44)
       at com.onesignal.common.modeling.Model.notifyChanged(Model.kt:295)
       at com.onesignal.common.modeling.Model.setOptAnyProperty(Model.kt:200)
       at com.onesignal.common.modeling.Model.setOptEnumProperty$default(Model.kt:176)
       at com.onesignal.user.internal.subscriptions.SubscriptionModel.setStatus(SubscriptionModel.kt:107)
       at com.onesignal.user.internal.subscriptions.impl.SubscriptionManager.addOrUpdatePushSubscription(SubscriptionManager.kt:71)
       at com.onesignal.notifications.internal.listeners.DeviceRegistrationListener.retrievePushTokenAndUpdateSubscription(DeviceRegistrationListener.kt:69)
       at com.onesignal.notifications.internal.listeners.DeviceRegistrationListener.onModelReplaced(DeviceRegistrationListener.kt:54)
       at com.onesignal.notifications.internal.listeners.DeviceRegistrationListener.onModelReplaced(DeviceRegistrationListener.kt:26)
       at com.onesignal.common.modeling.SingletonModelStore$replace$1.invoke(SingletonModelStore.kt:37)
       at com.onesignal.common.modeling.SingletonModelStore$replace$1.invoke(SingletonModelStore.kt:37)
       at com.onesignal.common.events.EventProducer.fire(EventProducer.kt:44)
       at com.onesignal.common.modeling.SingletonModelStore.replace(SingletonModelStore.kt:37)
       at com.onesignal.core.internal.config.impl.ConfigModelStoreListener$fetchParams$1.invokeSuspend(ConfigModelStoreListener.kt:101)
       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:1)
       at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(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(Thread.kt:30)

@tajchert
Copy link
Author

Fatal Exception: java.util.ConcurrentModificationException:
       at java.util.ArrayList$Itr.next(ArrayList.java:860)
       at com.onesignal.common.events.EventProducer.fire(EventProducer.kt:43)
       at com.onesignal.core.internal.application.impl.ApplicationService.handleFocus(ApplicationService.kt:341)
       at com.onesignal.core.internal.application.impl.ApplicationService.onActivityStarted(ApplicationService.kt:149)
       at android.app.Application.dispatchActivityStarted(Application.java:431)
       at android.app.Activity.dispatchActivityStarted(Activity.java:1265)
       at android.app.Activity.onStart(Activity.java:1756)
       at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:344)
       at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:251)
       at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1433)
       at android.app.Activity.performStart(Activity.java:7923)
       at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3332)
       at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
       at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
       at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2044)
       at android.os.Handler.dispatchMessage(Handler.java:107)
       at android.os.Looper.loop(Looper.java:224)
       at android.app.ActivityThread.main(ActivityThread.java:7560)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

@dmytroreutov
Copy link

Same issue

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.toJSON(Model.kt:311)
       at com.onesignal.common.modeling.ModelStore.persist(ModelStore.kt:141)
       at com.onesignal.common.modeling.SingletonModelStore.replace(SingletonModelStore.kt:36)
       at com.onesignal.core.internal.config.impl.ConfigModelStoreListener$fetchParams$1.invokeSuspend(ConfigModelStoreListener.kt:101)
       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(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(Thread.kt:30)

@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.

@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
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants