[llvm-commits] [zorg] r125902 - /zorg/trunk/llvmlab/llvmlab/ci/buildbot/statusclient.py
Daniel Dunbar
daniel at zuster.org
Fri Feb 18 08:42:46 PST 2011
Author: ddunbar
Date: Fri Feb 18 10:42:46 2011
New Revision: 125902
URL: http://llvm.org/viewvc/llvm-project?rev=125902&view=rev
Log:
llvmlab.ci.buildbot.statusclient: Change to only monitoring changes to the last
build number, instead of the set of cached builds.
Modified:
zorg/trunk/llvmlab/llvmlab/ci/buildbot/statusclient.py
Modified: zorg/trunk/llvmlab/llvmlab/ci/buildbot/statusclient.py
URL: http://llvm.org/viewvc/llvm-project/zorg/trunk/llvmlab/llvmlab/ci/buildbot/statusclient.py?rev=125902&r1=125901&r2=125902&view=diff
==============================================================================
--- zorg/trunk/llvmlab/llvmlab/ci/buildbot/statusclient.py (original)
+++ zorg/trunk/llvmlab/llvmlab/ci/buildbot/statusclient.py Fri Feb 18 10:42:46 2011
@@ -14,17 +14,21 @@
if version != 0:
raise ValueError, "Unknown version"
- return BuilderInfo(data['name'], set(data['builds']), data['last_poll'])
+ return BuilderInfo(data['name'], data['last_build_number'],
+ set(data['active_builds']), data['last_poll'])
def todata(self):
return { 'version' : 0,
'name' : self.name,
- 'builds' : list(self.builds),
+ 'last_build_number' : self.last_build_number,
+ 'active_builds' : list(self.active_builds),
'last_poll' : self.last_poll }
- def __init__(self, name, builds, last_poll):
+ def __init__(self, name, last_build_number = None,
+ active_builds = set(), last_poll = -1):
self.name = name
- self.builds = builds
+ self.last_build_number = last_build_number
+ self.active_builds = active_builds
self.last_poll = last_poll
class StatusClient(object):
@@ -110,14 +114,14 @@
# Pull the builder names.
#
# FIXME: BuildBot should provide a more efficient query for this.
- yield ('poll_builders',)
+ #yield ('poll_builders',)
res = self.get_json_result(('builders',))
builder_names = set(res.keys())
current_builders = set(self.builders)
for name in builder_names - current_builders:
yield ('added_builder', name)
- self.builders[name] = BuilderInfo(name, set(), -1)
+ self.builders[name] = BuilderInfo(name)
for name in current_builders - builder_names:
yield ('removed_builder', name)
self.builders.remove(name)
@@ -126,16 +130,45 @@
def pull_builder(self, builder):
# Pull the builder data.
- yield ('poll_builder', builder.name)
- res = self.get_json_result(('builders', builder.name))
- builds = set(res['cachedBuilds'])
+ #yield ('poll_builder', builder.name)
- for id in builds - builder.builds:
+ # Get the latest build number.
+ res = self.get_json_result(('builders', builder.name, 'builds', '-1'))
+ number = res['number']
+
+ # Check if we need to start or reset the state.
+ if (builder.last_build_number is None or
+ number < builder.last_build_number):
+ # Send a reset event.
+ yield ('reset_builder', builder.name)
+ builder.last_build_number = number - 1
+
+ # Add any potentially active builds.
+ for id in range(builder.last_build_number + 1, number + 1):
yield ('add_build', builder.name, id)
- builder.builds.add(id)
- for id in builder.builds - builds:
- yield ('remove_build', builder.name, id)
- builder.builds.remove(id)
+ builder.active_builds.add(id)
+
+ # Update the latest build number.
+ builder.last_build_number = number
+
+ # Analyze the active builds.
+ builds = list(builder.active_builds)
+ builds.sort()
+ for id in builds:
+ res = self.get_json_result(('builders', builder.name, 'builds',
+ str(id)))
+ times = res.get('times')
+
+ # In rare circumstances, we could have accessed an invalid build,
+ # check for this.
+ if times is None or len(times) != 2:
+ yield ('invalid_build', builder.name, id)
+ builder.active_builds.remove(id)
+
+ # Otherwise, just check to see if the build is done.
+ if times[1] is not None:
+ yield ('completed_build', builder.name, id)
+ builder.active_builds.remove(id)
builder.last_poll = time.time()
More information about the llvm-commits
mailing list