Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: third_party/buildbot_8_4p1/buildbot/status/web/status_json.py

Issue 13619004: Only calculate slave->build mapping once in json output. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/build
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # This file is part of Buildbot. Buildbot is free software: you can 1 # This file is part of Buildbot. Buildbot is free software: you can
2 # redistribute it and/or modify it under the terms of the GNU General Public 2 # redistribute it and/or modify it under the terms of the GNU General Public
3 # License as published by the Free Software Foundation, version 2. 3 # License as published by the Free Software Foundation, version 2.
4 # 4 #
5 # This program is distributed in the hope that it will be useful, but WITHOUT 5 # This program is distributed in the hope that it will be useful, but WITHOUT
6 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 6 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
7 # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 7 # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
8 # details. 8 # details.
9 # 9 #
10 # You should have received a copy of the GNU General Public License along with 10 # You should have received a copy of the GNU General Public License along with
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 BuilderJsonResource(status, 407 BuilderJsonResource(status,
408 status.getBuilder(builder_name))) 408 status.getBuilder(builder_name)))
409 409
410 410
411 class BuilderSlavesJsonResources(JsonResource): 411 class BuilderSlavesJsonResources(JsonResource):
412 help = """Describe the slaves attached to a single builder. 412 help = """Describe the slaves attached to a single builder.
413 """ 413 """
414 pageTitle = 'BuilderSlaves' 414 pageTitle = 'BuilderSlaves'
415 415
416 def __init__(self, status, builder_status): 416 def __init__(self, status, builder_status):
417 buildcache = {}
Isaac (away) 2013/04/04 21:24:38 Maybe: self.buildcache = collections.defaultdict(
417 JsonResource.__init__(self, status) 418 JsonResource.__init__(self, status)
418 self.builder_status = builder_status 419 self.builder_status = builder_status
419 for slave_name in self.builder_status.slavenames: 420 for slave_name in self.builder_status.slavenames:
420 self.putChild(slave_name, 421 self.putChild(slave_name,
421 SlaveJsonResource(status, 422 SlaveJsonResource(status,
422 self.status.getSlave(slave_name))) 423 self.status.getSlave(slave_name),
424 buildcache=buildcache))
Isaac (away) 2013/04/04 21:24:38 buildcache=self.buildcache
Mike Stip (use stip instead) 2013/04/05 23:35:04 It's probably not a good idea to persist this cach
423 425
424 426
425 class BuildJsonResource(JsonResource): 427 class BuildJsonResource(JsonResource):
426 help = """Describe a single build. 428 help = """Describe a single build.
427 """ 429 """
428 pageTitle = 'Build' 430 pageTitle = 'Build'
429 431
430 def __init__(self, status, build_status): 432 def __init__(self, status, build_status):
431 JsonResource.__init__(self, status) 433 JsonResource.__init__(self, status)
432 self.build_status = build_status 434 self.build_status = build_status
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 615
614 def asDict(self, request): 616 def asDict(self, request):
615 return self.status.asDict() 617 return self.status.asDict()
616 618
617 619
618 class SlaveJsonResource(JsonResource): 620 class SlaveJsonResource(JsonResource):
619 help = """Describe a slave. 621 help = """Describe a slave.
620 """ 622 """
621 pageTitle = 'Slave' 623 pageTitle = 'Slave'
622 624
623 def __init__(self, status, slave_status): 625 def __init__(self, status, slave_status, buildcache=None):
Isaac (away) 2013/04/04 21:24:38 why optional?
Mike Stip (use stip instead) 2013/04/05 23:35:04 It's only needed if you are repeatedly creating Sl
Isaac (away) 2013/04/05 23:45:01 As far as I can tell, the only clients are in this
624 JsonResource.__init__(self, status) 626 JsonResource.__init__(self, status)
625 self.slave_status = slave_status 627 self.slave_status = slave_status
626 self.name = self.slave_status.getName() 628 self.name = self.slave_status.getName()
627 self.builders = None 629 self.builders = None
628 630
631 # buildcache is used to cache build information across multiple
632 # invoations of SlaveJsonResource. It should be set to an empty {}.
633 # Without it, each invocation will do a full build scan.
634 self.buildcache = buildcache
635
629 def getBuilders(self): 636 def getBuilders(self):
630 if self.builders is None: 637 if self.builders is None:
631 # Figure out all the builders to which it's attached 638 # Figure out all the builders to which it's attached
632 self.builders = [] 639 self.builders = []
633 for builderName in self.status.getBuilderNames(): 640 for builderName in self.status.getBuilderNames():
634 if self.name in self.status.getBuilder(builderName).slavenames: 641 if self.name in self.status.getBuilder(builderName).slavenames:
635 self.builders.append(builderName) 642 self.builders.append(builderName)
636 return self.builders 643 return self.builders
637 644
638 def asDict(self, request): 645 def mapSlavesToBuilds(self):
Isaac (away) 2013/04/04 21:24:38 I think this would be cleaner if it buildcache[sel
Mike Stip (use stip instead) 2013/04/05 23:35:04 The scan works by creating all slaves at once, so
639 results = self.slave_status.asDict() 646 if self.buildcache:
640 # Enhance it by adding more informations. 647 return
641 results['builders'] = {} 648 self.buildcache = {}
Isaac (away) 2013/04/04 21:24:38 646-648 can be removed if param not optional.
642 for builderName in self.getBuilders(): 649 for builderName in self.getBuilders():
643 builds = [] 650 builds = []
644 builder_status = self.status.getBuilder(builderName) 651 builder_status = self.status.getBuilder(builderName)
645 for i in range(1, builder_status.buildCacheSize - 1): 652 for i in range(1, builder_status.buildCacheSize - 1):
646 build_status = builder_status.getBuild(-i) 653 build_status = builder_status.getBuild(-i)
647 if not build_status or not build_status.isFinished(): 654 if not build_status or not build_status.isFinished():
648 # If not finished, it will appear in runningBuilds. 655 # If not finished, it will appear in runningBuilds.
649 break 656 break
650 if build_status.getSlavename() == self.name: 657 slave = self.buildcache.get(build_status.getSlavename(), {})
Isaac (away) 2013/04/04 21:24:38 if buildcache is defaultdict. 657-660 become: sla
651 builds.append(build_status.getNumber()) 658 self.buildcache[build_status.getSlavename()] = slave
652 results['builders'][builderName] = builds 659 slave[builderName] = slave.get(builderName, [])
660 slave[builderName].append(build_status.getNumber())
661
Isaac (away) 2013/04/04 21:24:38 return self.buildcache[self.name]
662 def asDict(self, request):
663 results = self.slave_status.asDict()
664 # Enhance it by adding more informations.
665 self.mapSlavesToBuilds()
666 results['builders'] = self.buildcache.get(self.name, {})
Isaac (away) 2013/04/04 21:24:38 results['builders'] = getSlavesToBuildMap()
653 return results 667 return results
654 668
655 669
656 class SlavesJsonResource(JsonResource): 670 class SlavesJsonResource(JsonResource):
657 help = """List the registered slaves. 671 help = """List the registered slaves.
658 """ 672 """
659 pageTitle = 'Slaves' 673 pageTitle = 'Slaves'
660 674
661 def __init__(self, status): 675 def __init__(self, status):
676 buildcache = {}
Isaac (away) 2013/04/04 21:24:38 Maybe self.buildcache = collections.defaultdict(di
Mike Stip (use stip instead) 2013/04/05 23:35:04 Done.
662 JsonResource.__init__(self, status) 677 JsonResource.__init__(self, status)
663 for slave_name in status.getSlaveNames(): 678 for slave_name in status.getSlaveNames():
664 self.putChild(slave_name, 679 self.putChild(slave_name,
665 SlaveJsonResource(status, 680 SlaveJsonResource(status,
666 status.getSlave(slave_name))) 681 status.getSlave(slave_name),
682 buildcache=buildcache))
Isaac (away) 2013/04/04 21:24:38 self.buildcache
667 683
668 684
669 class SourceStampJsonResource(JsonResource): 685 class SourceStampJsonResource(JsonResource):
670 help = """Describe the sources for a SourceStamp. 686 help = """Describe the sources for a SourceStamp.
671 """ 687 """
672 pageTitle = 'SourceStamp' 688 pageTitle = 'SourceStamp'
673 689
674 def __init__(self, status, source_stamp): 690 def __init__(self, status, source_stamp):
675 # buildbot.sourcestamp.SourceStamp 691 # buildbot.sourcestamp.SourceStamp
676 JsonResource.__init__(self, status) 692 JsonResource.__init__(self, status)
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
738 if not builder: 754 if not builder:
739 return 755 return
740 EXAMPLES = EXAMPLES.replace('<A_BUILDER>', builder.getName()) 756 EXAMPLES = EXAMPLES.replace('<A_BUILDER>', builder.getName())
741 build = builder.getBuild(-1) 757 build = builder.getBuild(-1)
742 if build: 758 if build:
743 EXAMPLES = EXAMPLES.replace('<A_BUILD>', str(build.getNumber())) 759 EXAMPLES = EXAMPLES.replace('<A_BUILD>', str(build.getNumber()))
744 if builder.slavenames: 760 if builder.slavenames:
745 EXAMPLES = EXAMPLES.replace('<A_SLAVE>', builder.slavenames[0]) 761 EXAMPLES = EXAMPLES.replace('<A_SLAVE>', builder.slavenames[0])
746 762
747 # vim: set ts=4 sts=4 sw=4 et: 763 # vim: set ts=4 sts=4 sw=4 et:
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698