]> TLD Linux GIT Repositories - TLD.git/blobdiff - pld-builder.new/PLD_Builder/load_balancer.py
- from https://github.com/pld-linux/pld-builder.new
[TLD.git] / pld-builder.new / PLD_Builder / load_balancer.py
diff --git a/pld-builder.new/PLD_Builder/load_balancer.py b/pld-builder.new/PLD_Builder/load_balancer.py
new file mode 100644 (file)
index 0000000..2e182c8
--- /dev/null
@@ -0,0 +1,73 @@
+# vi: encoding=utf-8 ts=8 sts=4 sw=4 et
+
+import string
+import os
+import time
+
+import path
+import sys
+import log
+import status
+import lock
+import loop
+
+import rpm_builder
+
+from config import config, init_conf
+
+# return list of binary builders in fair-queue order
+# it is determined based upon spool/got_lock file, which is also
+# updated to be short
+def builders_order():
+    bs = {}
+    bl = []
+    for b in config.binary_builders:
+        bs[b] = 0
+        bl.append(b)
+
+    lck = lock.lock("got-lock")
+    f = open(path.got_lock_file, "r+")
+    line_no = 0
+
+    for l in f.xreadlines():
+        line_no += 1
+        b = string.strip(l)
+        if bs.has_key(b):
+            bs[b] = line_no
+        else:
+            log.alert("found strange lock in got-lock: %s" % b)
+
+    def mycmp(b1, b2):
+        return cmp(bs[b1], bs[b2])
+
+    bl.sort(mycmp)
+
+    f.seek(0)
+    f.truncate(0)
+    for l in bl: f.write(l + "\n")
+    f.close()
+    lck.close()
+
+    return bl
+
+def run_rpm_builder(b):
+    if os.fork() == 0:
+        return
+    else:
+        rpm_builder.main_for(b)
+        sys.exit(0)
+
+def main():
+    init_conf()
+    for b in builders_order():
+        run_rpm_builder(b)
+        # give builder some time to aquire lock
+        time.sleep(1)
+    # wait for children to die out
+    try:
+        while 1: os.wait()
+    except:
+        pass
+
+if __name__ == '__main__':
+    loop.run_loop(main)