]> TLD Linux GIT Repositories - tld-builder.git/blob - TLD_Builder/load_balancer.py
9560ed68d48054ef66af604a2e5670015e529dd9
[tld-builder.git] / TLD_Builder / load_balancer.py
1 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
2
3 import string
4 import os
5 import time
6
7 import path
8 import sys
9 import log
10 import status
11 import lock
12 import loop
13
14 import rpm_builder
15
16 from config import config, init_conf
17
18 # return list of binary builders in fair-queue order
19 # it is determined based upon spool/got_lock file, which is also
20 # updated to be short
21 def builders_order():
22     bs = {}
23     bl = []
24     for b in config.binary_builders:
25         bs[b] = 0
26         bl.append(b)
27
28     lck = lock.lock("got-lock")
29     f = open(path.got_lock_file, "r+")
30     line_no = 0
31
32     for l in f:
33         line_no += 1
34         b = l.strip()
35         if b in bs:
36             bs[b] = line_no
37         else:
38             log.alert("found strange lock in got-lock: %s" % b)
39
40     def mycmp(b1, b2):
41         return cmp(bs[b1], bs[b2])
42
43     bl.sort(key=mycmp)
44
45     f.seek(0)
46     f.truncate(0)
47     for l in bl: f.write(l + "\n")
48     f.close()
49     lck.close()
50
51     return bl
52
53 def run_rpm_builder(b):
54     if os.fork() == 0:
55         return
56     else:
57         rpm_builder.main_for(b)
58         sys.exit(0)
59
60 def main():
61     init_conf()
62     for b in builders_order():
63         run_rpm_builder(b)
64         # give builder some time to aquire lock
65         time.sleep(1)
66     # wait for children to die out
67     try:
68         while 1: os.wait()
69     except:
70         pass
71
72 if __name__ == '__main__':
73     loop.run_loop(main)