From 41be279f362f34fb556362712e7333a36224e9c6 Mon Sep 17 00:00:00 2001 From: Michael Hanselmann <hansmi@google.com> Date: Wed, 6 Feb 2013 14:04:47 +0100 Subject: [PATCH] qa_config.AcquireNode: Use sort key function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use a sort key function instead of using a comparing function (βcmp=β¦β). The latter is not supported in Python 3 and using a sort key function is easier. Signed-off-by: Michael Hanselmann <hansmi@google.com> Reviewed-by: Bernardo Dal Seno <bdalseno@google.com> --- qa/qa_config.py | 22 +++++++++++----------- test/py/qa.qa_config_unittest.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/qa/qa_config.py b/qa/qa_config.py index 664baace9..6b74f82b1 100644 --- a/qa/qa_config.py +++ b/qa/qa_config.py @@ -553,6 +553,15 @@ def IsTemplateSupported(templ): return GetConfig().IsTemplateSupported(templ) +def _NodeSortKey(node): + """Returns sort key for a node. + + @type node: L{_QaNode} + + """ + return (node.use_count, utils.NiceSortKey(node.primary)) + + def AcquireNode(exclude=None, _cfg=None): """Returns the least used node. @@ -578,17 +587,8 @@ def AcquireNode(exclude=None, _cfg=None): if not nodes: raise qa_error.OutOfNodesError("No nodes left") - # Get node with least number of uses - # TODO: Switch to computing sort key instead of comparing directly - def compare(a, b): - result = cmp(a.use_count, b.use_count) - if result == 0: - result = cmp(a.primary, b.primary) - return result - - nodes.sort(cmp=compare) - - return nodes[0].Use() + # Return node with least number of uses + return sorted(nodes, key=_NodeSortKey)[0].Use() def AcquireManyNodes(num, exclude=None): diff --git a/test/py/qa.qa_config_unittest.py b/test/py/qa.qa_config_unittest.py index ce987f887..f2de71427 100755 --- a/test/py/qa.qa_config_unittest.py +++ b/test/py/qa.qa_config_unittest.py @@ -349,6 +349,35 @@ class TestQaConfig(unittest.TestCase): self.assertRaises(qa_error.OutOfNodesError, qa_config.AcquireNode, exclude=acquired, _cfg=self.config) + def testAcquireNodeOrder(self): + # Mark all nodes as marked (master excluded) + for node in self.config["nodes"]: + if node != self.config.GetMasterNode(): + node.MarkAdded() + + nodecount = len(self.config["nodes"]) + + for iterations in [0, 1, 3, 100, 127, 7964]: + acquired = [] + + for i in range(iterations): + node = qa_config.AcquireNode(_cfg=self.config) + self.assertTrue(node.use_count > 0) + self.assertEqual(node.use_count, (i / nodecount + 1)) + acquired.append((node.use_count, node.primary, node)) + + # Check if returned nodes were in correct order + key_fn = lambda (a, b, c): (a, utils.NiceSortKey(b), c) + self.assertEqual(acquired, sorted(acquired, key=key_fn)) + + # Release previously acquired nodes + qa_config.ReleaseManyNodes(map(operator.itemgetter(2), acquired)) + + # Check if nodes were actually released + for node in self.config["nodes"]: + self.assertEqual(node.use_count, 0) + self.assertTrue(node.added or node == self.config.GetMasterNode()) + class TestRepresentation(unittest.TestCase): def _Check(self, target, part): -- GitLab