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

TransactionTooLargeException during sync doesn't cause notification #1138

Closed
2 tasks done
rfc2822 opened this issue Nov 21, 2024 · 1 comment · Fixed by #1139
Closed
2 tasks done

TransactionTooLargeException during sync doesn't cause notification #1138

rfc2822 opened this issue Nov 21, 2024 · 1 comment · Fixed by #1139
Assignees
Labels
bug Something isn't working

Comments

@rfc2822
Copy link
Member

rfc2822 commented Nov 21, 2024

Problem scope

  • I'm sure that this is a DAVx⁵ problem.

App version

  • I'm using the latest available DAVx⁵ version.

Android version and device/firmware type

No response

Steps to reproduce

  1. Create event on server with very large (~ 1 MB) DESCRIPTION (for instance, big_text_input.txt from there).
  2. Sync with DAVx5.

Actual result

No error message, event is silently ignored by DAVx5.

The expected IPC size exception is however logged:

                                                            Vestibulum hendrerit urna ut dui dictum porttitor. Praesent ut ex sed libero pretium dapibus sed in orci. Etiam leo nisi, sollicitudin vitae elit at, sagittis imperdiet arcu. Nullam placerat justo quis cursus pellentesque. Proin interdum elit ut tortor tempor viverra. Mauris eget nisl vehicu[…]
19:00:01.972 21634-23329 .BatchOperation                 D  #1: ContentProviderOperation(type=insert uri=content://com.android.calendar/extendedproperties?account_name=test%40example.com&account_type=bitfire.at.davdroid&caller_is_syncadapter=true values={name=vnd.android.cursor.item/vnd.ical4android.unknown-property, value=["CREATED","20241113T140548Z"], event_id=android.content.ContentProviderOperation$BackReference@1323255})
19:00:01.972 21634-23329 .BatchOperation                 D  Running 2 operations (0 .. 1)
19:00:01.976 21634-23329 IPCThreadState                  E  Binder transaction failure. id: 6195183, BR_*: 29201, error: -28 (No space left on device)
19:00:01.976 21634-23329 BpBinder                        W  Large outgoing transaction of 2209748 bytes, interface descriptor , code 20
19:00:01.977 21634-23329 JavaBinder                      E  !!! FAILED BINDER TRANSACTION !!!  (parcel size = 2209748)
19:00:01.978 21634-23329 .BatchOperation                 W  Transaction too large, splitting (losing atomicity)
19:00:01.978 21634-23329 .BatchOperation                 D  Running 1 operations (0 .. 0)
19:00:01.981 21634-23329 IPCThreadState                  E  Binder transaction failure. id: 6195188, BR_*: 29201, error: -28 (No space left on device)
19:00:01.981 21634-23329 BpBinder                        W  Large outgoing transaction of 2209168 bytes, interface descriptor , code 20
19:00:01.983 21634-23329 ActivityThread                  D  Too many transaction errors, throttling freezer binder callback.
19:00:01.983 21634-23329 JavaBinder                      E  !!! FAILED BINDER TRANSACTION !!!  (parcel size = 2209168)
19:00:01.985 21634-23329 .sync.SyncManager               E  Couldn't access local storage
                                                            at.bitfire.ical4android.CalendarStorageException: Can't transfer data to content provider (too large data row can't be split)
                                                            	at at.bitfire.ical4android.BatchOperation.runBatch(BatchOperation.kt:117)
                                                            	at at.bitfire.ical4android.BatchOperation.runBatch(BatchOperation.kt:122)
                                                            	at at.bitfire.ical4android.BatchOperation.commit(BatchOperation.kt:60)
                                                            	at at.bitfire.ical4android.AndroidEvent.add(AndroidEvent.kt:573)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager.processVEvent$lambda$14$lambda$13(CalendarSyncManager.kt:281)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager.$r8$lambda$43hNQxo5k52FeIcYrGMKqoDTstY(Unknown Source:0)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager$$ExternalSyntheticLambda3.invoke(D8$$SyntheticClass:0)
                                                            	at at.bitfire.davdroid.sync.SyncException$Companion.wrapWithLocalResource(SyncException.kt:22)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager.processVEvent$lambda$14(CalendarSyncManager.kt:280)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager.$r8$lambda$HcVMg3PtuvbYvhpqtEeNUSVzbyE(Unknown Source:0)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager$$ExternalSyntheticLambda1.invoke(D8$$SyntheticClass:0)
                                                            	at at.bitfire.davdroid.sync.SyncException$Companion.wrapWithLocalResource(SyncException.kt:22)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager.processVEvent(CalendarSyncManager.kt:270)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager.downloadRemote$lambda$11$lambda$10$lambda$9(CalendarSyncManager.kt:227)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager.$r8$lambda$xBRNK6FZsxb0c35R_GMkb1qDT8A(Unknown Source:0)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager$$ExternalSyntheticLambda5.invoke(D8$$SyntheticClass:0)
                                                            	at at.bitfire.davdroid.sync.SyncException$Companion.wrapWithRemoteResource(SyncException.kt:38)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager.downloadRemote$lambda$11$lambda$10(CalendarSyncManager.kt:211)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager.$r8$lambda$is9u8vJ7VzS62N-UVw4ofat62j4(Unknown Source:0)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager$$ExternalSyntheticLambda0.onResponse(D8$$SyntheticClass:0)
                                                            	at at.bitfire.dav4jvm.Response$Companion.parse(Response.kt:220)
                                                            	at at.bitfire.dav4jvm.DavResource.processMultiStatus$parseMultiStatus(DavResource.kt:774)
                                                            	at at.bitfire.dav4jvm.DavResource.processMultiStatus(DavResource.kt:793)
                                                            	at at.bitfire.dav4jvm.DavResource.processMultiStatus(DavResource.kt:744)
                                                            	at at.bitfire.dav4jvm.DavCalendar.multiget(DavCalendar.kt:181)
                                                            	at at.bitfire.dav4jvm.DavCalendar.multiget$default(DavCalendar.kt:145)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager.downloadRemote$lambda$11(CalendarSyncManager.kt:197)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager.$r8$lambda$3MqIM-UjL7npA99FHS230pOYtbQ(Unknown Source:0)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager$$ExternalSyntheticLambda2.invoke(D8$$SyntheticClass:0)
                                                            	at at.bitfire.davdroid.sync.SyncException$Companion.wrapWithRemoteResource(SyncException.kt:38)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncManager.downloadRemote(CalendarSyncManager.kt:196)
                                                            	at at.bitfire.davdroid.sync.SyncManager$syncRemote$1$download$1.invokeSuspend(SyncManager.kt:602)
                                                            	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
                                                            	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:101)
                                                            	at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:263)
                                                            	at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:95)
                                                            	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:69)
                                                            	at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source:1)
                                                            	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:47)
                                                            	at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source:1)
                                                            	at at.bitfire.davdroid.sync.SyncManager.syncRemote(SyncManager.kt:590)
                                                            	at at.bitfire.davdroid.sync.SyncManager.performSync(SyncManager.kt:227)
                                                            	at at.bitfire.davdroid.sync.CalendarSyncer.syncCollection(CalendarSyncer.kt:68)
