|
19 | 19 |
|
20 | 20 | from mock import Mock |
21 | 21 | import os |
22 | | -import random |
23 | 22 | import six |
24 | 23 |
|
25 | 24 | import cassandra |
26 | 25 | from cassandra.cqltypes import IntegerType, AsciiType, TupleType |
27 | 26 | from cassandra.metadata import (Murmur3Token, MD5Token, |
28 | 27 | BytesToken, ReplicationStrategy, |
29 | 28 | NetworkTopologyStrategy, SimpleStrategy, |
30 | | - LocalStrategy, NoMurmur3, protect_name, |
| 29 | + LocalStrategy, protect_name, |
31 | 30 | protect_names, protect_value, is_valid_name, |
32 | 31 | UserType, KeyspaceMetadata, get_schema_parser, |
33 | 32 | _UnknownStrategy) |
@@ -113,6 +112,48 @@ def test_nts_make_token_replica_map(self): |
113 | 112 |
|
114 | 113 | self.assertItemsEqual(replica_map[MD5Token(0)], (dc1_1, dc1_2, dc2_1, dc2_2, dc3_1)) |
115 | 114 |
|
| 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 | + |
116 | 157 | def test_nts_make_token_replica_map_empty_dc(self): |
117 | 158 | host = Host('1', SimpleConvictionPolicy) |
118 | 159 | host.set_location_info('dc1', 'rack1') |
|
0 commit comments