Skip to content

Conversation

sonalyadav1
Copy link
Contributor

Description (required)

Fixes #6351

What changes did you make and why?

This PR addresses the issue of nearby uploads failing when network connections are temporarily lost during the upload process. The key improvements include:

1)Detecting when an image has already been successfully uploaded to Commons but failed during Wikidata P18 property linking.
2)Preserving the Commons filename for retry scenarios to prevent duplicate uploads.
3)Skipping redundant Commons re-uploads for images that already exist on the server.
4)Adding robust error handling to ensure proper retry behaviour for both manual and automatic retries.

Tests performed (required)

Tested {build variant, ProdDebug} on {VIVO V25} with API level {35}.

Need help? See https://support.google.com/android/answer/9075928


Note: Please ensure that you have read CONTRIBUTING.md if this is your first pull request.

…ds to Commons while preserving Wikidata P18 linking with added testing functionality.
@nicolas-raoul
Copy link
Member

I just got a crash, I also sent you the stack via email. Steps:

  1. Start Nearby upload (pic of the actual item, taken from a few meters away)
  2. During the 10-seconds wait, cut the internet
  3. Wikidata linking fails
  4. Close the app
  5. Connect to the internet
  6. Start the app
  7. Crash
STACK_TRACE=java.lang.SecurityException: Calling uid ( 10452 ) does not have permission to access picker uri: content://media/picker_get_content/0/com.android.providers.media.photopicker/media/9731
at android.os.Parcel.createExceptionOrNull(Parcel.java:3355)
at android.os.Parcel.createException(Parcel.java:3339)
at android.os.Parcel.readException(Parcel.java:3322)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:201)
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:164)
at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:814)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:2045)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1860)
at android.content.ContentResolver.openInputStream(ContentResolver.java:1530)
at fr.free.nrw.commons.upload.ImageProcessingService.checkIfFileAlreadyExists(ImageProcessingService.kt:132)
at fr.free.nrw.commons.upload.UploadModel.checkDuplicateImage(UploadModel.kt:108)
at fr.free.nrw.commons.repository.UploadRepository.checkDuplicateImage(UploadRepository.kt:209)
at fr.free.nrw.commons.upload.PendingUploadsPresenter.restartUploads(PendingUploadsPresenter.kt:155)
at fr.free.nrw.commons.upload.FailedUploadsFragment.restartUploads(FailedUploadsFragment.kt:128)
at fr.free.nrw.commons.upload.UploadProgressActivity.updateMenuItems$lambda$3(UploadProgressActivity.kt:162)
at fr.free.nrw.commons.upload.UploadProgressActivity.$r8$lambda$iCAg9AAXidLi3lKyFRzd3AuVXPg(Unknown Source:0)
at fr.free.nrw.commons.upload.UploadProgressActivity$$ExternalSyntheticLambda4.onMenuItemClick(D8$$SyntheticClass:0)
at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:155)
at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:987)
at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:977)
at androidx.appcompat.widget.ActionMenuView.invokeItem(ActionMenuView.java:625)
at androidx.appcompat.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:156)
at android.view.View.performClick(View.java:8228)
at android.view.View.performClickInternal(View.java:8205)
at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
at android.view.View$PerformClick.run(View.java:31785)
at android.os.Handler.handleCallback(Handler.java:1041)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.dispatchMessage(Looper.java:315)
at android.os.Looper.loopOnce(Looper.java:251)
at android.os.Looper.loop(Looper.java:349)
at android.app.ActivityThread.main(ActivityThread.java:9041)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:929)

@sonalyadav1 sonalyadav1 marked this pull request as draft August 16, 2025 13:09
@RitikaPahwa4444
Copy link
Collaborator

Sorry, fixed the SecurityException for multi-uploads in this PR: #6402. Quick question, @nicolas-raoul, are you using the secure photo picker of Android or the document based picker?

@RitikaPahwa4444
Copy link
Collaborator

Please ignore the crash as it's beyond the scope of the issue you're handling and it's a separate issue altogether, @sonalyadav1. While it's good to have a defensive approach by adding the try-catch logic, the upload would have never restarted without taking the persistable permission or asking the user to upload again 😅

@nicolas-raoul
Copy link
Member

@sonalyadav1 Would you mind pulling Ritika's PR #6402 into your branch here? Thanks! :-)

@RitikaPahwa4444 I have Use document based photo picker disabled, which I believe is the default.

Copy link

✅ Generated APK variants!

