Fixed
Status Update
Comments
ra...@google.com <ra...@google.com> #2
Can you please send us a test app which can reproduce this ?
ap...@google.com <ap...@google.com> #3
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 5975b62cd1f3f170bb82e9761efca40e5e5bfb16
Author: Rahul Ravikumar <rahulrav@google.com>
Date: Wed Jul 24 12:24:17 2019
TaskExecutor's background executor is now SerialExecutor.
* This gives us visibility into the number of pending tasks which will
be important in the next CL.
There is a race condition between the SerialExecutor draining its queue
of pending tasks and SystemAlarmDispatcher's onAllCommandsCompleted() callback.
This is because SystemAlarmDispatcher thinks there are no more things to be
done even though there are pending runnables in the SerialExecutor.
This CL makes this information available. In the next CL, CommandHandler
will check for pending runnables in the SerialExecutor queue.
( b/138238197 )
* Fixed TestWorkManagerImpl to use Configuration#getTaskExecutor().
* Updated unit tests.
Test: Updated unit tests.
Change-Id: I5f32f1e1ef2563d4598934aed3b61d62a6d6167c
M work/workmanager-gcm/src/androidTest/java/androidx/work/impl/background/gcm/WorkManagerGcmDispatcherTest.kt
M work/workmanager-ktx/src/androidTest/java/androidx/work/CoroutineWorkerTest.kt
M work/workmanager-rxjava2/src/test/java/androidx/work/RxWorkerTest.kt
M work/workmanager-testing/src/androidTest/java/androidx/work/testing/WorkManagerInitHelperTest.java
M work/workmanager-testing/src/main/java/androidx/work/testing/InstantWorkTaskExecutor.java
M work/workmanager-testing/src/main/java/androidx/work/testing/TestWorkManagerImpl.java
M work/workmanager-testing/src/main/java/androidx/work/testing/WorkManagerTestInitHelper.java
M work/workmanager/src/androidTest/java/androidx/work/impl/utils/taskexecutor/InstantWorkTaskExecutor.java
M work/workmanager/src/main/java/androidx/work/impl/utils/SerialExecutor.java
M work/workmanager/src/main/java/androidx/work/impl/utils/taskexecutor/TaskExecutor.java
M work/workmanager/src/main/java/androidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor.java
https://android-review.googlesource.com/1090749
https://goto.google.com/android-sha1/5975b62cd1f3f170bb82e9761efca40e5e5bfb16
Branch: androidx-master-dev
commit 5975b62cd1f3f170bb82e9761efca40e5e5bfb16
Author: Rahul Ravikumar <rahulrav@google.com>
Date: Wed Jul 24 12:24:17 2019
TaskExecutor's background executor is now SerialExecutor.
* This gives us visibility into the number of pending tasks which will
be important in the next CL.
There is a race condition between the SerialExecutor draining its queue
of pending tasks and SystemAlarmDispatcher's onAllCommandsCompleted() callback.
This is because SystemAlarmDispatcher thinks there are no more things to be
done even though there are pending runnables in the SerialExecutor.
This CL makes this information available. In the next CL, CommandHandler
will check for pending runnables in the SerialExecutor queue.
(
* Fixed TestWorkManagerImpl to use Configuration#getTaskExecutor().
* Updated unit tests.
Test: Updated unit tests.
Change-Id: I5f32f1e1ef2563d4598934aed3b61d62a6d6167c
M work/workmanager-gcm/src/androidTest/java/androidx/work/impl/background/gcm/WorkManagerGcmDispatcherTest.kt
M work/workmanager-ktx/src/androidTest/java/androidx/work/CoroutineWorkerTest.kt
M work/workmanager-rxjava2/src/test/java/androidx/work/RxWorkerTest.kt
M work/workmanager-testing/src/androidTest/java/androidx/work/testing/WorkManagerInitHelperTest.java
M work/workmanager-testing/src/main/java/androidx/work/testing/InstantWorkTaskExecutor.java
M work/workmanager-testing/src/main/java/androidx/work/testing/TestWorkManagerImpl.java
M work/workmanager-testing/src/main/java/androidx/work/testing/WorkManagerTestInitHelper.java
M work/workmanager/src/androidTest/java/androidx/work/impl/utils/taskexecutor/InstantWorkTaskExecutor.java
M work/workmanager/src/main/java/androidx/work/impl/utils/SerialExecutor.java
M work/workmanager/src/main/java/androidx/work/impl/utils/taskexecutor/TaskExecutor.java
M work/workmanager/src/main/java/androidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor.java
ra...@google.com <ra...@google.com> #4
There is a 2nd change that fixes the problem.
ap...@google.com <ap...@google.com> #5
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 7db27318ea09ae3857a7baebe8dd4e6fa9d16fdc
Author: Rahul Ravikumar <rahulrav@google.com>
Date: Wed Jul 24 12:50:34 2019
Ensure SerialExecutor has no more pending tasks.
* We need to ensure this is the case because we might shutdown
SystemAlarmService without actually completing all the tasks.
Test: Existing unit tests pass. Ran integration tests.
Fixes: b/138238197
Change-Id: I72fe2ddb1607995721eae320ce41accad93fee8f
M work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcher.java
M work/workmanager/src/main/java/androidx/work/impl/utils/SerialExecutor.java
https://android-review.googlesource.com/1090758
https://goto.google.com/android-sha1/7db27318ea09ae3857a7baebe8dd4e6fa9d16fdc
Branch: androidx-master-dev
commit 7db27318ea09ae3857a7baebe8dd4e6fa9d16fdc
Author: Rahul Ravikumar <rahulrav@google.com>
Date: Wed Jul 24 12:50:34 2019
Ensure SerialExecutor has no more pending tasks.
* We need to ensure this is the case because we might shutdown
SystemAlarmService without actually completing all the tasks.
Test: Existing unit tests pass. Ran integration tests.
Fixes:
Change-Id: I72fe2ddb1607995721eae320ce41accad93fee8f
M work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcher.java
M work/workmanager/src/main/java/androidx/work/impl/utils/SerialExecutor.java
ro...@gmail.com <ro...@gmail.com> #6
Awesomme! Thanks for the fix
an...@google.com <an...@google.com> #7
The following changes were cherrypicked through Coastguard (https://android-build.googleplex.com/coastguard/ )
Release Track: (https://android-build.googleplex.com/coastguard/dashboard/6206758647365632/#/cherrypickHistory/all )
Created: 2019-07-26 23:31:17.300138+00:00
Changes: aosp/1092373, aosp/1092374
Release Track: (
Created: 2019-07-26 23:31:17.300138+00:00
Changes: aosp/1092373, aosp/1092374
ro...@gmail.com <ro...@gmail.com> #8
Hi,
I used 2.2.0-RC1 and the issue still persists but not as frequent as before.
08-14 11:38:59.141 975-987/ A/PowerManager: WakeLock finalized while still held: WorkManager: bd0a17b6-e87a-4c44-bb7f-6ae195975b36 (2)
08-14 11:39:02.588 975-1102/com.yantranet.signware.agent.staging E/WM-SystemAlarmDispatche: Unexpected error in onHandleIntent
java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask@3b835a4f rejected from java.util.concurrent.ScheduledThreadPoolExecutor@48bb5dc[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2011)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:793)
at java.util.concurrent.ScheduledThreadPoolExecutor.delayedExecute(ScheduledThreadPoolExecutor.java:298)
at java.util.concurrent.ScheduledThreadPoolExecutor.schedule(ScheduledThreadPoolExecutor.java:503)
at java.util.concurrent.Executors$DelegatedScheduledExecutorService.schedule(Executors.java:644)
at androidx.work.impl.background.systemalarm.WorkTimer.startTimer(WorkTimer.java:82)
at androidx.work.impl.background.systemalarm.DelayMetCommandHandler.onAllConstraintsMet(DelayMetCommandHandler.java:135)
at androidx.work.impl.background.systemalarm.DelayMetCommandHandler.handleProcessWork(DelayMetCommandHandler.java:211)
at androidx.work.impl.background.systemalarm.CommandHandler.handleDelayMet(CommandHandler.java:272)
at androidx.work.impl.background.systemalarm.CommandHandler.onHandleIntent(CommandHandler.java:171)
at androidx.work.impl.background.systemalarm.SystemAlarmDispatcher$1.run(SystemAlarmDispatcher.java:276)
at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
08-14 11:39:44.850 975-987/ A/PowerManager: WakeLock finalized while still held: WorkManager: 348bf17e-7aa4-48df-b88e-a2e7e3b5483d (2)
I used 2.2.0-RC1 and the issue still persists but not as frequent as before.
08-14 11:38:59.141 975-987/ A/PowerManager: WakeLock finalized while still held: WorkManager: bd0a17b6-e87a-4c44-bb7f-6ae195975b36 (2)
08-14 11:39:02.588 975-1102/com.yantranet.signware.agent.staging E/WM-SystemAlarmDispatche: Unexpected error in onHandleIntent
java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask@3b835a4f rejected from java.util.concurrent.ScheduledThreadPoolExecutor@48bb5dc[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2011)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:793)
at java.util.concurrent.ScheduledThreadPoolExecutor.delayedExecute(ScheduledThreadPoolExecutor.java:298)
at java.util.concurrent.ScheduledThreadPoolExecutor.schedule(ScheduledThreadPoolExecutor.java:503)
at java.util.concurrent.Executors$DelegatedScheduledExecutorService.schedule(Executors.java:644)
at androidx.work.impl.background.systemalarm.WorkTimer.startTimer(WorkTimer.java:82)
at androidx.work.impl.background.systemalarm.DelayMetCommandHandler.onAllConstraintsMet(DelayMetCommandHandler.java:135)
at androidx.work.impl.background.systemalarm.DelayMetCommandHandler.handleProcessWork(DelayMetCommandHandler.java:211)
at androidx.work.impl.background.systemalarm.CommandHandler.handleDelayMet(CommandHandler.java:272)
at androidx.work.impl.background.systemalarm.CommandHandler.onHandleIntent(CommandHandler.java:171)
at androidx.work.impl.background.systemalarm.SystemAlarmDispatcher$1.run(SystemAlarmDispatcher.java:276)
at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
08-14 11:39:44.850 975-987/ A/PowerManager: WakeLock finalized while still held: WorkManager: 348bf17e-7aa4-48df-b88e-a2e7e3b5483d (2)
su...@google.com <su...@google.com> #9
Can you please give us a sample app that reproduces this problem?
ra...@google.com <ra...@google.com> #10
Also, are you sure the app in question was using the recent version of WM ?
Description
Version used:2.1.0
Devices/Android versions reproduced on:MINIX/Android 5.1.1
If this is a bug in the library, we would appreciate if you could attach:
07-23 15:02:22.508 1042-1127/E/WM-SystemAlarmDispatche: Unexpected error in onHandleIntent
java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask@2713e108 rejected from java.util.concurrent.ScheduledThreadPoolExecutor@63770a1[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2011)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:793)
at java.util.concurrent.ScheduledThreadPoolExecutor.delayedExecute(ScheduledThreadPoolExecutor.java:298)
at java.util.concurrent.ScheduledThreadPoolExecutor.schedule(ScheduledThreadPoolExecutor.java:503)
at java.util.concurrent.Executors$DelegatedScheduledExecutorService.schedule(Executors.java:644)
at androidx.work.impl.background.systemalarm.WorkTimer.startTimer(WorkTimer.java:82)
at androidx.work.impl.background.systemalarm.DelayMetCommandHandler.onAllConstraintsMet(DelayMetCommandHandler.java:135)
at androidx.work.impl.background.systemalarm.DelayMetCommandHandler.handleProcessWork(DelayMetCommandHandler.java:211)
at androidx.work.impl.background.systemalarm.CommandHandler.handleDelayMet(CommandHandler.java:272)
at androidx.work.impl.background.systemalarm.CommandHandler.onHandleIntent(CommandHandler.java:171)
at androidx.work.impl.background.systemalarm.SystemAlarmDispatcher$1.run(SystemAlarmDispatcher.java:272)
at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:75)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
07-23 15:02:22.963 1042-1055/com.yantranet.signware.agent.staging A/PowerManager: WakeLock finalized while still held: WorkManager: 72a8dc67-9b97-430d-9fc9-876f7e7c836c (2)
I need to run work request on-demand for a list of workers. The on-demand request can come in multiple times. So I basically loop the requests and create OneTimeWorkRequest for each Worker. I end up with the Exectuor RejectionException as above.