Title: [292785] trunk/Tools
Revision
292785
Author
jbed...@apple.com
Date
2022-04-12 14:36:14 -0700 (Tue, 12 Apr 2022)

Log Message

[Merge-Queue] Prioritize oldest builds first
https://bugs.webkit.org/show_bug.cgi?id=239094
<rdar://problem/91595070 >]

Reviewed by Stephanie Lewis.

* Tools/CISupport/ews-build/loadConfig.py:
(loadBuilderConfig):
(async_sort): Added.
(prioritizeBuilders): Prioritize the builder with the oldest request.
* Tools/CISupport/ews-build/loadConfig_unittest.py:
(TestPrioritizeBuilders):
(TestPrioritizeBuilders.MockBuilder):
(TestPrioritizeBuilders.test_builders_over_testers):
(TestPrioritizeBuilders.test_starvation):

Canonical link: https://commits.webkit.org/249569@main

Modified Paths

Diff

Modified: trunk/Tools/CISupport/ews-build/loadConfig.py (292784 => 292785)


--- trunk/Tools/CISupport/ews-build/loadConfig.py	2022-04-12 21:20:37 UTC (rev 292784)
+++ trunk/Tools/CISupport/ews-build/loadConfig.py	2022-04-12 21:36:14 UTC (rev 292785)
@@ -31,6 +31,8 @@
 from buildbot.worker import Worker
 from buildbot.util import identifiers as buildbot_identifiers
 from buildbot.changes.filter import ChangeFilter
+from datetime import datetime, timezone
+from twisted.internet import defer
 
 from factories import (APITestsFactory, BindingsFactory, BuildFactory, CommitQueueFactory, Factory, GTKBuildFactory,
                        GTKTestsFactory, JSCBuildFactory, JSCBuildAndTestsFactory, JSCTestsFactory, MergeQueueFactory, StressTestFactory,
@@ -113,9 +115,33 @@
     c['schedulers'].append(forceScheduler)
 
 
+# Copied from https://github.com/buildbot/buildbot/blob/master/master/buildbot/util/async_sort.py
+@defer.inlineCallbacks
+def async_sort(l, key, max_parallel=10):
+    sem = defer.DeferredSemaphore(max_parallel)
+    try:
+        keys = yield defer.gatherResults([sem.run(key, i) for i in l])
+    except defer.FirstError as e:
+        raise e.subFailure.value
+
+    keys = {id(l[i]): v for i, v in enumerate(keys)}
+    l.sort(key=lambda x: keys[id(x)])
+
+
 def prioritizeBuilders(buildmaster, builders):
-    # Prioritize builder queues over tester queues
-    builders.sort(key=lambda b: 'build' in b.name.lower(), reverse=True)
+    # Prioritize builder queues over tester queues.
+    # Otherwise, prioritize older requests.
+    # Inspired by https://docs.buildbot.net/latest/manual/customization.html#builder-priority-functions
+    @defer.inlineCallbacks
+    def key(b):
+        request_time = yield b.getOldestRequestTime()
+        return (
+            'build' not in b.name.lower(),
+            bool(b.building) or bool(b.old_building),
+            request_time or datetime.now(timezone.utc),
+        )
+
+    async_sort(builders, key)
     return builders
 
 

Modified: trunk/Tools/CISupport/ews-build/loadConfig_unittest.py (292784 => 292785)


--- trunk/Tools/CISupport/ews-build/loadConfig_unittest.py	2022-04-12 21:20:37 UTC (rev 292784)
+++ trunk/Tools/CISupport/ews-build/loadConfig_unittest.py	2022-04-12 21:36:14 UTC (rev 292785)
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 #
-# Copyright (C) 2018-2021 Apple Inc. All rights reserved.
+# Copyright (C) 2018-2022 Apple Inc. All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
@@ -27,6 +27,9 @@
 import os
 import unittest
 
+from datetime import datetime, timedelta, timezone
+from twisted.internet import defer
+
 import loadConfig
 
 
@@ -246,5 +249,41 @@
         loadConfig.checkWorkersAndBuildersForConsistency({}, [self.ews101, {'name': 'ews102', 'platform': 'mac-sierra'}], [self.WK2Builder])
 
 
+class TestPrioritizeBuilders(unittest.TestCase):
+    class MockBuilder(object):
+        def __init__(self, name, building=False, oldestRequestTime=None):
+            self.name = name
+            self.building = building
+            self.old_building = False
+            self._oldestRequestTime = oldestRequestTime or datetime.now(timezone.utc)
+
+        def getOldestRequestTime(self):
+            return self._oldestRequestTime
+
+    def test_builders_over_testers(self):
+        builders = [
+            self.MockBuilder('macOS-BigSur-Debug-Build-EWS'),
+            self.MockBuilder('macOS-BigSur-Debug-WK1-Tests-EWS'),
+            self.MockBuilder('macOS-BigSur-Release-Build-EWS'),
+        ]
+        sorted_builders = loadConfig.prioritizeBuilders(None, builders)
+        self.assertEqual(
+            ['macOS-BigSur-Debug-Build-EWS', 'macOS-BigSur-Release-Build-EWS', 'macOS-BigSur-Debug-WK1-Tests-EWS'],
+            [builder.name for builder in sorted_builders],
+        )
+
+    def test_starvation(self):
+        builders = [
+            self.MockBuilder('Commit-Queue', oldestRequestTime=datetime.now(timezone.utc) - timedelta(seconds=30)),
+            self.MockBuilder('Merge-Queue', oldestRequestTime=datetime.now(timezone.utc) - timedelta(seconds=10)),
+            self.MockBuilder('Unsafe-Merge-Queue', oldestRequestTime=datetime.now(timezone.utc) - timedelta(seconds=60)),
+        ]
+        sorted_builders = loadConfig.prioritizeBuilders(None, builders)
+        self.assertEqual(
+            ['Unsafe-Merge-Queue', 'Commit-Queue', 'Merge-Queue'],
+            [builder.name for builder in sorted_builders],
+        )
+
+
 if __name__ == '__main__':
     unittest.main()

Modified: trunk/Tools/ChangeLog (292784 => 292785)


--- trunk/Tools/ChangeLog	2022-04-12 21:20:37 UTC (rev 292784)
+++ trunk/Tools/ChangeLog	2022-04-12 21:36:14 UTC (rev 292785)
@@ -1,3 +1,21 @@
+2022-04-12  Jonathan Bedard  <jbed...@apple.com>
+
+        [Merge-Queue] Prioritize oldest builds first
+        https://bugs.webkit.org/show_bug.cgi?id=239094
+        <rdar://problem/91595070 >]
+
+        Reviewed by Stephanie Lewis.
+
+        * CISupport/ews-build/loadConfig.py:
+        (loadBuilderConfig):
+        (async_sort): Added.
+        (prioritizeBuilders): Prioritize the builder with the oldest request.
+        * CISupport/ews-build/loadConfig_unittest.py:
+        (TestPrioritizeBuilders):
+        (TestPrioritizeBuilders.MockBuilder):
+        (TestPrioritizeBuilders.test_builders_over_testers):
+        (TestPrioritizeBuilders.test_starvation):
+
 2022-04-12  Angelos Oikonomopoulos  <ange...@igalia.com>
 
         [JSC] Report test flakiness to resultsdb
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to