3838import java .util .Map ;
3939import java .util .NavigableMap ;
4040import java .util .NavigableSet ;
41- import java .util .Objects ;
4241import java .util .Queue ;
4342import java .util .TreeMap ;
4443import java .util .TreeSet ;
112111import org .apache .ignite .spi .discovery .tcp .messages .TcpDiscoveryDuplicateIdMessage ;
113112import org .apache .ignite .spi .discovery .tcp .messages .TcpDiscoveryHandshakeRequest ;
114113import org .apache .ignite .spi .discovery .tcp .messages .TcpDiscoveryHandshakeResponse ;
115- import org .apache .ignite .spi .discovery .tcp .messages .TcpDiscoveryInfoRequest ;
116- import org .apache .ignite .spi .discovery .tcp .messages .TcpDiscoveryInfoResponse ;
117114import org .apache .ignite .spi .discovery .tcp .messages .TcpDiscoveryJoinRequestMessage ;
118115import org .apache .ignite .spi .discovery .tcp .messages .TcpDiscoveryMetricsUpdateMessage ;
119116import org .apache .ignite .spi .discovery .tcp .messages .TcpDiscoveryNodeAddFinishedMessage ;
@@ -609,52 +606,13 @@ else if (state == DISCONNECTED) {
609606 Collections .swap (addrs , idx , 0 );
610607 }
611608
612- Collection < InetSocketAddress > addrs0 = new ArrayList <>( addrs );
609+ T2 < Boolean , T3 < SocketStream , Integer , Boolean >> waitAndRes = sendJoinRequests ( prevAddr != null , addrs );
613610
614- boolean wait = false ;
611+ boolean wait = waitAndRes .get1 ();
612+ T3 <SocketStream , Integer , Boolean > res = waitAndRes .get2 ();
615613
616- for (int i = addrs .size () - 1 ; i >= 0 ; i --) {
617- if (Thread .currentThread ().isInterrupted ())
618- throw new InterruptedException ();
619-
620- InetSocketAddress addr = addrs .get (i );
621-
622- boolean recon = prevAddr != null ;
623-
624- T3 <SocketStream , Integer , Boolean > sockAndRes = sendJoinRequest (recon , addr );
625-
626- if (sockAndRes == null ) {
627- addrs .remove (i );
628-
629- continue ;
630- }
631-
632- assert sockAndRes .get1 () != null && sockAndRes .get2 () != null : sockAndRes ;
633-
634- Socket sock = sockAndRes .get1 ().socket ();
635-
636- if (log .isDebugEnabled ())
637- log .debug ("Received response to join request [addr=" + addr + ", res=" + sockAndRes .get2 () + ']' );
638-
639- switch (sockAndRes .get2 ()) {
640- case RES_OK :
641- return new T2 <>(sockAndRes .get1 (), sockAndRes .get3 ());
642-
643- case RES_CONTINUE_JOIN :
644- case RES_WAIT :
645- wait = true ;
646-
647- U .closeQuiet (sock );
648-
649- break ;
650-
651- default :
652- if (log .isDebugEnabled ())
653- log .debug ("Received unexpected response to join request: " + sockAndRes .get2 ());
654-
655- U .closeQuiet (sock );
656- }
657- }
614+ if (res != null )
615+ return new T2 <>(waitAndRes .get2 ().get1 (), waitAndRes .get2 ().get3 ());
658616
659617 if (timeout > 0 && U .millisSinceNanos (startNanos ) > timeout )
660618 return null ;
@@ -668,13 +626,54 @@ else if (state == DISCONNECTED) {
668626 else if (addrs .isEmpty ()) {
669627 LT .warn (log , "Failed to connect to any address from IP finder (will retry to join topology " +
670628 "every " + spi .getReconnectDelay () + " ms; change 'reconnectDelay' to configure the frequency " +
671- "of retries): " + toOrderedList (addrs0 ), true );
629+ "of retries): " + toOrderedList (addrs ), true );
672630
673631 sleepEx (spi .getReconnectDelay (), beforeEachSleep , afterEachSleep );
674632 }
675633 }
676634 }
677635
636+ private T2 <Boolean , T3 <SocketStream , Integer , Boolean >> sendJoinRequests (
637+ boolean recon ,
638+ Collection <InetSocketAddress > addrs
639+ ) throws InterruptedException {
640+ for (InetSocketAddress addr : addrs ) {
641+ if (Thread .currentThread ().isInterrupted ())
642+ throw new InterruptedException ();
643+
644+ T3 <SocketStream , Integer , Boolean > sockAndRes = sendJoinRequest (recon , addr );
645+
646+ if (sockAndRes == null )
647+ continue ;
648+
649+ assert sockAndRes .get1 () != null && sockAndRes .get2 () != null : sockAndRes ;
650+
651+ Socket sock = sockAndRes .get1 ().socket ();
652+
653+ if (log .isDebugEnabled ())
654+ log .debug ("Received response to join request [addr=" + addr + ", res=" + sockAndRes .get2 () + ']' );
655+
656+ switch (sockAndRes .get2 ()) {
657+ case RES_OK :
658+ return new T2 <>(false , sockAndRes );
659+
660+ case RES_CONTINUE_JOIN :
661+ case RES_WAIT :
662+ U .closeQuiet (sock );
663+
664+ return new T2 <>(true , null );
665+
666+ default :
667+ if (log .isDebugEnabled ())
668+ log .debug ("Received unexpected response to join request: " + sockAndRes .get2 ());
669+
670+ U .closeQuiet (sock );
671+ }
672+ }
673+
674+ return new T2 <>(false , null );
675+ }
676+
678677 /** */
679678 private static void sleepEx (long millis , Runnable before , Runnable after ) throws InterruptedException {
680679 if (before != null )
@@ -695,7 +694,7 @@ private static void sleepEx(long millis, Runnable before, Runnable after) throws
695694 * @return Socket, connect response and client acknowledge support flag.
696695 */
697696 @ Nullable private T3 <SocketStream , Integer , Boolean > sendJoinRequest (boolean recon ,
698- InetSocketAddress addr ) {
697+ InetSocketAddress addr ) throws InterruptedException {
699698 assert addr != null ;
700699
701700 if (log .isDebugEnabled ())
@@ -730,28 +729,23 @@ private static void sleepEx(long millis, Runnable before, Runnable after) throws
730729 sock = spi .openSocket (addr , timeoutHelper );
731730 out = spi .socketStream (sock );
732731
733- openSock = true ;
734-
735- TcpDiscoveryInfoRequest infoReq = new TcpDiscoveryInfoRequest (locNodeId );
736-
737- spi .writeToSocket (sock , out , infoReq , timeoutHelper .nextTimeoutChunk (spi .getSocketTimeout ()));
738-
739- TcpDiscoveryInfoResponse infoRes = spi .readMessage (sock , null , ackTimeout0 );
740-
741- if (locNode .dataCenterId () != null && !Objects .equals (locNode .dataCenterId (), infoRes .node ().dataCenterId ()))
742- return null ;
743-
744- sock = spi .openSocket (addr , timeoutHelper );
745- out = spi .socketStream (sock );
746-
747732 TcpDiscoveryHandshakeRequest req = new TcpDiscoveryHandshakeRequest (locNodeId );
748733
749734 req .client (true );
735+ req .dcId (locNode .dataCenterId ());
750736
751737 spi .writeToSocket (sock , out , req , timeoutHelper .nextTimeoutChunk (spi .getSocketTimeout ()));
752738
753739 TcpDiscoveryHandshakeResponse res = spi .readMessage (sock , null , ackTimeout0 );
754740
741+ if (res .redirectAddresses () != null ) {
742+ T2 <Boolean , T3 <SocketStream , Integer , Boolean >> redirectedRes = sendJoinRequests (recon , res .redirectAddresses ());
743+
744+ U .closeQuiet (sock );
745+
746+ return redirectedRes .get2 ();
747+ }
748+
755749 UUID rmtNodeId = res .creatorNodeId ();
756750
757751 assert rmtNodeId != null ;
0 commit comments