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

In case of transaction error ( writeBlocking ) realm doesn't cancel the transaction which lead to "The Realm is already in a write transaction" exception #1615

Closed
abdou-gh549 opened this issue Dec 21, 2023 · 1 comment

Comments

@abdou-gh549
Copy link

abdou-gh549 commented Dec 21, 2023

How frequently does the bug occur?

Always

Description

When i use writeBlocking for a write transaction and i get
"java.lang.IllegalArgumentException: Cannot import an outdated object. Use findLatest(object) to find an up-to-date version of the object in the given context before importing it ".
realm doesn't cancel the transaction which lead to the next one to fail because of RLM_ERR_WRONG_TRANSACTION_STATE ( realm already in write transaction )

to handle it in my case i had to add another try catch in my transaction to cancel it in case of unexpected error

when i looked into writeBlocking i found out that the only case when realm cancel the transaction is IllegalStateException

as a library user i think that opening / closing a transaction is realm responsibility, correct me if i am wrong

Stacktrace & log output

12-21 00:38:18.307: W/System.err(8191): java.lang.IllegalArgumentException: Cannot import an outdated object. Use findLatest(object) to find an
12-21 00:38:18.307: W/System.err(8191): up-to-date version of the object in the given context before importing
12-21 00:38:18.307: W/System.err(8191): it.
12-21 00:38:18.307: W/System.err(8191): 	at io.realm.kotlin.internal.RealmObjectListOperator.insert(RealmListInternal.kt:459)
12-21 00:38:18.307: W/System.err(8191): 	at io.realm.kotlin.internal.ListOperator$DefaultImpls.insertAll(RealmListInternal.kt:220)
12-21 00:38:18.307: W/System.err(8191): 	at io.realm.kotlin.internal.BaseRealmObjectListOperator.insertAll(RealmListInternal.kt:292)
12-21 00:38:18.307: W/System.err(8191): 	at io.realm.kotlin.internal.RealmObjectHelper.assignTyped$io_realm_kotlin_library(RealmObjectHelper.kt:796)
12-21 00:38:18.307: W/System.err(8191): 	at io.realm.kotlin.internal.RealmObjectHelper.assign$io_realm_kotlin_library(RealmObjectHelper.kt:729)
12-21 00:38:18.307: W/System.err(8191): 	at io.realm.kotlin.internal.RealmUtilsKt.copyToRealm(RealmUtils.kt:215)
12-21 00:38:18.307: W/System.err(8191): 	at io.realm.kotlin.internal.RealmUtilsKt.copyToRealm$default(RealmUtils.kt:139)
12-21 00:38:18.307: W/System.err(8191): 	at io.realm.kotlin.internal.InternalMutableRealm$DefaultImpls.copyToRealm(InternalMutableRealm.kt:57)
12-21 00:38:18.307: W/System.err(8191): 	at io.realm.kotlin.internal.SuspendableWriter$WriterRealm.copyToRealm(SuspendableWriter.kt:52)
12-21 00:38:18.307: W/System.err(8191): 	at com.omailey.api.helper.realmhelper.RealmWriterHelper$updateMessagesInDb$1.invoke(RealmWriterHelper.kt:223)
12-21 00:38:18.307: W/System.err(8191): 	at com.omailey.api.helper.realmhelper.RealmWriterHelper$updateMessagesInDb$1.invoke(RealmWriterHelper.kt:214)
12-21 00:38:18.307: W/System.err(8191): 	at com.omailey.api.helper.realmhelper.RealmWriterHelper$writeTTC$1$1.invoke(RealmWriterHelper.kt:2852)
12-21 00:38:18.307: W/System.err(8191): 	at com.omailey.api.helper.realmhelper.RealmWriterHelper$writeTTC$1$1.invoke(RealmWriterHelper.kt:2851)
12-21 00:38:18.307: W/System.err(8191): 	at io.realm.kotlin.internal.SuspendableWriter$write$2.invokeSuspend(SuspendableWriter.kt:110)
12-21 00:38:18.307: W/System.err(8191): 	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
12-21 00:38:18.307: W/System.err(8191): 	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
12-21 00:38:18.307: W/System.err(8191): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
12-21 00:38:18.307: W/System.err(8191): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
12-21 00:38:18.307: W/System.err(8191): 	at java.lang.Thread.run(Thread.java:764)
12-21 00:38:18.310: D/MediaSyncWorker(8191): startWork
12-21 00:38:18.314: D/RealmWriterHelper(8191): unflagAllUploading Medias: 
12-21 00:38:18.336: W/audio_hw_generic(1392): Hardware backing HAL too slow, could only write 0 of 720 frames
12-21 00:38:18.339: D/com.omailey.api.net.http.ApiRequestHandler(8191): onResponse success


