24
24
import java .util .concurrent .ConcurrentHashMap ;
25
25
import java .util .concurrent .CountDownLatch ;
26
26
import java .util .concurrent .TimeUnit ;
27
+ import java .util .concurrent .atomic .AtomicInteger ;
27
28
import java .util .stream .Collectors ;
28
29
import org .scion .jpan .*;
29
30
import org .scion .jpan .internal .PathRawParser ;
@@ -308,6 +309,7 @@ private Scmp.TracerouteMessage findFastestTR(List<Path> paths, Ref<Path> refBest
308
309
private Scmp .TracerouteMessage findFastestTRasync (List <Path > paths , Ref <Path > refBest ) {
309
310
ConcurrentHashMap <Integer , Scmp .TimedMessage > messages = new ConcurrentHashMap <>();
310
311
CountDownLatch barrier = new CountDownLatch (paths .size ());
312
+ AtomicInteger errors = new AtomicInteger ();
311
313
ScmpSenderAsync .ResponseHandler handler =
312
314
new ScmpSenderAsync .ResponseHandler () {
313
315
@ Override
@@ -324,13 +326,13 @@ public void onTimeout(Scmp.TimedMessage msg) {
324
326
325
327
@ Override
326
328
public void onError (Scmp .ErrorMessage msg ) {
327
- summary . incAsError ();
329
+ errors . incrementAndGet ();
328
330
barrier .countDown ();
329
331
}
330
332
331
333
@ Override
332
334
public void onException (Throwable t ) {
333
- summary . incAsError ();
335
+ errors . incrementAndGet ();
334
336
barrier .countDown ();
335
337
}
336
338
};
@@ -356,6 +358,11 @@ public void onException(Throwable t) {
356
358
throw new IllegalStateException (e );
357
359
}
358
360
361
+ if (errors .get () > 0 && messages .isEmpty ()) {
362
+ summary .incAsError ();
363
+ return null ;
364
+ }
365
+
359
366
Scmp .TracerouteMessage best = null ;
360
367
for (Scmp .TimedMessage tm : messages .values ()) {
361
368
Scmp .TracerouteMessage msg = (Scmp .TracerouteMessage ) tm ;
0 commit comments