diff --git a/bot/src/main/java/org/openjdk/skara/bot/BotRunner.java b/bot/src/main/java/org/openjdk/skara/bot/BotRunner.java index 9dd4facba..739afe138 100644 --- a/bot/src/main/java/org/openjdk/skara/bot/BotRunner.java +++ b/bot/src/main/java/org/openjdk/skara/bot/BotRunner.java @@ -130,8 +130,8 @@ private void submitOrSchedule(WorkItem item) { if (!activeItem.concurrentWith(item)) { for (var pendingItem : pending.entrySet()) { - // If there are pending items we cannot run concurrently with either, replace them - if (!pendingItem.getKey().concurrentWith(item)) { + // If there are pending items of the same type that we cannot run concurrently with, replace them. + if (pendingItem.getKey().getClass().equals(item.getClass()) && !pendingItem.getKey().concurrentWith(item)) { log.finer("Discarding obsoleted item " + pendingItem.getKey() + " in favor of item " + item); pending.remove(pendingItem.getKey()); diff --git a/bot/src/test/java/org/openjdk/skara/bot/BotRunnerTests.java b/bot/src/test/java/org/openjdk/skara/bot/BotRunnerTests.java index cbc2ee7ae..3f5b82df9 100644 --- a/bot/src/test/java/org/openjdk/skara/bot/BotRunnerTests.java +++ b/bot/src/test/java/org/openjdk/skara/bot/BotRunnerTests.java @@ -69,6 +69,12 @@ public String toString() { } } +class TestWorkItemChild extends TestWorkItem { + TestWorkItemChild(ConcurrencyCheck concurrencyCheck, String description) { + super(concurrencyCheck, description); + } +} + class TestBot implements Bot { private final List items; @@ -209,4 +215,27 @@ void discardAdditionalBlockedItems() throws TimeoutException { Assertions.assertFalse(item3.hasRun); Assertions.assertTrue(item4.hasRun); } + + @Test + void dontDiscardDifferentBlockedItems() throws TimeoutException { + var item1 = new TestWorkItem(i -> false, "Item 1"); + var item2 = new TestWorkItem(i -> false, "Item 2"); + var item3 = new TestWorkItem(i -> false, "Item 3"); + var item4 = new TestWorkItem(i -> false, "Item 4"); + var item5 = new TestWorkItemChild(i -> false, "Item 5"); + var item6 = new TestWorkItemChild(i -> false, "Item 6"); + var item7 = new TestWorkItemChild(i -> false, "Item 7"); + var bot = new TestBot(item1, item2, item3, item4, item5, item6, item7); + var runner = new BotRunner(config(), List.of(bot)); + + runner.runOnce(Duration.ofSeconds(10)); + + Assertions.assertTrue(item1.hasRun); + Assertions.assertFalse(item2.hasRun); + Assertions.assertFalse(item3.hasRun); + Assertions.assertTrue(item4.hasRun); + Assertions.assertFalse(item5.hasRun); + Assertions.assertFalse(item6.hasRun); + Assertions.assertTrue(item7.hasRun); + } }