12-21 00:38:18.456: D/MonitoringInstr(8191): Handling an uncaught exception thrown on the thread DefaultDispatcher-worker-13.
12-21 00:38:18.456: D/MonitoringInstr(8191): java.lang.IllegalStateException: [RLM_ERR_WRONG_TRANSACTION_STATE]: The Realm is already in a write transaction
12-21 00:38:18.456: D/MonitoringInstr(8191): 	at io.realm.kotlin.internal.interop.CoreErrorConverter.asThrowable(CoreErrorConverter.kt:44)
12-21 00:38:18.456: D/MonitoringInstr(8191): 	at io.realm.kotlin.internal.interop.realmcJNI.realm_begin_write(Native Method)
12-21 00:38:18.456: D/MonitoringInstr(8191): 	at io.realm.kotlin.internal.interop.realmc.realm_begin_write(realmc.java:465)
12-21 00:38:18.456: D/MonitoringInstr(8191): 	at io.realm.kotlin.internal.interop.RealmInterop.realm_begin_write(RealmInterop.kt:351)
12-21 00:38:18.456: D/MonitoringInstr(8191): 	at io.realm.kotlin.internal.WriteTransactionManager$DefaultImpls.beginTransaction(WriteTransactionManager.kt:28)
12-21 00:38:18.456: D/MonitoringInstr(8191): 	at io.realm.kotlin.internal.SuspendableWriter$WriterRealm.beginTransaction(SuspendableWriter.kt:52)
12-21 00:38:18.456: D/MonitoringInstr(8191): 	at io.realm.kotlin.internal.SuspendableWriter$write$2.invokeSuspend(SuspendableWriter.kt:108)
12-21 00:38:18.456: D/MonitoringInstr(8191): 	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
12-21 00:38:18.456: D/MonitoringInstr(8191): 	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
12-21 00:38:18.456: D/MonitoringInstr(8191): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
12-21 00:38:18.456: D/MonitoringInstr(8191): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
12-21 00:38:18.456: D/MonitoringInstr(8191): 	at java.lang.Thread.run(Thread.java:764)
12-21 00:38:18.456: D/MonitoringInstr(8191): 	Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@72fe6c3, Dispatchers.IO]
12-21 00:38:18.457: W/AndroidJUnitRunner(8191): An unhandled exception was thrown by the app.
12-21 00:38:18.457: W/AndroidJUnitRunner(8191): java.lang.IllegalStateException: [RLM_ERR_WRONG_TRANSACTION_STATE]: The Realm is already in a write transaction
12-21 00:38:18.457: W/AndroidJUnitRunner(8191): 	at io.realm.kotlin.internal.interop.CoreErrorConverter.asThrowable(CoreErrorConverter.kt:44)
12-21 00:38:18.457: W/AndroidJUnitRunner(8191): 	at io.realm.kotlin.internal.interop.realmcJNI.realm_begin_write(Native Method)
12-21 00:38:18.457: W/AndroidJUnitRunner(8191): 	at io.realm.kotlin.internal.interop.realmc.realm_begin_write(realmc.java:465)
12-21 00:38:18.457: W/AndroidJUnitRunner(8191): 	at io.realm.kotlin.internal.interop.RealmInterop.realm_begin_write(RealmInterop.kt:351)
12-21 00:38:18.457: W/AndroidJUnitRunner(8191): 	at io.realm.kotlin.internal.WriteTransactionManager$DefaultImpls.beginTransaction(WriteTransactionManager.kt:28)
12-21 00:38:18.457: W/AndroidJUnitRunner(8191): 	at io.realm.kotlin.internal.SuspendableWriter$WriterRealm.beginTransaction(SuspendableWriter.kt:52)
12-21 00:38:18.457: W/AndroidJUnitRunner(8191): 	at io.realm.kotlin.internal.SuspendableWriter$write$2.invokeSuspend(SuspendableWriter.kt:108)
12-21 00:38:18.457: W/AndroidJUnitRunner(8191): 	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
12-21 00:38:18.457: W/AndroidJUnitRunner(8191): 	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
12-21 00:38:18.457: W/AndroidJUnitRunner(8191): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
12-21 00:38:18.457: W/AndroidJUnitRunner(8191): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
12-21 00:38:18.457: W/AndroidJUnitRunner(8191): 	at java.lang.Thread.run(Thread.java:764)
12-21 00:38:18.457: W/AndroidJUnitRunner(8191): 	Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@72fe6c3, Dispatchers.IO]
12-21 00:38:18.458: D/AndroidJUnitRunner(8191): Reporting the crash to an event service.
12-21 00:38:18.458: D/TestEventClient(8191): Reporting process crashed to orchestration test run event service.
12-21 00:38:18.458: I/OrchestrationListener(8191): No test failure has been reported. Report the process crash.
12-21 00:38:18.461: I/AndroidJUnitRunner(8191): Bringing down the entire Instrumentation process.
12-21 00:38:18.462: E/MonitoringInstr(8191): Exception encountered by: Thread[DefaultDispatcher-worker-13,5,main]. Dumping thread state to outputs and pining for the fjords.
12-21 00:38:18.462: E/MonitoringInstr(8191): java.lang.IllegalStateException: [RLM_ERR_WRONG_TRANSACTION_STATE]: The Realm is already in a write transaction
12-21 00:38:18.462: E/MonitoringInstr(8191): 	at io.realm.kotlin.internal.interop.CoreErrorConverter.asThrowable(CoreErrorConverter.kt:44)
12-21 00:38:18.462: E/MonitoringInstr(8191): 	at io.realm.kotlin.internal.interop.realmcJNI.realm_begin_write(Native Method)
12-21 00:38:18.462: E/MonitoringInstr(8191): 	at io.realm.kotlin.internal.interop.realmc.realm_begin_write(realmc.java:465)
12-21 00:38:18.462: E/MonitoringInstr(8191): 	at io.realm.kotlin.internal.interop.RealmInterop.realm_begin_write(RealmInterop.kt:351)
12-21 00:38:18.462: E/MonitoringInstr(8191): 	at io.realm.kotlin.internal.WriteTransactionManager$DefaultImpls.beginTransaction(WriteTransactionManager.kt:28)
12-21 00:38:18.462: E/MonitoringInstr(8191): 	at io.realm.kotlin.internal.SuspendableWriter$WriterRealm.beginTransaction(SuspendableWriter.kt:52)
12-21 00:38:18.462: E/MonitoringInstr(8191): 	at io.realm.kotlin.internal.SuspendableWriter$write$2.invokeSuspend(SuspendableWriter.kt:108)
12-21 00:38:18.462: E/MonitoringInstr(8191): 	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
12-21 00:38:18.462: E/MonitoringInstr(8191): 	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
12-21 00:38:18.462: E/MonitoringInstr(8191): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
12-21 00:38:18.462: E/MonitoringInstr(8191): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
12-21 00:38:18.462: E/MonitoringInstr(8191): 	at java.lang.Thread.run(Thread.java:764)

Can you reproduce the bug?

Always

Reproduction Steps

  • throw an IllegalArgumentException inside a writeBlocking function
  • try to use writeBlocking on same realm instance

Version

1.10.0

What Atlas App Services are you using?

Local Database only

Are you using encryption?

Yes

Platform OS and version(s)

android API 29

Build environment

Android Studio version: Giraffe

@rorbech
Copy link
Contributor

rorbech commented Jan 9, 2024

Hi @abdou-gh549. Thanks for the report. I have created #1621 to fix it.

@rorbech rorbech closed this as completed Jan 9, 2024
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Mar 18, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

2 participants