133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# Copyright 2012 the V8 project authors. All rights reserved. 233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# Redistribution and use in source and binary forms, with or without 333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# modification, are permitted provided that the following conditions are 433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# met: 533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# 633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# * Redistributions of source code must retain the above copyright 733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# notice, this list of conditions and the following disclaimer. 833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# * Redistributions in binary form must reproduce the above 933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# copyright notice, this list of conditions and the following 1033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# disclaimer in the documentation and/or other materials provided 1133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# with the distribution. 1233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# * Neither the name of Google Inc. nor the names of its 1333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# contributors may be used to endorse or promote products derived 1433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# from this software without specific prior written permission. 1533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# 1633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 2833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 2933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgclass Peer(object): 3033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def __init__(self, address, jobs, rel_perf, pubkey): 3133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.address = address # string: IP address 3233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.jobs = jobs # integer: number of CPUs 3333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.relative_performance = rel_perf 3433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.pubkey = pubkey # string: pubkey's fingerprint 3533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.shells = set() # set of strings 3633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.needed_work = 0 3733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.assigned_work = 0 3833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.tests = [] # list of TestCase objects 3933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.trusting_me = False # This peer trusts my public key. 4033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.trusted = False # I trust this peer's public key. 4133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 4233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def __str__(self): 4333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return ("Peer at %s, jobs: %d, performance: %.2f, trust I/O: %s/%s" % 4433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org (self.address, self.jobs, self.relative_performance, 4533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.trusting_me, self.trusted)) 4633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 4733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def AddTests(self, shell): 4833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org """Adds tests from |shell| to this peer. 4933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 5033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org Stops when self.needed_work reaches zero, or when all of shell's tests 5133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org are assigned.""" 5233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assert self.needed_work > 0 5333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if shell.shell not in self.shells: 5433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.shells.add(shell.shell) 5533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org while len(shell.tests) > 0 and self.needed_work > 0: 5633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org t = shell.tests.pop() 5733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.needed_work -= t.duration 5833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.assigned_work += t.duration 5933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org shell.total_duration -= t.duration 6033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.tests.append(t) 6133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def ForceAddOneTest(self, test, shell): 6333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org """Forcibly adds another test to this peer, disregarding needed_work.""" 6433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if shell.shell not in self.shells: 6533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.shells.add(shell.shell) 6633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.needed_work -= test.duration 6733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.assigned_work += test.duration 6833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org shell.total_duration -= test.duration 6933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.tests.append(test) 7033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 7133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 7233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def Pack(self): 7333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org """Creates a JSON serializable representation of this Peer.""" 7433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return [self.address, self.jobs, self.relative_performance] 7533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 7633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org @staticmethod 7733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def Unpack(packed): 7833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org """Creates a Peer object built from a packed representation.""" 7933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org pubkey_dummy = "" # Callers of this don't care (only the server does). 8033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return Peer(packed[0], packed[1], packed[2], pubkey_dummy) 81