14
14
15
15
package com .rabbitmq .stream .impl ;
16
16
17
+ import static com .rabbitmq .stream .impl .Tuples .pair ;
17
18
import static com .rabbitmq .stream .impl .Utils .*;
18
19
import static java .util .stream .Collectors .toList ;
19
20
import static java .util .stream .Collectors .toSet ;
30
31
import com .rabbitmq .stream .impl .Client .PublishErrorListener ;
31
32
import com .rabbitmq .stream .impl .Client .Response ;
32
33
import com .rabbitmq .stream .impl .Client .ShutdownListener ;
34
+ import com .rabbitmq .stream .impl .Tuples .Pair ;
33
35
import com .rabbitmq .stream .impl .Utils .ClientConnectionType ;
34
36
import com .rabbitmq .stream .impl .Utils .ClientFactory ;
35
37
import com .rabbitmq .stream .impl .Utils .ClientFactoryContext ;
@@ -219,10 +221,13 @@ List<BrokerWrapper> findCandidateNodes(String stream, boolean forceLeader) {
219
221
220
222
List <BrokerWrapper > candidates = new ArrayList <>();
221
223
Client .Broker leader = streamMetadata .getLeader ();
222
- if (leader == null && forceLeader ) {
223
- throw new IllegalStateException ("Not leader available for stream " + stream );
224
+ if (leader == null ) {
225
+ if (forceLeader ) {
226
+ throw new IllegalStateException ("Not leader available for stream " + stream );
227
+ }
228
+ } else {
229
+ candidates .add (new BrokerWrapper (leader , true ));
224
230
}
225
- candidates .add (new BrokerWrapper (leader , true ));
226
231
227
232
if (!forceLeader && streamMetadata .hasReplicas ()) {
228
233
candidates .addAll (
@@ -231,7 +236,11 @@ List<BrokerWrapper> findCandidateNodes(String stream, boolean forceLeader) {
231
236
.collect (toList ()));
232
237
}
233
238
234
- LOGGER .debug ("Candidates to publish to {}: {}" , stream , candidates );
239
+ if (candidates .isEmpty ()) {
240
+ throw new IllegalStateException ("No stream member available to publish for stream " + stream );
241
+ } else {
242
+ LOGGER .debug ("Candidates to publish to {}: {}" , stream , candidates );
243
+ }
235
244
236
245
return List .copyOf (candidates );
237
246
}
@@ -721,15 +730,20 @@ private ClientProducersManager(
721
730
722
731
private void assignProducersToNewManagers (
723
732
Collection <AgentTracker > trackers , String stream , BackOffDelayPolicy delayPolicy ) {
724
- AsyncRetry .asyncRetry (() -> findCandidateNodes (stream , forceLeader ))
733
+ AsyncRetry .asyncRetry (
734
+ () -> {
735
+ List <BrokerWrapper > candidates = findCandidateNodes (stream , forceLeader );
736
+ return pair (pickBroker (candidates ), candidates );
737
+ })
725
738
.description ("Candidate lookup to publish to " + stream )
726
739
.scheduler (environment .scheduledExecutorService ())
727
740
.retry (ex -> !(ex instanceof StreamDoesNotExistException ))
728
741
.delayPolicy (delayPolicy )
729
742
.build ()
730
743
.thenAccept (
731
- candidates -> {
732
- Broker broker = pickBroker (candidates );
744
+ brokerAndCandidates -> {
745
+ Broker broker = brokerAndCandidates .v1 ();
746
+ List <BrokerWrapper > candidates = brokerAndCandidates .v2 ();
733
747
String key = keyForNode (broker );
734
748
LOGGER .debug (
735
749
"Assigning {} producer(s) and consumer tracker(s) to {}" , trackers .size (), key );
@@ -805,15 +819,19 @@ private void recoverAgent(Broker node, List<BrokerWrapper> candidates, AgentTrac
805
819
tracker .identifiable () ? tracker .id () : "N/A" ,
806
820
tracker .stream ());
807
821
// maybe not a good candidate, let's refresh and retry for this one
808
- candidates =
809
- Utils .callAndMaybeRetry (
810
- () -> findCandidateNodes (tracker .stream (), forceLeader ),
822
+ Pair <Broker , List <BrokerWrapper >> brokerAndCandidates =
823
+ callAndMaybeRetry (
824
+ () -> {
825
+ List <BrokerWrapper > cs = findCandidateNodes (tracker .stream (), forceLeader );
826
+ return pair (pickBroker (cs ), cs );
827
+ },
811
828
ex -> !(ex instanceof StreamDoesNotExistException ),
812
829
environment .recoveryBackOffDelayPolicy (),
813
830
"Candidate lookup for %s on stream '%s'" ,
814
831
tracker .type (),
815
832
tracker .stream ());
816
- node = pickBroker (candidates );
833
+ node = brokerAndCandidates .v1 ();
834
+ candidates = brokerAndCandidates .v2 ();
817
835
} catch (Exception e ) {
818
836
LOGGER .warn (
819
837
"Error while re-assigning {} (stream '{}')" , tracker .type (), tracker .stream (), e );
0 commit comments