@@ -15,12 +15,22 @@ class NodeSelectorState {
1515 public fastestRecords : number [ ] ;
1616 public fastest : number ;
1717 public speedTestMode = 1 ;
18+ public unlikelyEveryoneFaultedChoiceIndex : number ;
1819
1920 constructor ( topology : Topology ) {
2021 this . topology = topology ;
2122 this . nodes = topology . nodes ;
2223 this . failures = ArrayUtil . range ( topology . nodes . length , ( ) => 0 ) ;
2324 this . fastestRecords = ArrayUtil . range ( topology . nodes . length , ( ) => 0 ) ;
25+ this . unlikelyEveryoneFaultedChoiceIndex = 0 ;
26+ }
27+
28+ public getNodeWhenEveryoneMarkedAsFaulted ( ) : CurrentIndexAndNode {
29+ const index = this . unlikelyEveryoneFaultedChoiceIndex ;
30+ this . unlikelyEveryoneFaultedChoiceIndex = ( this . unlikelyEveryoneFaultedChoiceIndex + 1 ) % this . nodes . length ;
31+
32+
33+ return new CurrentIndexAndNode ( index , this . nodes [ index ] ) ;
2434 }
2535}
2636
@@ -91,18 +101,11 @@ export class NodeSelector {
91101
92102 public getRequestedNode ( nodeTag : string ) : CurrentIndexAndNode {
93103 const state = this . _state ;
94-
95- const stateFailures = state . failures ;
96104 const serverNodes = state . nodes ;
97- const len = Math . min ( serverNodes . length , stateFailures . length ) ;
98105
99- for ( let i = 0 ; i < len ; i ++ ) {
106+ for ( let i = 0 ; i < serverNodes . length ; i ++ ) {
100107 if ( serverNodes [ i ] . clusterTag === nodeTag ) {
101- if ( stateFailures [ i ] === 0 && ! StringUtil . isNullOrEmpty ( serverNodes [ i ] . url ) ) {
102- return new CurrentIndexAndNode ( i , serverNodes [ i ] ) ;
103- }
104-
105- throwError ( "RequestedNodeUnavailableException" , "Requested node " + nodeTag + " currently unavailable, please try again later." ) ;
108+ return new CurrentIndexAndNode ( i , serverNodes [ i ] ) ;
106109 }
107110 }
108111
@@ -113,6 +116,10 @@ export class NodeSelector {
113116 throwError ( "RequestedNodeUnavailableException" , "Could not find requested node " + nodeTag ) ;
114117 }
115118
119+ public nodeIsAvailable ( index : number ) {
120+ return this . _state . failures [ index ] === 0 ;
121+ }
122+
116123 public getPreferredNode ( ) : CurrentIndexAndNode {
117124 const state = this . _state ;
118125 return NodeSelector . getPreferredNodeInternal ( state ) ;
@@ -124,7 +131,7 @@ export class NodeSelector {
124131 const len = Math . min ( serverNodes . length , stateFailures . length ) ;
125132
126133 for ( let i = 0 ; i < len ; i ++ ) {
127- if ( stateFailures [ i ] === 0 && serverNodes [ i ] . url ) {
134+ if ( stateFailures [ i ] === 0 ) {
128135 return new CurrentIndexAndNode ( i , serverNodes [ i ] ) ;
129136 }
130137 }
@@ -144,13 +151,13 @@ export class NodeSelector {
144151 }
145152
146153 private static _unlikelyEveryoneFaultedChoice ( state : NodeSelectorState ) : CurrentIndexAndNode {
147- // if there are all marked as failed, we'll chose the first
154+ // if there are all marked as failed, we'll choose the next (the one in CurrentNodeIndex)
148155 // one so the user will get an error (or recover :-) );
149156 if ( state . nodes . length === 0 ) {
150157 throwError ( "DatabaseDoesNotExistException" , "There are no nodes in the topology at all." ) ;
151158 }
152159
153- return new CurrentIndexAndNode ( 0 , state . nodes [ 0 ] ) ;
160+ return state . getNodeWhenEveryoneMarkedAsFaulted ( ) ;
154161 }
155162
156163 public getFastestNode ( ) : CurrentIndexAndNode {
0 commit comments