lespas icon indicating copy to clipboard operation
lespas copied to clipboard

Sync silently fails on java.lang.IllegalStateException: Duplicate key

Open ppittle opened this issue 7 months ago • 1 comments

Describe the bug Sync no longer picks up new changes and silently fails without displaying any message in UI.

Log message:

--------- switch to main
07-28 06:59:22.620 24989 24989 I StorageUtils: /data/user/0/site.leos.apps.lespas/files is writable
07-28 06:59:22.627 24989 24989 I StorageUtils: /storage/emulated/0/Android/data/site.leos.apps.lespas/files is writable
07-28 06:59:22.628 24989 24989 I StorageUtils: /data/user/0/site.leos.apps.lespas/files is writable
07-28 06:59:22.628 24989 24989 I StorageUtils: /storage/emulated/0/Android/data/site.leos.apps.lespas/files is writable
07-28 06:59:22.633 24989 24989 I OsmDroid: Using tile source: Mapnik
07-28 06:59:22.638 24989 24989 I OsmDroid: Tile cache increased from 0 to 9
07-28 06:59:22.702 24989 24989 W View    : requestLayout() improperly called by android.widget.ScrollView{e83d410 VFED..... ......ID 11,11-896,404 #7f0a0062 app:id/background} during layout: running second layout pass
--------- switch to events
07-28 06:59:22.710 24989 24989 I viewroot_draw_event: [window=VRI[MainActivity],event=reportDrawFinished seqId=0]
--------- switch to main
07-28 06:59:22.762 24989 27456 E SyncAdapter: : java.lang.IllegalStateException: Duplicate key PXL_20240715_151327075.jpg (attempted merging values 1619227 and 1619223)
07-28 06:59:22.762 24989 27456 E SyncAdapter: : 	at java.util.stream.Collectors.duplicateKeyException(Collectors.java:135)
07-28 06:59:22.762 24989 27456 E SyncAdapter: : 	at java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Collectors.java:182)
07-28 06:59:22.762 24989 27456 E SyncAdapter: : 	at java.util.stream.Collectors$$ExternalSyntheticLambda1.accept(D8$$SyntheticClass:0)
07-28 06:59:22.762 24989 27456 E SyncAdapter: : 	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
07-28 06:59:22.762 24989 27456 E SyncAdapter: : 	at java.util.Iterator.forEachRemaining(Iterator.java:133)
07-28 06:59:22.762 24989 27456 E SyncAdapter: : 	at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
07-28 06:59:22.762 24989 27456 E SyncAdapter: : 	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
07-28 06:59:22.762 24989 27456 E SyncAdapter: : 	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:503)
07-28 06:59:22.762 24989 27456 E SyncAdapter: : 	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
07-28 06:59:22.762 24989 27456 E SyncAdapter: : 	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:236)
07-28 06:59:22.762 24989 27456 E SyncAdapter: : 	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:706)
07-28 06:59:22.762 24989 27456 E SyncAdapter: : 	at site.leos.apps.lespas.sync.SyncAdapter.syncRemoteChanges(SyncAdapter.kt:1164)
07-28 06:59:22.762 24989 27456 E SyncAdapter: : 	at site.leos.apps.lespas.sync.SyncAdapter.onPerformSync(SyncAdapter.kt:132)
07-28 06:59:22.762 24989 27456 E SyncAdapter: : 	at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:354)
07-28 06:59:22.816 24989 27461 D TrafficStats: tagSocket(204) with statsTag=0xffffffff, statsUid=-1
--------- switch to events
07-28 06:59:23.054 24989 25656 I jank_cuj_events_end_request: [CUJ Type=81,Unix Time Ns=1722149963053742s,Elapsed Time Ns=51988372768.729s,Uptime Time Ns=23310079925.728s]
--------- switch to main
07-28 06:59:24.174 24989 24989 W WindowOnBackDispatcher: sendCancelIfRunning: isInProgress=falsecallback=android.app.Dialog$$ExternalSyntheticLambda2@ced603f
07-28 06:59:24.182 24989 25019 D HWUI    : endAllActiveAnimators on 0xcdc0002ea200 (RippleDrawable) with handle 0xcc8afe167d20
07-28 06:59:24.596 24989 27461 E SyncAdapter: : java.lang.IllegalStateException: Duplicate key PXL_20240715_151327075.jpg (attempted merging values 1619227 and 1619223)
07-28 06:59:24.596 24989 27461 E SyncAdapter: : 	at java.util.stream.Collectors.duplicateKeyException(Collectors.java:135)
07-28 06:59:24.596 24989 27461 E SyncAdapter: : 	at java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Collectors.java:182)
07-28 06:59:24.596 24989 27461 E SyncAdapter: : 	at java.util.stream.Collectors$$ExternalSyntheticLambda1.accept(D8$$SyntheticClass:0)
07-28 06:59:24.596 24989 27461 E SyncAdapter: : 	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
07-28 06:59:24.596 24989 27461 E SyncAdapter: : 	at java.util.Iterator.forEachRemaining(Iterator.java:133)
07-28 06:59:24.596 24989 27461 E SyncAdapter: : 	at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
07-28 06:59:24.596 24989 27461 E SyncAdapter: : 	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
07-28 06:59:24.596 24989 27461 E SyncAdapter: : 	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:503)
07-28 06:59:24.596 24989 27461 E SyncAdapter: : 	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
07-28 06:59:24.596 24989 27461 E SyncAdapter: : 	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:236)
07-28 06:59:24.596 24989 27461 E SyncAdapter: : 	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:706)
07-28 06:59:24.596 24989 27461 E SyncAdapter: : 	at site.leos.apps.lespas.sync.SyncAdapter.syncRemoteChanges(SyncAdapter.kt:1164)
07-28 06:59:24.596 24989 27461 E SyncAdapter: : 	at site.leos.apps.lespas.sync.SyncAdapter.onPerformSync(SyncAdapter.kt:132)
07-28 06:59:24.596 24989 27461 E SyncAdapter: : 	at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:354)
07-28 06:59:24.686 24989 27462 D TrafficStats: tagSocket(213) with statsTag=0xffffffff, statsUid=-1

To Reproduce I'm unsure how I ended up with 2 photos with what appears to be the same name. In the LesPas client, I deleted both files, and then sync resumed. I also saw the file was in Nextcloud twice, but with different file names.

Expected behavior

  1. Ideally, root cause (duplicate file names) shouldn't be possible - but that's an issue for another day.
  2. If sync 1 file fails, the sync process should continue syncing other files. 1 bad file shouldn't not take down the entire syncing process.
  3. If sync fails - there should be a notification indicating which file failed and ideally options to fix it (or instructions to fix it).

Screenshots n/a

Smartphone (please complete the following information):

  • Device: Pixel 8
  • OS: GrapheneOS (Android 14)
  • Version 20240716

Additional context See logs above.

ppittle avatar Jul 28 '24 07:07 ppittle