@nicolas-raoul
Copy link
Member

With this commit:

  • I performed a dozen multi-uploads, all successful.
  • I performed 3 Nearby uploads (cutting the internet towards the end of the upload), 1 failed and is stuck in "Pending". When I retry it manually, it fails again after a second. I will post a logcat.

@nicolas-raoul
Copy link
Member

Sorry for the delay, below is what logcat when manually retrying.
Still on the latest commit in this branch.
京急大津駅.jpg is the file I uploaded from Nearby, that failed in poor network conditions (by the way it happened even though I had ENABLE_TESTING_DELAY = false), and that stays stuck in "Failed" even when manually retrying.

08-20 11:07:08.588  4293  4442 I FileUtils: File SHA1: 1020b69a2e68b8dfaba392ec19b8cc8d02d8fc9f
08-20 11:07:08.591  4293  4442 I okhttp.OkHttpClient: --> GET https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2&list=allimages&aisha1=1020b69a2e68b8dfaba392ec19b8cc8d02d8fc9f
08-20 11:07:08.594  4293  4340 I FileUtils: File SHA1: f7d51687af574d8f918dc6e216aa557918a09130
08-20 11:07:08.597  4293  4340 I okhttp.OkHttpClient: --> GET https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2&list=allimages&aisha1=f7d51687af574d8f918dc6e216aa557918a09130
08-20 11:07:09.036  4293  4442 I okhttp.OkHttpClient: <-- 200 https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2&list=allimages&aisha1=1020b69a2e68b8dfaba392ec19b8cc8d02d8fc9f (444ms, unknown-length body)
08-20 11:07:09.039  4293  4442 D ImageProcessingService$checkDuplicateImage: Result for duplicate image false
08-20 11:07:09.590  4293  4340 I okhttp.OkHttpClient: <-- 200 https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2&list=allimages&aisha1=f7d51687af574d8f918dc6e216aa557918a09130 (992ms, unknown-length body)
08-20 11:07:09.593  4293  4340 D ImageProcessingService$checkDuplicateImage: Result for duplicate image false
08-20 11:07:09.601  4293  4342 E WorkRequestHelper$Companion: Setting isUploadWorkerRunning to true
08-20 11:07:09.616  4293  4315 W JobInfo : Requested important-while-foreground flag for job144 is ignored and takes no effect
08-20 11:07:09.656  4293  4341 I WM-Processor: Moving WorkSpec (b56600c7-df0b-4d30-9a6f-92748fa5c934) to the foreground
08-20 11:07:09.665  4293  4293 I WM-SystemFgDispatcher: Started foreground service Intent { act=ACTION_START_FOREGROUND xflg=0x4 cmp=fr.free.nrw.commons/androidx.work.impl.foreground.SystemForegroundService (has extras) }
08-20 11:07:09.696  4293  4767 D UploadWorker: Nearby upload retry detected - filename already exists: 京急大津駅.jpg
08-20 11:07:09.696  4293  4767 D UploadWorker: Skipping Commons upload, proceeding directly to Wikidata P18 linking
08-20 11:07:09.697  4293  4767 D UploadWorker: Retry: Directly attempting Wikidata P18 linking with existing filename
08-20 11:07:09.704  4293  4293 D WikidataEditService: Wikidata edit skipped for entity WikidataPlace(id=Q124291063, name=JR East Shibuya Station, imageValue=https://commons.wikimedia.org/wiki/File:Kanagawa_Dental_University.jpg, wikipediaArticle=, location=lat/lng: (35.657954,139.701742), isMonumentUpload=false) because P18 already exists
08-20 11:07:09.706  4293  4767 I okhttp.OkHttpClient: --> GET https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2&clprop=hidden&prop=categories|imageinfo&iiprop=url|extmetadata|user&&iiurlheight=450&iiextmetadatafilter=DateTime|GPSLatitude|GPSLongitude|ImageDescription|DateTimeOriginal|Artist|LicenseShortName|LicenseUrl&titles=File%3A%E4%BA%AC%E6%80%A5%E5%A4%A7%E6%B4%A5%E9%A7%85.jpg
08-20 11:07:10.307  4293  4767 I okhttp.OkHttpClient: <-- 200 https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2&clprop=hidden&prop=categories|imageinfo&iiprop=url|extmetadata|user&&iiurlheight=450&iiextmetadatafilter=DateTime|GPSLatitude|GPSLongitude|ImageDescription|DateTimeOriginal|Artist|LicenseShortName|LicenseUrl&titles=File%3A%E4%BA%AC%E6%80%A5%E5%A4%A7%E6%B4%A5%E9%A7%85.jpg (600ms, unknown-length body)
08-20 11:07:10.310  4293  4767 I okhttp.OkHttpClient: --> GET https://commons.wikimedia.org/w/api.php?format=json&action=wbgetentities&props=labels&languagefallback=1&ids=M0
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: java.io.IOException: {"error":{"code":"no-such-entity","info":"Could not find an entity with the ID \"M0\".","id":"M0","messages":[{"name":"wikibase-api-no-such-entity","parameters":["M0"],"html":{"*":"Could not find an entity with the ID \"M0\"."}}],"*":"See https://commons.wikimedia.org/w/api.php for API usage. Subscribe to the mediawiki-api-announce mailing list at &lt;https://lists.wikimedia.org/postorius/lists/mediawiki-api-announce.lists.wikimedia.org/&gt; for notice of API deprecations and breaking changes."},"servedby":"mw-api-ext.codfw.main-586d8ffb59-bkf2h"}
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at fr.free.nrw.commons.UnsuccessfulResponseInterceptor.intercept(OkHttpConnectionFactory.kt:89)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.kt:221)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at okhttp3.internal.connection.RealCall.execute(RealCall.kt:154)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at retrofit2.OkHttpCall.execute(OkHttpCall.java:190)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:45)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.Observable.subscribe(Observable.java:12267)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.Observable.subscribe(Observable.java:12267)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.internal.operators.observable.ObservableSingleSingle.subscribeActual(ObservableSingleSingle.java:35)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.internal.operators.single.SingleMap.subscribeActual(SingleMap.java:34)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.internal.operators.single.SingleFlatMap$SingleFlatMapCallback.onSuccess(SingleFlatMap.java:84)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.internal.operators.single.SingleMap$MapSingleObserver.onSuccess(SingleMap.java:64)
08-20 11:07:11.276  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.internal.operators.observable.ObservableSingleSingle$SingleElementObserver.onComplete(ObservableSingleSingle.java:109)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onComplete(BodyObservable.java:66)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:51)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.Observable.subscribe(Observable.java:12267)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.Observable.subscribe(Observable.java:12267)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.internal.operators.observable.ObservableSingleSingle.subscribeActual(ObservableSingleSingle.java:35)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.internal.operators.single.SingleMap.subscribeActual(SingleMap.java:34)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.internal.operators.single.SingleFlatMap.subscribeActual(SingleFlatMap.java:36)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.internal.operators.single.SingleMap.subscribeActual(SingleMap.java:34)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.internal.operators.single.SingleMap.subscribeActual(SingleMap.java:34)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at io.reactivex.Single.blockingGet(Single.java:2834)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at fr.free.nrw.commons.upload.worker.UploadWorker.saveCompletedContribution(UploadWorker.kt:607)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at fr.free.nrw.commons.upload.worker.UploadWorker.makeWikiDataEdit(UploadWorker.kt:596)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at fr.free.nrw.commons.upload.worker.UploadWorker.access$makeWikiDataEdit(UploadWorker.kt:57)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at fr.free.nrw.commons.upload.worker.UploadWorker$makeWikiDataEdit$1.invokeSuspend(Unknown Source:21)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:111)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:99)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:585)
08-20 11:07:11.277  4293  4767 E UnsuccessfulResponseInterceptor: 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:802)
08-20 11:07:11.278  4293  4767 E UnsuccessfulResponseInterceptor: 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:706)
08-20 11:07:11.278  4293  4767 E UnsuccessfulResponseInterceptor: 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:693)
08-20 11:07:11.278  4293  4767 I okhttp.OkHttpClient: <-- 200 https://commons.wikimedia.org/w/api.php?format=json&action=wbgetentities&props=labels&languagefallback=1&ids=M0 (967ms, unknown-length body)
08-20 11:07:11.280  4293  4767 E UploadWorker: Retry: Wikidata P18 linking failed
08-20 11:07:11.280  4293  4767 E UploadWorker: java.lang.IllegalStateException: closed
08-20 11:07:11.280  4293  4767 E UploadWorker: 	at okio.RealBufferedSource.read(RealBufferedSource.kt:185)
08-20 11:07:11.280  4293  4767 E UploadWorker: 	at okio.ForwardingSource.read(ForwardingSource.kt:29)
08-20 11:07:11.280  4293  4767 E UploadWorker: 	at retrofit2.OkHttpCall$ExceptionCatchingResponseBody$1.read(OkHttpCall.java:290)
08-20 11:07:11.280  4293  4767 E UploadWorker: 	at okio.RealBufferedSource.select(RealBufferedSource.kt:229)
08-20 11:07:11.280  4293  4767 E UploadWorker: 	at okhttp3.internal.Util.readBomAsCharset(Util.kt:265)
08-20 11:07:11.280  4293  4767 E UploadWorker: 	at okhttp3.ResponseBody$BomAwareReader.read(ResponseBody.kt:208)
08-20 11:07:11.280  4293  4767 E UploadWorker: 	at com.google.gson.stream.JsonReader.fillBuffer(JsonReader.java:1291)
08-20 11:07:11.280  4293  4767 E UploadWorker: 	at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1329)
08-20 11:07:11.280  4293  4767 E UploadWorker: 	at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:550)
08-20 11:07:11.280  4293  4767 E UploadWorker: 	at com.google.gson.stream.JsonReader.peek(JsonReader.java:426)
08-20 11:07:11.280  4293  4767 E UploadWorker: 	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:207)
08-20 11:07:11.280  4293  4767 E UploadWorker: 	at fr.free.nrw.commons.wikidata.json.PostProcessingTypeAdapter$create$1.read(PostProcessingTypeAdapter.kt:27)
08-20 11:07:11.281  4293  4767 E UploadWorker: 	at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:39)
08-20 11:07:11.281  4293  4767 E UploadWorker: 	at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
08-20 11:07:11.281  4293  4767 E UploadWorker: 	at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:227)
08-20 11:07:11.281  4293  4767 E UploadWorker: 	at retrofit2.OkHttpCall.execute(OkHttpCall.java:190)
08-20 11:07:11.281  4293  4767 E UploadWorker: 	at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:45)
08-20 11:07:11.281  4293  4767 E UploadWorker: 	at io.reactivex.Observable.subscribe(Observable.java:12267)
08-20 11:07:11.281  4293  4767 E UploadWorker: 	at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
08-20 11:07:11.281  4293  4767 E UploadWorker: 	at io.reactivex.Observable.subscribe(Observable.java:12267)
08-20 11:07:11.281  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.observable.ObservableSingleSingle.subscribeActual(ObservableSingleSingle.java:35)
08-20 11:07:11.281  4293  4767 E UploadWorker: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.281  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.single.SingleMap.subscribeActual(SingleMap.java:34)
08-20 11:07:11.281  4293  4767 E UploadWorker: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.281  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.single.SingleFlatMap$SingleFlatMapCallback.onSuccess(SingleFlatMap.java:84)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.single.SingleMap$MapSingleObserver.onSuccess(SingleMap.java:64)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.observable.ObservableSingleSingle$SingleElementObserver.onComplete(ObservableSingleSingle.java:109)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onComplete(BodyObservable.java:66)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:51)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at io.reactivex.Observable.subscribe(Observable.java:12267)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at io.reactivex.Observable.subscribe(Observable.java:12267)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.observable.ObservableSingleSingle.subscribeActual(ObservableSingleSingle.java:35)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.single.SingleMap.subscribeActual(SingleMap.java:34)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.single.SingleFlatMap.subscribeActual(SingleFlatMap.java:36)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.single.SingleMap.subscribeActual(SingleMap.java:34)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.single.SingleMap.subscribeActual(SingleMap.java:34)
08-20 11:07:11.282  4293  4767 E UploadWorker: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.283  4293  4767 E UploadWorker: 	at io.reactivex.Single.blockingGet(Single.java:2834)
08-20 11:07:11.283  4293  4767 E UploadWorker: 	at fr.free.nrw.commons.upload.worker.UploadWorker.saveCompletedContribution(UploadWorker.kt:607)
08-20 11:07:11.283  4293  4767 E UploadWorker: 	at fr.free.nrw.commons.upload.worker.UploadWorker.makeWikiDataEdit(UploadWorker.kt:596)
08-20 11:07:11.283  4293  4767 E UploadWorker: 	at fr.free.nrw.commons.upload.worker.UploadWorker.access$makeWikiDataEdit(UploadWorker.kt:57)
08-20 11:07:11.283  4293  4767 E UploadWorker: 	at fr.free.nrw.commons.upload.worker.UploadWorker$makeWikiDataEdit$1.invokeSuspend(Unknown Source:21)
08-20 11:07:11.283  4293  4767 E UploadWorker: 	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
08-20 11:07:11.283  4293  4767 E UploadWorker: 	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
08-20 11:07:11.283  4293  4767 E UploadWorker: 	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:111)
08-20 11:07:11.283  4293  4767 E UploadWorker: 	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:99)
08-20 11:07:11.283  4293  4767 E UploadWorker: 	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:585)
08-20 11:07:11.283  4293  4767 E UploadWorker: 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:802)
08-20 11:07:11.283  4293  4767 E UploadWorker: 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:706)
08-20 11:07:11.283  4293  4767 E UploadWorker: 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:693)
08-20 11:07:11.299  4293  4767 E UploadWorker: java.lang.IllegalStateException: closed
08-20 11:07:11.299  4293  4767 E UploadWorker: 	at okio.RealBufferedSource.read(RealBufferedSource.kt:185)
08-20 11:07:11.299  4293  4767 E UploadWorker: 	at okio.ForwardingSource.read(ForwardingSource.kt:29)
08-20 11:07:11.299  4293  4767 E UploadWorker: 	at retrofit2.OkHttpCall$ExceptionCatchingResponseBody$1.read(OkHttpCall.java:290)
08-20 11:07:11.299  4293  4767 E UploadWorker: 	at okio.RealBufferedSource.select(RealBufferedSource.kt:229)
08-20 11:07:11.299  4293  4767 E UploadWorker: 	at okhttp3.internal.Util.readBomAsCharset(Util.kt:265)
08-20 11:07:11.299  4293  4767 E UploadWorker: 	at okhttp3.ResponseBody$BomAwareReader.read(ResponseBody.kt:208)
08-20 11:07:11.299  4293  4767 E UploadWorker: 	at com.google.gson.stream.JsonReader.fillBuffer(JsonReader.java:1291)
08-20 11:07:11.300  4293  4767 E UploadWorker: 	at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1329)
08-20 11:07:11.300  4293  4767 E UploadWorker: 	at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:550)
08-20 11:07:11.300  4293  4767 E UploadWorker: 	at com.google.gson.stream.JsonReader.peek(JsonReader.java:426)
08-20 11:07:11.300  4293  4767 E UploadWorker: 	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:207)
08-20 11:07:11.300  4293  4767 E UploadWorker: 	at fr.free.nrw.commons.wikidata.json.PostProcessingTypeAdapter$create$1.read(PostProcessingTypeAdapter.kt:27)
08-20 11:07:11.300  4293  4767 E UploadWorker: 	at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:39)
08-20 11:07:11.300  4293  4767 E UploadWorker: 	at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
08-20 11:07:11.300  4293  4767 E UploadWorker: 	at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:227)
08-20 11:07:11.300  4293  4767 E UploadWorker: 	at retrofit2.OkHttpCall.execute(OkHttpCall.java:190)
08-20 11:07:11.300  4293  4767 E UploadWorker: 	at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:45)
08-20 11:07:11.301  4293  4767 E UploadWorker: 	at io.reactivex.Observable.subscribe(Observable.java:12267)
08-20 11:07:11.301  4293  4767 E UploadWorker: 	at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
08-20 11:07:11.301  4293  4767 E UploadWorker: 	at io.reactivex.Observable.subscribe(Observable.java:12267)
08-20 11:07:11.301  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.observable.ObservableSingleSingle.subscribeActual(ObservableSingleSingle.java:35)
08-20 11:07:11.301  4293  4767 E UploadWorker: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.301  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.single.SingleMap.subscribeActual(SingleMap.java:34)
08-20 11:07:11.301  4293  4767 E UploadWorker: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.301  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.single.SingleFlatMap$SingleFlatMapCallback.onSuccess(SingleFlatMap.java:84)
08-20 11:07:11.301  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.single.SingleMap$MapSingleObserver.onSuccess(SingleMap.java:64)
08-20 11:07:11.301  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.observable.ObservableSingleSingle$SingleElementObserver.onComplete(ObservableSingleSingle.java:109)
08-20 11:07:11.301  4293  4767 E UploadWorker: 	at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onComplete(BodyObservable.java:66)
08-20 11:07:11.301  4293  4767 E UploadWorker: 	at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:51)
08-20 11:07:11.302  4293  4767 E UploadWorker: 	at io.reactivex.Observable.subscribe(Observable.java:12267)
08-20 11:07:11.302  4293  4767 E UploadWorker: 	at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
08-20 11:07:11.302  4293  4767 E UploadWorker: 	at io.reactivex.Observable.subscribe(Observable.java:12267)
08-20 11:07:11.302  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.observable.ObservableSingleSingle.subscribeActual(ObservableSingleSingle.java:35)
08-20 11:07:11.302  4293  4767 E UploadWorker: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.302  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.single.SingleMap.subscribeActual(SingleMap.java:34)
08-20 11:07:11.302  4293  4767 E UploadWorker: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.302  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.single.SingleFlatMap.subscribeActual(SingleFlatMap.java:36)
08-20 11:07:11.302  4293  4767 E UploadWorker: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.302  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.single.SingleMap.subscribeActual(SingleMap.java:34)
08-20 11:07:11.302  4293  4767 E UploadWorker: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.303  4293  4767 E UploadWorker: 	at io.reactivex.internal.operators.single.SingleMap.subscribeActual(SingleMap.java:34)
08-20 11:07:11.303  4293  4767 E UploadWorker: 	at io.reactivex.Single.subscribe(Single.java:3603)
08-20 11:07:11.303  4293  4767 E UploadWorker: 	at io.reactivex.Single.blockingGet(Single.java:2834)
08-20 11:07:11.303  4293  4767 E UploadWorker: 	at fr.free.nrw.commons.upload.worker.UploadWorker.saveCompletedContribution(UploadWorker.kt:607)
08-20 11:07:11.303  4293  4767 E UploadWorker: 	at fr.free.nrw.commons.upload.worker.UploadWorker.makeWikiDataEdit(UploadWorker.kt:596)
08-20 11:07:11.303  4293  4767 E UploadWorker: 	at fr.free.nrw.commons.upload.worker.UploadWorker.access$makeWikiDataEdit(UploadWorker.kt:57)
08-20 11:07:11.303  4293  4767 E UploadWorker: 	at fr.free.nrw.commons.upload.worker.UploadWorker$makeWikiDataEdit$1.invokeSuspend(Unknown Source:21)
08-20 11:07:11.303  4293  4767 E UploadWorker: 	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
08-20 11:07:11.303  4293  4767 E UploadWorker: 	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
08-20 11:07:11.303  4293  4767 E UploadWorker: 	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:111)
08-20 11:07:11.303  4293  4767 E UploadWorker: 	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:99)
08-20 11:07:11.303  4293  4767 E UploadWorker: 	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:585)
08-20 11:07:11.303  4293  4767 E UploadWorker: 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:802)
08-20 11:07:11.303  4293  4767 E UploadWorker: 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:706)
08-20 11:07:11.304  4293  4767 E UploadWorker: 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:693)
08-20 11:07:11.304  4293  4767 E UploadWorker: Stash upload failed for contribution: 京急大津駅.jpg
08-20 11:07:11.321  4293  4315 I WM-WorkerWrapper: Worker result SUCCESS for Work [ id=b56600c7-df0b-4d30-9a6f-92748fa5c934, tags={ fr.free.nrw.commons.upload.worker.UploadWorker } ]
08-20 11:07:11.351  4293  4293 I WM-SystemFgDispatcher: Stopping foreground service

I see Wikidata edit skipped [...] because P18 already exists then Could not find an entity with the ID \"M0\", that might be the issue? I forgot to say that I was adding the picture to an already green Nearby pin, that may be a condition for the bug to happen.
It is good that the app skips P18 modification when the Wikidata item already has a P18. But it should not get an exception afterwards. Would you mind checking why the app calls https://commons.wikimedia.org/w/api.php?format=json&action=wbgetentities&props=labels&languagefallback=1&ids=[...], and why the value is M0 in that case?
Feel free to add more logging.

By the way, would you mind rebasing?
Thanks a lot! :-)

@nicolas-raoul
Copy link
Member

Did you get a chance to check? Any further findings? :-)

@sonalyadav1
Copy link
Contributor Author

Did you get a chance to check? Any further findings? :-)

Yes, I’ve checked. I’m working on the fix now and will push it tonight.

@nicolas-raoul
Copy link
Member

Fantastic! :-)

@nicolas-raoul
Copy link
Member

Thanks for fixing!

I noticed another thing: when there is no internet during the p18 edit, so the p18 edit retries and seemingly succeeds, in the end the wikidata item does not have the p18.
I sent you a screencast via email, it happened each time I tried.

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 this pull request may close these issues.

Nearby upload often fails ("Failed", "closed")
3 participants