diff --git a/CHANGES.md b/CHANGES.md index dbc6eef39..ef15dd817 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ ### Merged from 1.0 +* Fix priority calculation for local queue - Issue #546 * Skip unnecessary reads from repair history - Issue #548 * Fix repair job priority - Issue #515 * Fix malformed IPv6 for JMX - Issue #306 @@ -17,6 +18,7 @@ #### Merged from 1.0 +* Fix priority calculation for local queue - Issue #546 * Skip unnecessary reads from repair history - Issue #548 * Fix repair job priority - Issue #515 * Fix malformed IPv6 for JMX - Issue #306 @@ -55,6 +57,7 @@ ## Version 1.0.8 (Not yet released) +* Fix priority calculation for local queue - Issue #546 * Skip unnecessary reads from repair history - Issue #548 * Fix repair job priority - Issue #515 * Fix malformed IPv6 for JMX - Issue #306 diff --git a/core/src/main/java/com/ericsson/bss/cassandra/ecchronos/core/repair/RepairSchedulerImpl.java b/core/src/main/java/com/ericsson/bss/cassandra/ecchronos/core/repair/RepairSchedulerImpl.java index 4dfe20ff7..887a89800 100644 --- a/core/src/main/java/com/ericsson/bss/cassandra/ecchronos/core/repair/RepairSchedulerImpl.java +++ b/core/src/main/java/com/ericsson/bss/cassandra/ecchronos/core/repair/RepairSchedulerImpl.java @@ -189,8 +189,7 @@ private TableRepairJob getRepairJob(TableReference tableReference, RepairConfigu .withTableStorageStates(myTableStorageStates) .withRepairPolices(myRepairPolicies) .build(); - - job.runnable(); + job.refreshState(); return job; } diff --git a/core/src/main/java/com/ericsson/bss/cassandra/ecchronos/core/repair/TableRepairJob.java b/core/src/main/java/com/ericsson/bss/cassandra/ecchronos/core/repair/TableRepairJob.java index dd8bc9f49..93f0b1a74 100644 --- a/core/src/main/java/com/ericsson/bss/cassandra/ecchronos/core/repair/TableRepairJob.java +++ b/core/src/main/java/com/ericsson/bss/cassandra/ecchronos/core/repair/TableRepairJob.java @@ -103,7 +103,8 @@ public Iterator iterator() for (ReplicaRepairGroup replicaRepairGroup : repairStateSnapshot.getRepairGroups()) { - taskList.add(new RepairGroup(getRealPriority(), myTableReference, myRepairConfiguration, + taskList.add(new RepairGroup(getRealPriority(replicaRepairGroup.getLastCompletedAt()), + myTableReference, myRepairConfiguration, replicaRepairGroup, myJmxProxyFactory, myTableRepairMetrics, myRepairLockType.getLockFactory(), new RepairLockFactoryImpl(), @@ -194,14 +195,6 @@ else if (msSinceLastRepair >= myRepairConfiguration.getRepairWarningTimeInMs()) @Override public boolean runnable() { - try - { - myRepairState.update(); - } catch (Exception e) - { - LOG.warn("Unable to check repair history, {}", this, e); - } - RepairStateSnapshot repairStateSnapshot = myRepairState.getSnapshot(); long lastRepaired = repairStateSnapshot.lastRepairedAt(); @@ -214,6 +207,19 @@ public boolean runnable() return repairStateSnapshot.canRepair() && super.runnable(); } + @Override + public void refreshState() + { + try + { + myRepairState.update(); + } + catch (Exception e) + { + LOG.warn("Unable to check repair history, {}", this, e); + } + } + /** * Calculate real priority based on available tasks. */ diff --git a/core/src/main/java/com/ericsson/bss/cassandra/ecchronos/core/scheduling/ScheduledJob.java b/core/src/main/java/com/ericsson/bss/cassandra/ecchronos/core/scheduling/ScheduledJob.java index 63972bee9..bffceacdb 100644 --- a/core/src/main/java/com/ericsson/bss/cassandra/ecchronos/core/scheduling/ScheduledJob.java +++ b/core/src/main/java/com/ericsson/bss/cassandra/ecchronos/core/scheduling/ScheduledJob.java @@ -57,6 +57,16 @@ protected void postExecute(boolean successful) } } + /** + * This method is called every time the scheduler creates a list of jobs to run. + * Use this if you need to do some updates before priority is calculated. + * Default is noop. + */ + protected void refreshState() + { + // NOOP by default + } + /** * Set the job to be runnable again after the given delay has elapsed. * diff --git a/core/src/main/java/com/ericsson/bss/cassandra/ecchronos/core/scheduling/ScheduledJobQueue.java b/core/src/main/java/com/ericsson/bss/cassandra/ecchronos/core/scheduling/ScheduledJobQueue.java index 3c84e9cda..d914b619e 100644 --- a/core/src/main/java/com/ericsson/bss/cassandra/ecchronos/core/scheduling/ScheduledJobQueue.java +++ b/core/src/main/java/com/ericsson/bss/cassandra/ecchronos/core/scheduling/ScheduledJobQueue.java @@ -116,6 +116,7 @@ int size() @Override public synchronized Iterator iterator() { + myJobQueues.values().forEach(q -> q.forEach(ScheduledJob::refreshState)); Iterator baseIterator = new ManyToOneIterator<>(myJobQueues.values(), myComparator); return new RunnableJobIterator(baseIterator); diff --git a/core/src/test/java/com/ericsson/bss/cassandra/ecchronos/core/repair/TestTableRepairJob.java b/core/src/test/java/com/ericsson/bss/cassandra/ecchronos/core/repair/TestTableRepairJob.java index db31d0aee..b1ddcee9d 100644 --- a/core/src/test/java/com/ericsson/bss/cassandra/ecchronos/core/repair/TestTableRepairJob.java +++ b/core/src/test/java/com/ericsson/bss/cassandra/ecchronos/core/repair/TestTableRepairJob.java @@ -184,7 +184,6 @@ public void testPrevalidateNotRepairable() assertThat(myRepairJob.runnable()).isFalse(); - verify(myRepairState, times(1)).update(); verify(myRepairStateSnapshot, times(1)).canRepair(); } @@ -196,7 +195,6 @@ public void testPrevalidateNeedRepair() mockRepairGroup(0L); assertThat(myRepairJob.runnable()).isTrue(); - verify(myRepairState, times(1)).update(); verify(myRepairStateSnapshot, times(2)).canRepair(); } @@ -209,7 +207,6 @@ public void testPrevalidateNotRepairableThenRepairable() assertThat(myRepairJob.runnable()).isFalse(); assertThat(myRepairJob.runnable()).isTrue(); - verify(myRepairState, times(2)).update(); verify(myRepairStateSnapshot, times(3)).canRepair(); }