From c3eb0ea9db42b8ac25263c9b0ab283efc3bf20ae Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Tue, 21 Oct 2014 13:50:38 -0700 Subject: [PATCH] Check job requirements are satisfied in between retry iterations. // FREEBIE --- .../java/org/whispersystems/jobqueue/Job.java | 9 +++++ .../whispersystems/jobqueue/JobConsumer.java | 36 +++++++++++++------ 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/jobqueue/src/main/java/org/whispersystems/jobqueue/Job.java b/jobqueue/src/main/java/org/whispersystems/jobqueue/Job.java index 3a38759225..202f95c993 100644 --- a/jobqueue/src/main/java/org/whispersystems/jobqueue/Job.java +++ b/jobqueue/src/main/java/org/whispersystems/jobqueue/Job.java @@ -26,6 +26,7 @@ public abstract class Job implements Serializable { private final JobParameters parameters; private transient long persistentId; + private transient int runIteration; public Job(JobParameters parameters) { this.parameters = parameters; @@ -71,6 +72,14 @@ public abstract class Job implements Serializable { return persistentId; } + public int getRunIteration() { + return runIteration; + } + + public void setRunIteration(int runIteration) { + this.runIteration = runIteration; + } + public abstract void onAdded(); public abstract void onRun() throws Throwable; public abstract void onCanceled(); diff --git a/jobqueue/src/main/java/org/whispersystems/jobqueue/JobConsumer.java b/jobqueue/src/main/java/org/whispersystems/jobqueue/JobConsumer.java index 773a7a874e..4419dc62e3 100644 --- a/jobqueue/src/main/java/org/whispersystems/jobqueue/JobConsumer.java +++ b/jobqueue/src/main/java/org/whispersystems/jobqueue/JobConsumer.java @@ -20,6 +20,12 @@ import org.whispersystems.jobqueue.persistence.PersistentStorage; public class JobConsumer extends Thread { + enum JobResult { + SUCCESS, + FAILURE, + DEFERRED + } + private final JobQueue jobQueue; private final PersistentStorage persistentStorage; @@ -34,12 +40,16 @@ public class JobConsumer extends Thread { while (true) { Job job = jobQueue.getNext(); - if (!runJob(job)) { - job.onCanceled(); - } + JobResult result; - if (job.isPersistent()) { - persistentStorage.remove(job.getPersistentId()); + if ((result = runJob(job)) != JobResult.DEFERRED) { + if (result == JobResult.FAILURE) { + job.onCanceled(); + } + + if (job.isPersistent()) { + persistentStorage.remove(job.getPersistentId()); + } } if (job.getGroupId() != null) { @@ -48,21 +58,25 @@ public class JobConsumer extends Thread { } } - private boolean runJob(Job job) { - int retryCount = job.getRetryCount(); + private JobResult runJob(Job job) { + int retryCount = job.getRetryCount(); + int runIteration = job.getRunIteration(); - for (int i=retryCount;i>0;i--) { + for (;runIteration