Merge "hashring: allow to use bytes as node name"

This commit is contained in:
Jenkins 2017-03-17 11:57:08 +00:00 committed by Gerrit Code Review
commit 54496ff820
2 changed files with 23 additions and 2 deletions

View File

@ -19,6 +19,7 @@ import hashlib
import six
import tooz
from tooz import utils
class UnknownNode(tooz.ToozError):
@ -68,7 +69,7 @@ class HashRing(object):
will each handle 1/6, 1/3 and 1/2 of the resources, respectively.
"""
for node in nodes:
key = six.text_type(node).encode('utf-8')
key = utils.to_binary(node, 'utf-8')
key_hash = hashlib.md5(key)
for r in six.moves.range(self._partition_number * weight):
key_hash.update(key)
@ -90,7 +91,7 @@ class HashRing(object):
except KeyError:
raise UnknownNode(node)
key = six.text_type(node).encode('utf-8')
key = utils.to_binary(node, 'utf-8')
key_hash = hashlib.md5(key)
for r in six.moves.range(self._partition_number * weight):
key_hash.update(key)

View File

@ -61,6 +61,16 @@ class HashRingTestCase(testcase.TestCase):
self.assertEqual(nodes, set(ring.nodes.keys()))
self.assertEqual(2 ** 5 * len(nodes), len(ring))
def test_add_node_bytes(self):
nodes = {'foo', 'bar'}
ring = hashring.HashRing(nodes)
self.assertEqual(nodes, set(ring.nodes.keys()))
self.assertEqual(2 ** 5 * len(nodes), len(ring))
nodes.add(b'Z\xe2\xfa\x90\x17EC\xac\xae\x88\xa7[\xa1}:E')
ring.add_node(b'Z\xe2\xfa\x90\x17EC\xac\xae\x88\xa7[\xa1}:E')
self.assertEqual(nodes, set(ring.nodes.keys()))
self.assertEqual(2 ** 5 * len(nodes), len(ring))
def test_add_node_unicode(self):
nodes = {'foo', 'bar'}
ring = hashring.HashRing(nodes)
@ -91,6 +101,16 @@ class HashRingTestCase(testcase.TestCase):
self.assertEqual(nodes, set(ring.nodes.keys()))
self.assertEqual(2 ** 5 * len(nodes), len(ring))
def test_remove_node_bytes(self):
nodes = {'foo', b'Z\xe2\xfa\x90\x17EC\xac\xae\x88\xa7[\xa1}:E'}
ring = hashring.HashRing(nodes)
self.assertEqual(nodes, set(ring.nodes.keys()))
self.assertEqual(2 ** 5 * len(nodes), len(ring))
nodes.discard(b'Z\xe2\xfa\x90\x17EC\xac\xae\x88\xa7[\xa1}:E')
ring.remove_node(b'Z\xe2\xfa\x90\x17EC\xac\xae\x88\xa7[\xa1}:E')
self.assertEqual(nodes, set(ring.nodes.keys()))
self.assertEqual(2 ** 5 * len(nodes), len(ring))
def test_remove_node_unknown(self):
nodes = ['foo', 'bar']
ring = hashring.HashRing(nodes)