Merge "hashring: allow to use bytes as node name"
This commit is contained in:
commit
54496ff820
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue