--- memcache.py 2007-09-19 05:45:07.000000000 +0200 +++ memcache2.py 2007-10-25 11:43:42.000000000 +0200 @@ -47,6 +47,8 @@ import socket import time import types +import random +import copy try: import cPickle as pickle except ImportError: @@ -91,6 +93,15 @@ class local(object): pass +def random_perm(col): + "Returns a random permutation of a collection of items." + col2 = copy.copy(col) + for n in range(len(col)-1,0,-1): + ri = random.randrange(n+1) + tmp = col2[ri] + col2[ri]=col2[n] + col2[n]=tmp + return col2 class Client(local): """ @@ -232,12 +243,16 @@ else: serverhash = serverHashFunction(key) + saved_state = random.getstate() + random.seed(serverhash) + perm = random_perm(self.buckets) + random.setstate(saved_state) + nbuckets = len(self.buckets) + for i in range(Client._SERVER_RETRIES): - server = self.buckets[serverhash % len(self.buckets)] - if server.connect(): - #print "(using server %s)" % server, - return server, key - serverhash = serverHashFunction(str(serverhash) + str(i)) + server = perm[i%nbuckets] + if server.connect(): return server, key + return None, None def disconnect_all(self):