Skip to content

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

Description

@ppittle

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions