summaryrefslogtreecommitdiff
path: root/java/com/android/voicemail/impl/transcribe/TranscriptionService.java
diff options
context:
space:
mode:
authormdooley <mdooley@google.com>2017-09-05 12:48:03 -0700
committerEric Erfanian <erfanian@google.com>2017-09-11 10:57:47 -0700
commit9abbf7ff9b31dd3420fd2b304b63703b87d843f6 (patch)
treee69118e3b35ea6407d96ad4db3e6686efcc64ca8 /java/com/android/voicemail/impl/transcribe/TranscriptionService.java
parent2928203107c971ff8129f57addddb6b8fa19e065 (diff)
Fixing transcription crashes caused by job stoppage
Apparently, scheduling a new job when one is already running (even using the enqueue api) causes the running job to be stopped. We weren't handling that case correctly. This cl makes sure no more work is attempted after a job is stopped by cancelling any active transcription task. We request that stopped task be rescheduled by the job scheduler, so it will get run eventually. I was able to verify this fix by sending a new voicemail while backfill old transcription tasks were running. Bug: 64908823,63524274,65129734,63803709 Test: manual and unit tests PiperOrigin-RevId: 167617191 Change-Id: Icc92997c2687e61bef9b3b7f9ff572da2cb4ed2e
Diffstat (limited to 'java/com/android/voicemail/impl/transcribe/TranscriptionService.java')
-rw-r--r--java/com/android/voicemail/impl/transcribe/TranscriptionService.java30
1 files changed, 24 insertions, 6 deletions
diff --git a/java/com/android/voicemail/impl/transcribe/TranscriptionService.java b/java/com/android/voicemail/impl/transcribe/TranscriptionService.java
index 2ca16fbf2..b733928d7 100644
--- a/java/com/android/voicemail/impl/transcribe/TranscriptionService.java
+++ b/java/com/android/voicemail/impl/transcribe/TranscriptionService.java
@@ -49,6 +49,8 @@ public class TranscriptionService extends JobService {
private JobParameters jobParameters;
private TranscriptionClientFactory clientFactory;
private TranscriptionConfigProvider configProvider;
+ private TranscriptionTask activeTask;
+ private boolean stopped;
/** Callback used by a task to indicate it has finished processing its work item */
interface JobCallback {
@@ -134,8 +136,14 @@ public class TranscriptionService extends JobService {
@MainThread
public boolean onStopJob(JobParameters params) {
Assert.isMainThread();
- LogUtil.enterBlock("TranscriptionService.onStopJob");
- cleanup();
+ LogUtil.i("TranscriptionService.onStopJob", "params: " + params);
+ stopped = true;
+ Logger.get(this).logImpression(DialerImpression.Type.VVM_TRANSCRIPTION_JOB_STOPPED);
+ if (activeTask != null) {
+ LogUtil.i("TranscriptionService.onStopJob", "cancelling active task");
+ activeTask.cancel();
+ Logger.get(this).logImpression(DialerImpression.Type.VVM_TRANSCRIPTION_TASK_CANCELLED);
+ }
return true;
}
@@ -161,15 +169,20 @@ public class TranscriptionService extends JobService {
@MainThread
private boolean checkForWork() {
Assert.isMainThread();
+ if (stopped) {
+ LogUtil.i("TranscriptionService.checkForWork", "stopped");
+ return false;
+ }
JobWorkItem workItem = jobParameters.dequeueWork();
if (workItem != null) {
- TranscriptionTask task =
+ Assert.checkState(activeTask == null);
+ activeTask =
configProvider.shouldUseSyncApi()
? new TranscriptionTaskSync(
this, new Callback(), workItem, getClientFactory(), configProvider)
: new TranscriptionTaskAsync(
this, new Callback(), workItem, getClientFactory(), configProvider);
- getExecutorService().execute(task);
+ getExecutorService().execute(activeTask);
return true;
} else {
return false;
@@ -196,8 +209,13 @@ public class TranscriptionService extends JobService {
public void onWorkCompleted(JobWorkItem completedWorkItem) {
Assert.isMainThread();
LogUtil.i("TranscriptionService.Callback.onWorkCompleted", completedWorkItem.toString());
- jobParameters.completeWork(completedWorkItem);
- checkForWork();
+ activeTask = null;
+ if (stopped) {
+ LogUtil.i("TranscriptionService.Callback.onWorkCompleted", "stopped");
+ } else {
+ jobParameters.completeWork(completedWorkItem);
+ checkForWork();
+ }
}
}