improve logging of happy eyeball

This commit is contained in:
genofire 2020-02-09 12:19:00 +01:00
parent 3df33228a8
commit e54a2cc04e
No known key found for this signature in database
GPG Key ID: 9D7D3C6BFF600C6A
1 changed files with 31 additions and 12 deletions

View File

@ -136,14 +136,12 @@ public class Resolver {
threads[2].interrupt(); threads[2].interrupt();
synchronized (results) { synchronized (results) {
Collections.sort(results); Collections.sort(results);
Log.d(Config.LOGTAG, Resolver.class.getSimpleName() + ": " + results.toString());
return happyEyeball(results); return happyEyeball(results);
} }
} else { } else {
threads[2].join(); threads[2].join();
synchronized (fallbackResults) { synchronized (fallbackResults) {
Collections.sort(fallbackResults); Collections.sort(fallbackResults);
Log.d(Config.LOGTAG, Resolver.class.getSimpleName() + ": " + fallbackResults.toString());
return happyEyeball(fallbackResults); return happyEyeball(fallbackResults);
} }
} }
@ -262,16 +260,23 @@ public class Resolver {
} }
private static Result happyEyeball(List<Result> r) { private static Result happyEyeball(List<Result> r) {
String logID = Long.toHexString(Double.doubleToLongBits(Math.random()));
Log.d(Config.LOGTAG, Resolver.class.getSimpleName() + ": happy eyeball (" + logID + ") with " + r.toString());
if (r.size() == 0) return null; if (r.size() == 0) return null;
Result result; Result result;
if (r.size() == 1) { if (r.size() == 1) {
result = r.get(0); result = r.get(0);
result.setLogID(logID);
result.connect(); result.connect();
return result; return result;
} }
ExecutorService executor = (ExecutorService) Executors.newFixedThreadPool(4); for (Result res : r) {
res.setLogID(logID);
}
ExecutorService executor = Executors.newFixedThreadPool(4);
try { try {
result = executor.invokeAny(r); result = executor.invokeAny(r);
@ -280,22 +285,22 @@ public class Resolver {
while (true) { while (true) {
try { try {
if (executor.awaitTermination(5, TimeUnit.SECONDS)) break; if (executor.awaitTermination(5, TimeUnit.SECONDS)) break;
Log.d(Config.LOGTAG, Resolver.class.getSimpleName() + ": happy eyeball wait for cleanup ..."); Log.d(Config.LOGTAG, Resolver.class.getSimpleName() + ": happy eyeball (" + logID + ") wait for cleanup ...");
} catch (InterruptedException e) {} } catch (InterruptedException e) {}
} }
Log.i(Config.LOGTAG, Resolver.class.getSimpleName() + ": happy eyeball cleanup"); Log.i(Config.LOGTAG, Resolver.class.getSimpleName() + ": happy eyeball (" + logID + ") cleanup");
for (Result re : r) { for (Result re : r) {
if(!re.equals(result)) re.disconnect(); if(!re.equals(result)) re.disconnect();
} }
}); });
disconnector.start(); disconnector.start();
Log.i(Config.LOGTAG, Resolver.class.getSimpleName() + ": happy eyeball used: " + result.toString()); Log.i(Config.LOGTAG, Resolver.class.getSimpleName() + ": happy eyeball (" + logID + ") used: " + result.toString());
return result; return result;
} catch (InterruptedException e) { } catch (InterruptedException e) {
Log.e(Config.LOGTAG, Resolver.class.getSimpleName() + ": happy eyeball failed: ", e); Log.e(Config.LOGTAG, Resolver.class.getSimpleName() + ": happy eyeball (" + logID + ") failed: ", e);
return null; return null;
} catch (ExecutionException e) { } catch (ExecutionException e) {
Log.i(Config.LOGTAG, Resolver.class.getSimpleName() + ": happy eyeball unable to connect to one address"); Log.i(Config.LOGTAG, Resolver.class.getSimpleName() + ": happy eyeball (" + logID + ") unable to connect to one address");
return null; return null;
} }
} }
@ -320,6 +325,8 @@ public class Resolver {
private int priority; private int priority;
private Socket socket; private Socket socket;
private String logID;
static Result fromRecord(SRV srv, boolean directTls) { static Result fromRecord(SRV srv, boolean directTls) {
Result result = new Result(); Result result = new Result();
result.port = srv.port; result.port = srv.port;
@ -383,7 +390,7 @@ public class Resolver {
public String toString() { public String toString() {
return "Result{" + return "Result{" +
"ip='" + (ip == null ? null : ip.getHostAddress()) + '\'' + "ip='" + (ip == null ? null : ip.getHostAddress()) + '\'' +
", hostame='" + (hostname == null ? null : hostname.toString()) + '\'' + ", hostname='" + (hostname == null ? null : hostname.toString()) + '\'' +
", port=" + port + ", port=" + port +
", directTls=" + directTls + ", directTls=" + directTls +
", authenticated=" + authenticated + ", authenticated=" + authenticated +
@ -401,7 +408,11 @@ public class Resolver {
long time = System.currentTimeMillis(); long time = System.currentTimeMillis();
this.socket.connect(addr, Config.SOCKET_TIMEOUT * 1000); this.socket.connect(addr, Config.SOCKET_TIMEOUT * 1000);
time = System.currentTimeMillis() - time; time = System.currentTimeMillis() - time;
Log.d(Config.LOGTAG, Resolver.class.getSimpleName() + ": Result connect: " + toString() + " after: " + time + " ms"); if (!this.logID.isEmpty()) {
Log.d(Config.LOGTAG, Resolver.class.getSimpleName() + ": Result (" + this.logID + ") connect: " + toString() + " after: " + time + " ms");
} else {
Log.d(Config.LOGTAG, Resolver.class.getSimpleName() + ": Result connect: " + toString() + " after: " + time + " ms");
}
} catch (IOException e) { } catch (IOException e) {
this.disconnect(); this.disconnect();
} }
@ -411,10 +422,18 @@ public class Resolver {
if (this.socket != null ) { if (this.socket != null ) {
FileBackend.close(this.socket); FileBackend.close(this.socket);
this.socket = null; this.socket = null;
Log.d(Config.LOGTAG, Resolver.class.getSimpleName() + ": Result disconnect: " + toString()); if (!this.logID.isEmpty()) {
Log.d(Config.LOGTAG, Resolver.class.getSimpleName() + ": Result (" + this.logID + ") disconnect: " + toString());
} else {
Log.d(Config.LOGTAG, Resolver.class.getSimpleName() + ": Result disconnect: " + toString());
}
} }
} }
public void setLogID(String logID) {
this.logID = logID;
}
@Override @Override
public int compareTo(@NonNull Result result) { public int compareTo(@NonNull Result result) {
if (result.priority == priority) { if (result.priority == priority) {
@ -431,7 +450,7 @@ public class Resolver {
public Result call() throws Exception { public Result call() throws Exception {
this.connect(); this.connect();
if (this.socket != null && this.socket.isConnected()) { if (this.socket != null && this.socket.isConnected()) {
return this ; return this;
} }
throw new Exception("Resolver.Result was not possible to connect - should be catched by executor"); throw new Exception("Resolver.Result was not possible to connect - should be catched by executor");
} }