@@ -35,13 +35,11 @@ fn get_routing_table(snapshot: &RegistrySnapshot) -> RoutingTable {
35
35
36
36
// If there are shards, they should match the routing table record.
37
37
let shards = get_routing_table_shards ( snapshot) ;
38
- if !shards. is_empty ( ) {
39
- let rt_from_shards = RoutingTable :: try_from ( shards) . unwrap ( ) ;
40
- assert_eq ! (
41
- rt_from_shards, rt_from_routing_table_record,
42
- "Routing tables from shards and routing table record do not match."
43
- ) ;
44
- }
38
+ let rt_from_shards = RoutingTable :: try_from ( shards) . unwrap ( ) ;
39
+ assert_eq ! (
40
+ rt_from_shards, rt_from_routing_table_record,
41
+ "Routing tables from shards and routing table record do not match."
42
+ ) ;
45
43
46
44
rt_from_routing_table_record
47
45
}
@@ -127,20 +125,32 @@ mod tests {
127
125
use prost:: Message ;
128
126
use std:: convert:: TryFrom ;
129
127
128
+ fn insert_routing_table_to_snapshot (
129
+ routing_table : RoutingTable ,
130
+ snapshot : & mut RegistrySnapshot ,
131
+ ) {
132
+ let routing_table = PbRoutingTable :: from ( routing_table) ;
133
+ snapshot. insert (
134
+ make_canister_ranges_key ( CanisterId :: from ( 0 ) ) . into_bytes ( ) ,
135
+ routing_table. encode_to_vec ( ) ,
136
+ ) ;
137
+ // TODO(NNS1-3781): Remove this once we have sharded table supported by all clients, and
138
+ // inline the function after removal.
139
+ snapshot. insert (
140
+ make_routing_table_record_key ( ) . into_bytes ( ) ,
141
+ routing_table. encode_to_vec ( ) ,
142
+ ) ;
143
+ }
144
+
130
145
#[ test]
131
146
fn nonexistent_canister_migrations_can_pass_invariants_check ( ) {
132
147
let mut snapshot = RegistrySnapshot :: new ( ) ;
133
148
134
149
let routing_table = RoutingTable :: try_from ( btreemap ! {
135
- CanisterIdRange { start: CanisterId :: from( 0x0 ) , end: CanisterId :: from( 0xff ) } => subnet_test_id( 1 ) ,
136
- CanisterIdRange { start: CanisterId :: from( 0x100 ) , end: CanisterId :: from( 0x1ff ) } => subnet_test_id( 2 ) ,
137
- } ) . unwrap ( ) ;
138
-
139
- let routing_table = PbRoutingTable :: from ( routing_table) ;
140
- let key1 = make_routing_table_record_key ( ) ;
141
- let value1 = routing_table. encode_to_vec ( ) ;
142
-
143
- snapshot. insert ( key1. into_bytes ( ) , value1) ;
150
+ CanisterIdRange { start: CanisterId :: from( 0x0 ) , end: CanisterId :: from( 0xff ) } => subnet_test_id( 1 ) ,
151
+ CanisterIdRange { start: CanisterId :: from( 0x100 ) , end: CanisterId :: from( 0x1ff ) } => subnet_test_id( 2 ) ,
152
+ } ) . unwrap ( ) ;
153
+ insert_routing_table_to_snapshot ( routing_table, & mut snapshot) ;
144
154
145
155
assert ! ( check_routing_table_invariants( & snapshot) . is_ok( ) ) ;
146
156
assert ! ( check_canister_migrations_invariants( & snapshot) . is_ok( ) ) ;
@@ -151,19 +161,14 @@ mod tests {
151
161
let mut snapshot = RegistrySnapshot :: new ( ) ;
152
162
153
163
let routing_table = RoutingTable :: try_from ( btreemap ! {
154
- CanisterIdRange { start: CanisterId :: from( 0x0 ) , end: CanisterId :: from( 0xff ) } => subnet_test_id( 1 ) ,
155
- CanisterIdRange { start: CanisterId :: from( 0x100 ) , end: CanisterId :: from( 0x1ff ) } => subnet_test_id( 2 ) ,
156
- } ) . unwrap ( ) ;
157
-
158
- let routing_table = PbRoutingTable :: from ( routing_table) ;
159
- let key1 = make_routing_table_record_key ( ) ;
160
- let value1 = routing_table. encode_to_vec ( ) ;
161
-
162
- let key2 = make_canister_migrations_record_key ( ) ;
163
- let value2 = PbCanisterMigrations { entries : vec ! [ ] } . encode_to_vec ( ) ;
164
-
165
- snapshot. insert ( key1. into_bytes ( ) , value1) ;
166
- snapshot. insert ( key2. into_bytes ( ) , value2) ;
164
+ CanisterIdRange { start: CanisterId :: from( 0x0 ) , end: CanisterId :: from( 0xff ) } => subnet_test_id( 1 ) ,
165
+ CanisterIdRange { start: CanisterId :: from( 0x100 ) , end: CanisterId :: from( 0x1ff ) } => subnet_test_id( 2 ) ,
166
+ } ) . unwrap ( ) ;
167
+ insert_routing_table_to_snapshot ( routing_table, & mut snapshot) ;
168
+ snapshot. insert (
169
+ make_canister_migrations_record_key ( ) . into_bytes ( ) ,
170
+ PbCanisterMigrations { entries : vec ! [ ] } . encode_to_vec ( ) ,
171
+ ) ;
167
172
168
173
assert ! ( check_routing_table_invariants( & snapshot) . is_ok( ) ) ;
169
174
assert ! ( check_canister_migrations_invariants( & snapshot) . is_ok( ) ) ;
@@ -175,15 +180,10 @@ mod tests {
175
180
176
181
// The routing table before canister migration.
177
182
let routing_table = RoutingTable :: try_from ( btreemap ! {
178
- CanisterIdRange { start: CanisterId :: from( 0x0 ) , end: CanisterId :: from( 0xff ) } => subnet_test_id( 1 ) ,
179
- CanisterIdRange { start: CanisterId :: from( 0x100 ) , end: CanisterId :: from( 0x1ff ) } => subnet_test_id( 2 ) ,
180
- } ) . unwrap ( ) ;
181
-
182
- let routing_table = PbRoutingTable :: from ( routing_table) ;
183
- let key1 = make_routing_table_record_key ( ) ;
184
- let value1 = routing_table. encode_to_vec ( ) ;
185
-
186
- snapshot. insert ( key1. into_bytes ( ) , value1) ;
183
+ CanisterIdRange { start: CanisterId :: from( 0x0 ) , end: CanisterId :: from( 0xff ) } => subnet_test_id( 1 ) ,
184
+ CanisterIdRange { start: CanisterId :: from( 0x100 ) , end: CanisterId :: from( 0x1ff ) } => subnet_test_id( 2 ) ,
185
+ } ) . unwrap ( ) ;
186
+ insert_routing_table_to_snapshot ( routing_table, & mut snapshot) ;
187
187
assert ! ( check_routing_table_invariants( & snapshot) . is_ok( ) ) ;
188
188
assert ! ( check_canister_migrations_invariants( & snapshot) . is_ok( ) ) ;
189
189
@@ -193,31 +193,28 @@ mod tests {
193
193
} ) . unwrap ( ) ;
194
194
195
195
let canister_migrations = PbCanisterMigrations :: from ( canister_migrations) ;
196
- let key2 = make_canister_migrations_record_key ( ) ;
197
- let value2 = canister_migrations . encode_to_vec ( ) ;
198
-
199
- snapshot . insert ( key2 . into_bytes ( ) , value2 ) ;
196
+ snapshot . insert (
197
+ make_canister_migrations_record_key ( ) . into_bytes ( ) ,
198
+ canister_migrations . encode_to_vec ( ) ,
199
+ ) ;
200
200
assert ! ( check_routing_table_invariants( & snapshot) . is_ok( ) ) ;
201
201
assert ! ( check_canister_migrations_invariants( & snapshot) . is_ok( ) ) ;
202
202
203
203
// Reassign ranges in routing table.
204
204
let routing_table = RoutingTable :: try_from ( btreemap ! {
205
205
CanisterIdRange { start: CanisterId :: from( 0x0 ) , end: CanisterId :: from( 0xf ) } => subnet_test_id( 1 ) ,
206
- CanisterIdRange { start: CanisterId :: from( 0x10 ) , end: CanisterId :: from( 0x1ff ) } => subnet_test_id( 2 ) ,
207
- } ) . unwrap ( ) ;
206
+ CanisterIdRange { start: CanisterId :: from( 0x10 ) , end: CanisterId :: from( 0x1ff ) } => subnet_test_id( 2 ) ,
207
+ } ) . unwrap ( ) ;
208
208
209
- let routing_table = PbRoutingTable :: from ( routing_table) ;
210
- let key3 = make_routing_table_record_key ( ) ;
211
- let value3 = routing_table. encode_to_vec ( ) ;
212
- snapshot. insert ( key3. into_bytes ( ) , value3) ;
209
+ insert_routing_table_to_snapshot ( routing_table, & mut snapshot) ;
213
210
assert ! ( check_routing_table_invariants( & snapshot) . is_ok( ) ) ;
214
211
assert ! ( check_canister_migrations_invariants( & snapshot) . is_ok( ) ) ;
215
212
216
213
// Complete canister migrations by removing entries.
217
- let key4 = make_canister_migrations_record_key ( ) ;
218
- let value4 = PbCanisterMigrations { entries : vec ! [ ] } . encode_to_vec ( ) ;
219
-
220
- snapshot . insert ( key4 . into_bytes ( ) , value4 ) ;
214
+ snapshot . insert (
215
+ make_canister_migrations_record_key ( ) . into_bytes ( ) ,
216
+ PbCanisterMigrations { entries : vec ! [ ] } . encode_to_vec ( ) ,
217
+ ) ;
221
218
assert ! ( check_routing_table_invariants( & snapshot) . is_ok( ) ) ;
222
219
assert ! ( check_canister_migrations_invariants( & snapshot) . is_ok( ) ) ;
223
220
}
@@ -228,16 +225,12 @@ mod tests {
228
225
229
226
// The routing table before canister migration.
230
227
let routing_table = RoutingTable :: try_from ( btreemap ! {
231
- CanisterIdRange { start: CanisterId :: from( 0x0 ) , end: CanisterId :: from( 0xff ) } => subnet_test_id( 1 ) ,
232
- CanisterIdRange { start: CanisterId :: from( 0x100 ) , end: CanisterId :: from( 0x1ff ) } => subnet_test_id( 2 ) ,
233
- CanisterIdRange { start: CanisterId :: from( 0x200 ) , end: CanisterId :: from( 0x2ff ) } => subnet_test_id( 3 ) ,
234
- } ) . unwrap ( ) ;
235
-
236
- let routing_table = PbRoutingTable :: from ( routing_table) ;
237
- let key1 = make_routing_table_record_key ( ) ;
238
- let value1 = routing_table. encode_to_vec ( ) ;
228
+ CanisterIdRange { start: CanisterId :: from( 0x0 ) , end: CanisterId :: from( 0xff ) } => subnet_test_id( 1 ) ,
229
+ CanisterIdRange { start: CanisterId :: from( 0x100 ) , end: CanisterId :: from( 0x1ff ) } => subnet_test_id( 2 ) ,
230
+ CanisterIdRange { start: CanisterId :: from( 0x200 ) , end: CanisterId :: from( 0x2ff ) } => subnet_test_id( 3 ) ,
231
+ } ) . unwrap ( ) ;
239
232
240
- snapshot . insert ( key1 . into_bytes ( ) , value1 ) ;
233
+ insert_routing_table_to_snapshot ( routing_table , & mut snapshot ) ;
241
234
assert ! ( check_routing_table_invariants( & snapshot) . is_ok( ) ) ;
242
235
assert ! ( check_canister_migrations_invariants( & snapshot) . is_ok( ) ) ;
243
236
@@ -249,10 +242,10 @@ mod tests {
249
242
} ) . unwrap ( ) ;
250
243
251
244
let canister_migrations = PbCanisterMigrations :: from ( canister_migrations) ;
252
- let key2 = make_canister_migrations_record_key ( ) ;
253
- let value2 = canister_migrations . encode_to_vec ( ) ;
254
-
255
- snapshot . insert ( key2 . into_bytes ( ) , value2 ) ;
245
+ snapshot . insert (
246
+ make_canister_migrations_record_key ( ) . into_bytes ( ) ,
247
+ canister_migrations . encode_to_vec ( ) ,
248
+ ) ;
256
249
257
250
assert ! ( check_routing_table_invariants( & snapshot) . is_ok( ) ) ;
258
251
assert ! ( check_canister_migrations_invariants( & snapshot) . is_err( ) ) ;
@@ -269,61 +262,60 @@ mod tests {
269
262
CanisterIdRange { start: CanisterId :: from( 0x200 ) , end: CanisterId :: from( 0x2ff ) } => subnet_test_id( 3 ) ,
270
263
} ) . unwrap ( ) ;
271
264
272
- let routing_table = PbRoutingTable :: from ( routing_table) ;
273
- let key1 = make_routing_table_record_key ( ) ;
274
- let value1 = routing_table. encode_to_vec ( ) ;
275
-
276
265
// The canister migrations after preparation.
277
266
let canister_migrations = CanisterMigrations :: try_from ( btreemap ! {
278
267
CanisterIdRange { start: CanisterId :: from( 0x0 ) , end: CanisterId :: from( 0xff ) } => vec![ subnet_test_id( 1 ) , subnet_test_id( 2 ) ] ,
279
268
} ) . unwrap ( ) ;
280
269
281
270
let canister_migrations = PbCanisterMigrations :: from ( canister_migrations) ;
282
- let key2 = make_canister_migrations_record_key ( ) ;
283
- let value2 = canister_migrations. encode_to_vec ( ) ;
284
271
285
- snapshot. insert ( key1. into_bytes ( ) , value1) ;
286
- snapshot. insert ( key2. into_bytes ( ) , value2) ;
272
+ insert_routing_table_to_snapshot ( routing_table, & mut snapshot) ;
273
+ snapshot. insert (
274
+ make_canister_migrations_record_key ( ) . into_bytes ( ) ,
275
+ canister_migrations. encode_to_vec ( ) ,
276
+ ) ;
287
277
assert ! ( check_routing_table_invariants( & snapshot) . is_ok( ) ) ;
288
278
assert ! ( check_canister_migrations_invariants( & snapshot) . is_ok( ) ) ;
289
279
290
280
// The new routing table after reassigning ranges.
291
281
292
282
// Case 1: cannot find the entry containing `range.start` of canister migrations when looking up entries in the routing table,
293
- let mut new_snapshot = snapshot. clone ( ) ;
294
283
let new_routing_table_1 = RoutingTable :: try_from ( btreemap ! {
295
284
CanisterIdRange { start: CanisterId :: from( 0x1 ) , end: CanisterId :: from( 0xff ) } => subnet_test_id( 1 ) ,
296
285
CanisterIdRange { start: CanisterId :: from( 0x100 ) , end: CanisterId :: from( 0x1ff ) } => subnet_test_id( 2 ) ,
297
286
CanisterIdRange { start: CanisterId :: from( 0x200 ) , end: CanisterId :: from( 0x2ff ) } => subnet_test_id( 3 ) ,
298
287
} ) . unwrap ( ) ;
299
288
300
- let routing_table = PbRoutingTable :: from ( new_routing_table_1) ;
301
- let key3 = make_routing_table_record_key ( ) ;
302
- let value3 = routing_table. encode_to_vec ( ) ;
303
- new_snapshot. insert ( key3. into_bytes ( ) , value3) ;
289
+ insert_routing_table_to_snapshot ( new_routing_table_1, & mut snapshot) ;
304
290
305
- assert ! ( check_routing_table_invariants( & new_snapshot ) . is_ok( ) ) ;
306
- assert ! ( check_canister_migrations_invariants( & new_snapshot ) . is_err( ) ) ;
291
+ assert ! ( check_routing_table_invariants( & snapshot ) . is_ok( ) ) ;
292
+ assert ! ( check_canister_migrations_invariants( & snapshot ) . is_err( ) ) ;
307
293
308
294
// Case 2: find the entry containing `range.start` but the entry cannot fully cover the canister migration range {0x0:0xff}.
309
295
let new_routing_table_2 = RoutingTable :: try_from ( btreemap ! {
310
- CanisterIdRange { start: CanisterId :: from( 0x0 ) , end: CanisterId :: from( 0x1 ) } => subnet_test_id( 1 ) ,
311
- CanisterIdRange { start: CanisterId :: from( 0x100 ) , end: CanisterId :: from( 0x1ff ) } => subnet_test_id( 2 ) ,
312
- CanisterIdRange { start: CanisterId :: from( 0x200 ) , end: CanisterId :: from( 0x2ff ) } => subnet_test_id( 3 ) ,
313
- } ) . unwrap ( ) ;
296
+ CanisterIdRange { start: CanisterId :: from( 0x0 ) , end: CanisterId :: from( 0x1 ) } => subnet_test_id( 1 ) ,
297
+ CanisterIdRange { start: CanisterId :: from( 0x100 ) , end: CanisterId :: from( 0x1ff ) } => subnet_test_id( 2 ) ,
298
+ CanisterIdRange { start: CanisterId :: from( 0x200 ) , end: CanisterId :: from( 0x2ff ) } => subnet_test_id( 3 ) ,
299
+ } ) . unwrap ( ) ;
314
300
315
301
let routing_table = PbRoutingTable :: from ( new_routing_table_2) ;
316
- let key4 = make_routing_table_record_key ( ) ;
317
- let value4 = routing_table. encode_to_vec ( ) ;
318
- snapshot. insert ( key4. into_bytes ( ) , value4) ;
302
+ snapshot. insert (
303
+ make_routing_table_record_key ( ) . into_bytes ( ) ,
304
+ routing_table. encode_to_vec ( ) ,
305
+ ) ;
306
+ snapshot. insert (
307
+ make_canister_ranges_key ( CanisterId :: from ( 0 ) ) . into_bytes ( ) ,
308
+ routing_table. encode_to_vec ( ) ,
309
+ ) ;
319
310
320
311
assert ! ( check_routing_table_invariants( & snapshot) . is_ok( ) ) ;
321
312
assert ! ( check_canister_migrations_invariants( & snapshot) . is_err( ) ) ;
322
313
}
323
314
315
+ // TODO(NNS1-3781): Remove this test once we have sharded table supported by all clients.
324
316
#[ test]
325
317
#[ should_panic( expected = "Routing tables from shards and routing table record do not match." ) ]
326
- fn if_sharded_ranges_they_must_match_original_routing_table ( ) {
318
+ fn sharded_ranges_must_match_original_routing_table ( ) {
327
319
let mut snapshot = RegistrySnapshot :: new ( ) ;
328
320
329
321
// The routing table before canister migration.
@@ -334,20 +326,22 @@ mod tests {
334
326
} ) . unwrap ( ) ;
335
327
336
328
let routing_table = PbRoutingTable :: from ( routing_table) ;
337
- let key1 = make_routing_table_record_key ( ) ;
338
- let value1 = routing_table. encode_to_vec ( ) ;
339
329
340
330
let rt_shard = RoutingTable :: try_from ( btreemap ! {
341
331
CanisterIdRange { start: CanisterId :: from( 0x0 ) , end: CanisterId :: from( 0xff ) } => subnet_test_id( 1 ) ,
342
332
CanisterIdRange { start: CanisterId :: from( 0x100 ) , end: CanisterId :: from( 0x1ff ) } => subnet_test_id( 2 ) ,
343
333
} ) . unwrap ( ) ;
344
334
345
335
let rt_shard = PbRoutingTable :: from ( rt_shard) ;
346
- let key2 = make_canister_ranges_key ( CanisterId :: from_u64 ( 0x0 ) ) ;
347
- let value2 = rt_shard. encode_to_vec ( ) ;
348
336
349
- snapshot. insert ( key1. into_bytes ( ) , value1) ;
350
- snapshot. insert ( key2. into_bytes ( ) , value2) ;
337
+ snapshot. insert (
338
+ make_routing_table_record_key ( ) . into_bytes ( ) ,
339
+ routing_table. encode_to_vec ( ) ,
340
+ ) ;
341
+ snapshot. insert (
342
+ make_canister_ranges_key ( CanisterId :: from ( 0 ) ) . into_bytes ( ) ,
343
+ rt_shard. encode_to_vec ( ) ,
344
+ ) ;
351
345
352
346
check_routing_table_invariants ( & snapshot) . unwrap ( ) ;
353
347
}
0 commit comments