From 53996a1e9dd717228d3419018f5d2d8d07fb6bf3 Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Thu, 29 Nov 2018 09:43:53 -0500 Subject: [PATCH] Increase likelihood of IPMI results being sorted Without incurring execution penalty, endeavor to sort available data in an opportunistic way. This certainly does not guarantee order, but it makes it highly likely for quick queries to appear orderly. --- .../confluent/plugins/hardwaremanagement/ipmi.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/confluent_server/confluent/plugins/hardwaremanagement/ipmi.py b/confluent_server/confluent/plugins/hardwaremanagement/ipmi.py index fa54c373..a064524e 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/ipmi.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/ipmi.py @@ -349,21 +349,32 @@ def perform_requests(operator, nodes, element, cfg, inputdata, realop): cfg.decrypt = cryptit resultdata = queue.LightQueue() livingthreads = set([]) + numnodes = len(nodes) for node in nodes: livingthreads.add(_ipmiworkers.spawn( perform_request, operator, node, element, configdata, inputdata, cfg, resultdata, realop)) while livingthreads: try: + bundle = [] datum = resultdata.get(timeout=10) while datum: if datum != 'Done': if isinstance(datum, Exception): raise datum - yield datum - datum = resultdata.get_nowait() + if hasattr(datum, 'kvpairs') and len(datum.kvpairs) == 1: + bundle.append((datum.kvpairs.keys()[0], datum)) + numnodes -= 1 + else: + yield datum + timeout = 0.1 if numnodes else 0.001 + datum = resultdata.get(timeout=timeout) except queue.Empty: pass + finally: + for datum in sorted( + bundle, key=lambda x: util.naturalize_string(x[0])): + yield datum[1] for t in list(livingthreads): if t.dead: livingthreads.discard(t)