Extend TaskQuota from TaskParker

Functions like `tryAcquire` and `release` restrict the way
we implement quotas. Instead use the same terminology from
the TaskParker interface.

Change-Id: I1d2949d8492d8ee1f48699acc4b865886d010e60
diff --git a/src/main/java/com/googlesource/gerrit/plugins/quota/SoftMaxPerUserForQueue.java b/src/main/java/com/googlesource/gerrit/plugins/quota/SoftMaxPerUserForQueue.java
index c2d623e..827b22d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/quota/SoftMaxPerUserForQueue.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/quota/SoftMaxPerUserForQueue.java
@@ -42,7 +42,7 @@
   }
 
   @Override
-  public boolean tryAcquire(WorkQueue.Task<?> task) {
+  public boolean isReadyToStart(WorkQueue.Task<?> task) {
     return user(task)
         .map(
             user -> {
@@ -64,7 +64,7 @@
   }
 
   @Override
-  public void release(WorkQueue.Task<?> task) {
+  public void onStop(WorkQueue.Task<?> task) {
     user(task)
         .ifPresent(
             user ->
diff --git a/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuota.java b/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuota.java
index 1e689a1..5792cc9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuota.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuota.java
@@ -16,10 +16,12 @@
 
 import com.google.gerrit.server.git.WorkQueue;
 
-public interface TaskQuota {
+public interface TaskQuota extends WorkQueue.TaskParker {
   boolean isApplicable(WorkQueue.Task<?> task);
 
-  boolean tryAcquire(WorkQueue.Task<?> task);
+  @Override
+  default void onNotReadyToStart(WorkQueue.Task<?> task) {}
 
-  void release(WorkQueue.Task<?> task);
+  @Override
+  default void onStart(WorkQueue.Task<?> task) {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuotaPerUserForTaskForQueue.java b/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuotaPerUserForTaskForQueue.java
index 783045f..6d7d076 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuotaPerUserForTaskForQueue.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuotaPerUserForTaskForQueue.java
@@ -30,12 +30,12 @@
   }
 
   @Override
-  public boolean tryAcquire(WorkQueue.Task<?> task) {
+  public boolean isReadyToStart(WorkQueue.Task<?> task) {
     return perUserTaskQuota.tryAcquire(task);
   }
 
   @Override
-  public void release(WorkQueue.Task<?> task) {
+  public void onStop(WorkQueue.Task<?> task) {
     perUserTaskQuota.release(task);
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuotaWithPermits.java b/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuotaWithPermits.java
index 8a8bc94..027ddcf 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuotaWithPermits.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuotaWithPermits.java
@@ -10,11 +10,11 @@
     this.permits = new Semaphore(maxPermits);
   }
 
-  public boolean tryAcquire(WorkQueue.Task<?> task) {
+  public boolean isReadyToStart(WorkQueue.Task<?> task) {
     return permits.tryAcquire();
   }
 
-  public void release(WorkQueue.Task<?> task) {
+  public void onStop(WorkQueue.Task<?> task) {
     permits.release();
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuotas.java b/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuotas.java
index a4af200..2fc703e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuotas.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/quota/TaskQuotas.java
@@ -88,27 +88,25 @@
     }
 
     List<TaskQuota> acquiredQuotas = new ArrayList<>();
+    quotasByTask.put(task.getTaskId(), acquiredQuotas);
+
     for (TaskQuota quota : quotas) {
       if (quota.isApplicable(task)) {
-        if (!quota.tryAcquire(task)) {
+        if (!quota.isReadyToStart(task)) {
           log.debug("Task [{}] will be parked due task quota rules", task);
-          acquiredQuotas.forEach(q -> q.release(task));
-          QueueStats.release(queue, 1);
           return false;
         }
         acquiredQuotas.add(quota);
       }
     }
-
-    if (!acquiredQuotas.isEmpty()) {
-      quotasByTask.put(task.getTaskId(), acquiredQuotas);
-    }
     return true;
   }
 
   @Override
   public void onNotReadyToStart(WorkQueue.Task<?> task) {
-    release(task);
+    QueueStats.release(QueueStats.Queue.fromKey(task.getQueueName()), 1);
+    Optional.ofNullable(quotasByTask.remove(task.getTaskId()))
+        .ifPresent(quotas -> quotas.forEach(q -> q.onStop(task)));
   }
 
   @Override
@@ -116,13 +114,9 @@
 
   @Override
   public void onStop(WorkQueue.Task<?> task) {
-    release(task);
-  }
-
-  private void release(WorkQueue.Task<?> task) {
     QueueStats.release(QueueStats.Queue.fromKey(task.getQueueName()), 1);
     Optional.ofNullable(quotasByTask.remove(task.getTaskId()))
-        .ifPresent(quotas -> quotas.forEach(q -> q.release(task)));
+        .ifPresent(quotas -> quotas.forEach(q -> q.onStop(task)));
   }
 
   private Optional<Project.NameKey> estimateProject(WorkQueue.Task<?> task) {