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) {