Blob Blame History Raw
From a160d10735c62e046b72e31e8eb7756c5f06e09f Mon Sep 17 00:00:00 2001
From: Ahmon Dancy <adancy@wikimedia.org>
Date: Mon, 27 Jul 2020 14:46:49 -0700
Subject: [PATCH 7/9] wakeConnections: Randomize connections before scanning
 them

gear/__init__.py:
 Modified Server.wakeConnections() so that it randomizes the
 list of active connections before sending out NOOP's to them.
 This will hopefully spread workload across machines more evenly
 when there are multiple workers per machine.

Reference: https://phabricator.wikimedia.org/T258630

Change-Id: I05dcb9fa383f3aefc8b5b1bb9dd8b3ff6ff7f37d
Signed-off-by: Matthieu Huin <mhuin@redhat.com>
---
 gear/__init__.py | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/gear/__init__.py b/gear/__init__.py
index f7fc767..4a0fcb7 100644
--- a/gear/__init__.py
+++ b/gear/__init__.py
@@ -15,6 +15,7 @@
 import errno
 import logging
 import os
+import random
 import select
 import six
 import socket
@@ -3295,7 +3296,13 @@ class Server(BaseClientServer):
 
     def wakeConnections(self, job=None):
         p = Packet(constants.RES, constants.NOOP, b'')
-        for connection in self.active_connections:
+
+        # Use a randomized copy of active_connections to try
+        # to spread workload across the machines that workers are on.
+        conns = self.active_connections[:]
+        random.shuffle(conns)    # Modifies the list
+
+        for connection in conns:
             if connection.state == 'SLEEP':
                 if ((job and job.name in connection.functions) or
                         (job is None)):
-- 
2.31.1