2626import java .time .Duration ;
2727import java .time .Instant ;
2828import java .time .ZoneId ;
29- import java .util .Collections ;
30- import java .util .HashSet ;
31- import java .util .Set ;
3229import java .util .concurrent .TimeUnit ;
33- import java .util .concurrent .atomic .AtomicLong ;
3430import java .util .concurrent .locks .LockSupport ;
3531import java .util .function .BooleanSupplier ;
3632import org .junit .After ;
@@ -43,26 +39,17 @@ public class EndpointLifecycleManagerTest {
4339
4440 private EndpointLifecycleManager manager ;
4541
46- /** Counter for generating unique finder keys in tests. */
47- private static final AtomicLong TEST_FINDER_ID = new AtomicLong (1000 );
48-
4942 @ After
5043 public void tearDown () {
5144 if (manager != null ) {
5245 manager .shutdown ();
5346 }
5447 }
5548
56- /**
57- * Registers addresses with the lifecycle manager via updateActiveAddresses, which atomically
58- * creates endpoints and registers them as active. This mirrors how ChannelFinder.update() works.
59- */
60- private static String registerAddresses (EndpointLifecycleManager mgr , String ... addresses ) {
61- String finderId = "finder-" + TEST_FINDER_ID .incrementAndGet ();
62- Set <String > addressSet = new HashSet <>();
63- Collections .addAll (addressSet , addresses );
64- mgr .updateActiveAddresses (finderId , addressSet );
65- return finderId ;
49+ private static void registerAddresses (EndpointLifecycleManager mgr , String ... addresses ) {
50+ for (String address : addresses ) {
51+ mgr .requestEndpointRecreation (address );
52+ }
6653 }
6754
6855 private static void awaitCondition (String message , BooleanSupplier condition ) {
@@ -103,10 +90,9 @@ public void duplicateRegistrationIsNoop() throws Exception {
10390 new EndpointLifecycleManager (
10491 cache , /* probeIntervalSeconds= */ 60 , Duration .ofMinutes (30 ), Clock .systemUTC ());
10592
106- String finderId = registerAddresses (manager , "server1" );
107- // Re-register with the same finder ID — should not create duplicate state.
108- manager .updateActiveAddresses (finderId , Collections .singleton ("server1" ));
109- manager .updateActiveAddresses (finderId , Collections .singleton ("server1" ));
93+ registerAddresses (manager , "server1" );
94+ manager .requestEndpointRecreation ("server1" );
95+ manager .requestEndpointRecreation ("server1" );
11096
11197 assertEquals (1 , manager .managedEndpointCount ());
11298 }
@@ -118,7 +104,7 @@ public void defaultEndpointIsNotManaged() {
118104 new EndpointLifecycleManager (
119105 cache , /* probeIntervalSeconds= */ 60 , Duration .ofMinutes (30 ), Clock .systemUTC ());
120106
121- registerAddresses ( manager , "default" );
107+ manager . requestEndpointRecreation ( "default" );
122108
123109 assertFalse (manager .isManaged ("default" ));
124110 assertEquals (0 , manager .managedEndpointCount ());
@@ -155,8 +141,6 @@ public void realRoutedTrafficUpdatesLastRealTrafficAt() throws Exception {
155141 new EndpointLifecycleManager (
156142 cache , /* probeIntervalSeconds= */ 60 , Duration .ofMinutes (30 ), clock );
157143
158- registerAddresses (manager , "server1" );
159-
160144 Instant before = clock .instant ();
161145 clock .advance (Duration .ofMinutes (5 ));
162146 manager .recordRealTraffic ("server1" );
@@ -267,28 +251,6 @@ public void transientFailureEvictionTrackedUntilEndpointReadyAgain() throws Exce
267251 () -> !manager .wasRecentlyEvictedTransientFailure ("server1" ));
268252 }
269253
270- @ Test
271- public void transientFailureEvictionMarkerRemovedWhenAddressNoLongerActive () throws Exception {
272- KeyRangeCacheTest .FakeEndpointCache cache = new KeyRangeCacheTest .FakeEndpointCache ();
273- manager =
274- new EndpointLifecycleManager (
275- cache , /* probeIntervalSeconds= */ 1 , Duration .ofMinutes (30 ), Clock .systemUTC ());
276-
277- String finder = registerAddresses (manager , "server1" );
278- awaitCondition (
279- "endpoint should be created in background" , () -> cache .getIfPresent ("server1" ) != null );
280-
281- cache .setState ("server1" , KeyRangeCacheTest .EndpointHealthState .TRANSIENT_FAILURE );
282- awaitCondition (
283- "endpoint should be evicted after repeated transient failures" ,
284- () ->
285- !manager .isManaged ("server1" ) && manager .wasRecentlyEvictedTransientFailure ("server1" ));
286-
287- manager .updateActiveAddresses (finder , Collections .emptySet ());
288-
289- assertFalse (manager .wasRecentlyEvictedTransientFailure ("server1" ));
290- }
291-
292254 @ Test
293255 public void shutdownStopsAllProbing () throws Exception {
294256 KeyRangeCacheTest .FakeEndpointCache cache = new KeyRangeCacheTest .FakeEndpointCache ();
@@ -312,8 +274,8 @@ public void emptyOrNullAddressIsIgnored() {
312274 new EndpointLifecycleManager (
313275 cache , /* probeIntervalSeconds= */ 60 , Duration .ofMinutes (30 ), Clock .systemUTC ());
314276
315- manager .updateActiveAddresses ( "finder-1" , Collections . singleton ( "" ) );
316- manager .updateActiveAddresses ( "finder-2" , Collections . emptySet () );
277+ manager .requestEndpointRecreation ( "" );
278+ manager .requestEndpointRecreation ( null );
317279
318280 assertEquals (0 , manager .managedEndpointCount ());
319281 }
@@ -331,66 +293,6 @@ public void recordRealTrafficForDefaultEndpointIsIgnored() {
331293 assertEquals (0 , manager .managedEndpointCount ());
332294 }
333295
334- @ Test
335- public void staleEndpointEvictedWhenNoLongerActive () throws Exception {
336- KeyRangeCacheTest .FakeEndpointCache cache = new KeyRangeCacheTest .FakeEndpointCache ();
337- manager =
338- new EndpointLifecycleManager (
339- cache , /* probeIntervalSeconds= */ 60 , Duration .ofMinutes (30 ), Clock .systemUTC ());
340-
341- // Finder 1 reports server1 and server2.
342- String finder1 = registerAddresses (manager , "server1" , "server2" );
343- assertEquals (2 , manager .managedEndpointCount ());
344-
345- // Finder 1 updates: server1 is gone, only server2 remains.
346- manager .updateActiveAddresses (finder1 , Collections .singleton ("server2" ));
347-
348- // server1 should be evicted since no finder references it.
349- assertFalse (manager .isManaged ("server1" ));
350- assertTrue (manager .isManaged ("server2" ));
351- assertEquals (1 , manager .managedEndpointCount ());
352- }
353-
354- @ Test
355- public void endpointKeptIfReferencedByAnotherFinder () throws Exception {
356- KeyRangeCacheTest .FakeEndpointCache cache = new KeyRangeCacheTest .FakeEndpointCache ();
357- manager =
358- new EndpointLifecycleManager (
359- cache , /* probeIntervalSeconds= */ 60 , Duration .ofMinutes (30 ), Clock .systemUTC ());
360-
361- // Finder 1 reports server1.
362- String finder1 = registerAddresses (manager , "server1" );
363- // Finder 2 also reports server1.
364- registerAddresses (manager , "server1" );
365-
366- // Finder 1 drops server1, but finder 2 still references it.
367- manager .updateActiveAddresses (finder1 , Collections .emptySet ());
368-
369- assertTrue (manager .isManaged ("server1" ));
370- assertEquals (1 , manager .managedEndpointCount ());
371- }
372-
373- @ Test
374- public void unregisterFinderEvictsEndpointsNoLongerReferenced () throws Exception {
375- KeyRangeCacheTest .FakeEndpointCache cache = new KeyRangeCacheTest .FakeEndpointCache ();
376- manager =
377- new EndpointLifecycleManager (
378- cache , /* probeIntervalSeconds= */ 60 , Duration .ofMinutes (30 ), Clock .systemUTC ());
379-
380- String finder1 = registerAddresses (manager , "server1" );
381- String finder2 = registerAddresses (manager , "server2" );
382-
383- manager .unregisterFinder (finder1 );
384-
385- assertFalse (manager .isManaged ("server1" ));
386- assertTrue (manager .isManaged ("server2" ));
387- assertEquals (1 , manager .managedEndpointCount ());
388-
389- manager .unregisterFinder (finder2 );
390-
391- assertEquals (0 , manager .managedEndpointCount ());
392- }
393-
394296 /** Test clock that can be advanced manually. */
395297 private static final class TestClock extends Clock {
396298 private Instant now ;
0 commit comments