19:00:01.985 21634-23329 .sync.SyncManager               E  	at at.bitfire.davdroid.sync.CalendarSyncer.syncCollection(CalendarSyncer.kt:22)
                                                            	at at.bitfire.davdroid.sync.Syncer.syncCollectionContents$davx5_ose_4_4_4_alpha_1_oseDebug(Syncer.kt:208)
                                                            	at at.bitfire.davdroid.sync.Syncer.sync$davx5_ose_4_4_4_alpha_1_oseDebug(Syncer.kt:107)
                                                            	at at.bitfire.davdroid.sync.Syncer.invoke(Syncer.kt:272)
                                                            	at at.bitfire.davdroid.sync.worker.BaseSyncWorker$doSyncWork$2.invokeSuspend$lambda$0(BaseSyncWorker.kt:264)
                                                            	at at.bitfire.davdroid.sync.worker.BaseSyncWorker$doSyncWork$2.$r8$lambda$MnrEU1_WtQZTTPjmMRztfG3Y7fo(Unknown Source:0)
                                                            	at at.bitfire.davdroid.sync.worker.BaseSyncWorker$doSyncWork$2$$ExternalSyntheticLambda0.invoke(D8$$SyntheticClass:0)
                                                            	at kotlinx.coroutines.InterruptibleKt.runInterruptibleInExpectedContext(Interruptible.kt:48)
                                                            	at kotlinx.coroutines.InterruptibleKt.access$runInterruptibleInExpectedContext(Interruptible.kt:1)
                                                            	at kotlinx.coroutines.InterruptibleKt$runInterruptible$2.invokeSuspend(Interruptible.kt:40)
                                                            	at kotlinx.coroutines.InterruptibleKt$runInterruptible$2.invoke(Unknown Source:8)
                                                            	at kotlinx.coroutines.InterruptibleKt$runInterruptible$2.invoke(Unknown Source:4)
                                                            	at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:42)
                                                            	at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:156)
                                                            	at kotlinx.coroutines.BuildersKt.withContext(Unknown Source:1)
                                                            	at kotlinx.coroutines.InterruptibleKt.runInterruptible(Interruptible.kt:39)
                                                            	at kotlinx.coroutines.InterruptibleKt.runInterruptible$default(Interruptible.kt:36)
                                                            	at at.bitfire.davdroid.sync.worker.BaseSyncWorker$doSyncWork$2.invokeSuspend(BaseSyncWorker.kt:263)
                                                            	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
                                                            	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:101)
                                                            	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
                                                            	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
                                                            	at java.lang.Thread.run(Thread.java:1012)
                                                            Caused by: android.os.TransactionTooLargeException: data parcel size 2209168 bytes
                                                            	at android.os.BinderProxy.transactNative(Native Method)
                                                            	at android.os.BinderProxy.transact(BinderProxy.java:586)
                                                            	at android.content.ContentProviderProxy.applyBatch(ContentProviderNative.java:635)
                                                            	at android.content.ContentProviderClient.applyBatch(ContentProviderClient.java:574)
                                                            	at android.content.ContentProviderClient.applyBatch(ContentProviderClient.java:562)
                                                            	at at.bitfire.ical4android.BatchOperation.runBatch(BatchOperation.kt:100)
                                                            	... 65 more

Expected result

The exception should be shown as sync exception / notification.

Further info

No response

@rfc2822 rfc2822 added the bug Something isn't working label Nov 21, 2024
@rfc2822 rfc2822 changed the title TransactionTooLargeException during sync doesn't cause notification anymore TransactionTooLargeException during sync doesn't cause notification Nov 21, 2024
@rfc2822
Copy link
Member Author

rfc2822 commented Nov 21, 2024

Seems the problem occurs because the failed event is put into the "local data" field of the exception notification, and this "local data" is of course also > 1 MB and causes another TransactionTooLargeException.

So showing the notification for TransactionTooLargeException causes another TransactionTooLargeException.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
Status: Done
Development

Successfully merging a pull request may close this issue.

1 participant