Skip to content

Commit 88c6103

Browse files
committed
test: expand NTS testing to cover multi-rack case
1 parent eff319b commit 88c6103

1 file changed

Lines changed: 43 additions & 2 deletions

File tree

tests/unit/test_metadata.py

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,14 @@
1919

2020
from mock import Mock
2121
import os
22-
import random
2322
import six
2423

2524
import cassandra
2625
from cassandra.cqltypes import IntegerType, AsciiType, TupleType
2726
from cassandra.metadata import (Murmur3Token, MD5Token,
2827
BytesToken, ReplicationStrategy,
2928
NetworkTopologyStrategy, SimpleStrategy,
30-
LocalStrategy, NoMurmur3, protect_name,
29+
LocalStrategy, protect_name,
3130
protect_names, protect_value, is_valid_name,
3231
UserType, KeyspaceMetadata, get_schema_parser,
3332
_UnknownStrategy)
@@ -113,6 +112,48 @@ def test_nts_make_token_replica_map(self):
113112

114113
self.assertItemsEqual(replica_map[MD5Token(0)], (dc1_1, dc1_2, dc2_1, dc2_2, dc3_1))
115114

115+
def test_nts_make_token_replica_map_multi_rack(self):
116+
token_to_host_owner = {}
117+
118+
# (A) not enough distinct racks, first skipped is used
119+
dc1_1 = Host('dc1.1', SimpleConvictionPolicy)
120+
dc1_2 = Host('dc1.2', SimpleConvictionPolicy)
121+
dc1_3 = Host('dc1.3', SimpleConvictionPolicy)
122+
dc1_4 = Host('dc1.4', SimpleConvictionPolicy)
123+
dc1_1.set_location_info('dc1', 'rack1')
124+
dc1_2.set_location_info('dc1', 'rack1')
125+
dc1_3.set_location_info('dc1', 'rack2')
126+
dc1_4.set_location_info('dc1', 'rack2')
127+
token_to_host_owner[MD5Token(0)] = dc1_1
128+
token_to_host_owner[MD5Token(100)] = dc1_2
129+
token_to_host_owner[MD5Token(200)] = dc1_3
130+
token_to_host_owner[MD5Token(300)] = dc1_4
131+
132+
# (B) distinct racks, but not contiguous
133+
dc2_1 = Host('dc2.1', SimpleConvictionPolicy)
134+
dc2_2 = Host('dc2.2', SimpleConvictionPolicy)
135+
dc2_3 = Host('dc2.3', SimpleConvictionPolicy)
136+
dc2_1.set_location_info('dc2', 'rack1')
137+
dc2_2.set_location_info('dc2', 'rack1')
138+
dc2_3.set_location_info('dc2', 'rack2')
139+
token_to_host_owner[MD5Token(1)] = dc2_1
140+
token_to_host_owner[MD5Token(101)] = dc2_2
141+
token_to_host_owner[MD5Token(201)] = dc2_3
142+
143+
ring = [MD5Token(0),
144+
MD5Token(1),
145+
MD5Token(100),
146+
MD5Token(101),
147+
MD5Token(200),
148+
MD5Token(201),
149+
MD5Token(300)]
150+
151+
nts = NetworkTopologyStrategy({'dc1': 3, 'dc2': 2})
152+
replica_map = nts.make_token_replica_map(token_to_host_owner, ring)
153+
154+
token_replicas = replica_map[MD5Token(0)]
155+
self.assertItemsEqual(token_replicas, (dc1_1, dc1_2, dc1_3, dc2_1, dc2_3))
156+
116157
def test_nts_make_token_replica_map_empty_dc(self):
117158
host = Host('1', SimpleConvictionPolicy)
118159
host.set_location_info('dc1', 'rack1')

0 commit comments

Comments
 (0)