mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-07-26 05:51:18 +02:00
22151b0988
Stale snapshot (queue wedged forever): the service is START_NOT_STICKY, so a process kill or reboot mid-batch froze the state file at is_running:true with nothing ever rewriting it. Adoption then set isProcessing and polled that flag indefinitely; restored items sat at downloading/queued until the user intervened. Adoption and the reconcile poll now check DownloadService.isServiceRunning() (three consecutive dead polls in the loop), reconcile whatever the worker finished, requeue in-flight items, clear the run id, and hand the batch back to the Dart queue. Adoption gate race (duplicate executors): adoption was gated on _canUseAndroidNativeWorker, which reads extension state that loads asynchronously after startup and settings toggles the user may have flipped mid-run. A background batch surviving task removal was then orphaned while the Dart queue re-downloaded the same items. Adoption now only requires Android; request contexts that cannot be built yet (extensions still loading) are retried on each reconcile poll. Queue replacement race (superseded worker kept running): startNativeWorker only cancelled the coroutine, which cannot interrupt the blocking gomobile call, and it reset the shared cancel flag the old loop checks - so a replaced worker kept downloading its old batch, and its finally block wrote is_running:false over the new run's snapshot and stopSelf'd the service underneath it. Replacement now cancels the old run's Go downloads and FFmpeg work first, and workers carry a generation token: a superseded generation exits at the next checkpoint and skips the final snapshot write and service teardown. An invalid replacement payload no longer stops the service while a run is active.