44import io .scalecube .cluster .transport .api .Transport ;
55import io .scalecube .net .Address ;
66import java .util .List ;
7+ import java .util .Map ;
8+ import java .util .concurrent .ConcurrentHashMap ;
79import java .util .concurrent .atomic .AtomicInteger ;
810import reactor .core .publisher .Mono ;
911
1012public class TransportWrapper {
1113
1214 private final Transport transport ;
1315
16+ private final Map <Member , Integer > addressIndexByMember = new ConcurrentHashMap <>();
17+
1418 public TransportWrapper (Transport transport ) {
1519 this .transport = transport ;
1620 }
@@ -26,13 +30,22 @@ public Mono<Message> requestResponse(Member member, Message request) {
2630 return Mono .defer (
2731 () -> {
2832 final List <Address > addresses = member .addresses ();
29- final AtomicInteger currentIndex = new AtomicInteger ();
33+ final int numRetries = addresses .size () - 1 ;
34+ final Integer index = addressIndexByMember .getOrDefault (member , 0 );
35+ final AtomicInteger currentIndex = new AtomicInteger (index );
36+
3037 return Mono .defer (
3138 () -> {
32- final Address address = addresses .get (currentIndex .getAndIncrement ());
39+ int increment = currentIndex .getAndIncrement ();
40+
41+ if (increment == addresses .size ()) {
42+ currentIndex .set (increment = 0 );
43+ }
44+
45+ final Address address = addresses .get (increment );
3346 return transport .requestResponse (address , request );
3447 })
35- .retry (addresses . size () - 1 );
48+ .retry (numRetries );
3649 });
3750 }
3851
0 commit comments