@@ -1336,6 +1336,32 @@ suite "Service Discovery Registrar - updateExistingAd":
13361336 check currentAd.toAdvertisementKey () in registrar.cacheTimestamps
13371337 check staleAd.toAdvertisementKey () notin registrar.cacheTimestamps
13381338
1339+ test " higher seqNo replaces stale copies in every other service that cached it" :
1340+ let registrar = Registrar .new ()
1341+ let serviceId1 = makeServiceId (1 )
1342+ let serviceId2 = makeServiceId (2 )
1343+ let privateKey = PrivateKey .random (rng ()).get ()
1344+ let oldAd = makeAdvertisement (privateKey = privateKey, seqNo = 1 )
1345+ let newAd = makeAdvertisement (privateKey = privateKey, seqNo = 2 )
1346+
1347+ registrar.cache[serviceId1] = @ [oldAd]
1348+ registrar.cache[serviceId2] = @ [oldAd]
1349+ registrar.cacheTimestamps[oldAd.toAdvertisementKey ()] = initMoment (1000 )
1350+ registrar.ipTree.insertAd (oldAd)
1351+
1352+ var ads1 = registrar.cache[serviceId1]
1353+ let changed = registrar.updateExistingAd (ads1, 0 , newAd, initMoment (2000 ))
1354+ registrar.cache[serviceId1] = ads1
1355+
1356+ check changed
1357+ check registrar.cache[serviceId1].len == 1
1358+ check registrar.cache[serviceId1][0 ].data.seqNo == 2
1359+ # serviceId2 was never passed into updateExistingAd directly.
1360+ check registrar.cache[serviceId2].len == 1
1361+ check registrar.cache[serviceId2][0 ].data.seqNo == 2
1362+ check oldAd.toAdvertisementKey () notin registrar.cacheTimestamps
1363+ check newAd.toAdvertisementKey () in registrar.cacheTimestamps
1364+
13391365suite " Service Discovery Registrar - insertNewAd" :
13401366 test " inserts ad into cache, IP tree, and timestamps, returns true" :
13411367 let disco =
@@ -1354,6 +1380,27 @@ suite "Service Discovery Registrar - insertNewAd":
13541380 check disco.registrar.cacheTimestamps[ad.toAdvertisementKey ()] == now
13551381 check disco.registrar.ipTree.root.counter > 0
13561382
1383+ test " same ad accepted for three services counts the IP tree only once" :
1384+ let disco =
1385+ setupServiceDiscoveryNode (discoConfig = ServiceDiscoveryConfig .new (fReturn = 3 ))
1386+ let serviceId1 = makeServiceId (1 )
1387+ let serviceId2 = makeServiceId (2 )
1388+ let serviceId3 = makeServiceId (3 )
1389+ let ad = makeAdvertisement (addrs = @ [makeMultiAddress (" 10.0.0.1" )])
1390+ let now = initMoment (1000 )
1391+
1392+ var ads1: seq [Advertisement ] = @ []
1393+ var ads2: seq [Advertisement ] = @ []
1394+ var ads3: seq [Advertisement ] = @ []
1395+ discard disco.insertNewAd (serviceId1, ads1, ad, now)
1396+ discard disco.insertNewAd (serviceId2, ads2, ad, now)
1397+ discard disco.insertNewAd (serviceId3, ads3, ad, now)
1398+ disco.registrar.cache[serviceId1] = ads1
1399+ disco.registrar.cache[serviceId2] = ads2
1400+ disco.registrar.cache[serviceId3] = ads3
1401+
1402+ check disco.registrar.ipTree.root.counter == 1
1403+
13571404 test " inserts ad without eviction when cache is under capacity" :
13581405 let disco = setupServiceDiscoveryNode (
13591406 discoConfig = ServiceDiscoveryConfig .new (fReturn = 3 , advertExpiry = 900 .secs)
0 commit comments