X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust-java-agent%2Fjava%2Flttng-ust-agent-common%2Forg%2Flttng%2Fust%2Fagent%2Fclient%2FLttngTcpSessiondClient.java;h=c63850050444ad42a47a8dccce94b3b30f2b638e;hb=dcd9a9d798f85ccee281d66f85ff4a9b5520a088;hp=a0adceae6d32b0e9c1f9031b20dc422b07953678;hpb=8d8c99c9eed441026e2dad93b685f2004034a321;p=lttng-ust.git diff --git a/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/client/LttngTcpSessiondClient.java b/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/client/LttngTcpSessiondClient.java index a0adceae..c6385005 100644 --- a/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/client/LttngTcpSessiondClient.java +++ b/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/client/LttngTcpSessiondClient.java @@ -133,11 +133,31 @@ public class LttngTcpSessiondClient implements Runnable { handleSessiondCmd(); } catch (UnknownHostException uhe) { uhe.printStackTrace(); + /* + * Terminate agent thread. + */ + close(); } catch (IOException ioe) { + /* + * I/O exception may have been triggered by a session daemon + * closing the socket. Close our own socket and + * retry connecting after a delay. + */ try { + if (this.sessiondSock != null) { + this.sessiondSock.close(); + } Thread.sleep(3000); } catch (InterruptedException e) { - e.printStackTrace(); + /* + * Retry immediately if sleep is interrupted. + */ + } catch (IOException closeioe) { + closeioe.printStackTrace(); + /* + * Terminate agent thread. + */ + close(); } } } @@ -254,7 +274,7 @@ public class LttngTcpSessiondClient implements Runnable { /* Data read from the socket */ byte inputData[] = null; /* Reply data written to the socket, sent to the sessiond */ - byte responseData[] = null; + LttngAgentResponse response; while (true) { /* Get header from session daemon. */ @@ -282,8 +302,7 @@ public class LttngTcpSessiondClient implements Runnable { case CMD_LIST: { SessiondCommand listLoggerCmd = new SessiondListLoggersCommand(); - LttngAgentResponse response = listLoggerCmd.execute(logAgent); - responseData = response.getBytes(); + response = listLoggerCmd.execute(logAgent); log("Received list loggers command"); break; } @@ -291,38 +310,35 @@ public class LttngTcpSessiondClient implements Runnable { { if (inputData == null) { /* Invalid command */ - responseData = LttngAgentResponse.FAILURE_RESPONSE.getBytes(); + response = LttngAgentResponse.FAILURE_RESPONSE; break; } SessiondCommand enableEventCmd = new SessiondEnableEventCommand(inputData); - LttngAgentResponse response = enableEventCmd.execute(logAgent); - responseData = response.getBytes(); - log("Received enable event command"); + response = enableEventCmd.execute(logAgent); + log("Received enable event command: " + enableEventCmd.toString()); break; } case CMD_EVENT_DISABLE: { if (inputData == null) { /* Invalid command */ - responseData = LttngAgentResponse.FAILURE_RESPONSE.getBytes(); + response = LttngAgentResponse.FAILURE_RESPONSE; break; } SessiondCommand disableEventCmd = new SessiondDisableEventCommand(inputData); - LttngAgentResponse response = disableEventCmd.execute(logAgent); - responseData = response.getBytes(); - log("Received disable event command"); + response = disableEventCmd.execute(logAgent); + log("Received disable event command: " + disableEventCmd.toString()); break; } case CMD_APP_CTX_ENABLE: { if (inputData == null) { /* This commands expects a payload, invalid command */ - responseData = LttngAgentResponse.FAILURE_RESPONSE.getBytes(); + response = LttngAgentResponse.FAILURE_RESPONSE; break; } SessiondCommand enableAppCtxCmd = new SessiondEnableAppContextCommand(inputData); - LttngAgentResponse response = enableAppCtxCmd.execute(logAgent); - responseData = response.getBytes(); + response = enableAppCtxCmd.execute(logAgent); log("Received enable app-context command"); break; } @@ -330,28 +346,33 @@ public class LttngTcpSessiondClient implements Runnable { { if (inputData == null) { /* This commands expects a payload, invalid command */ - responseData = LttngAgentResponse.FAILURE_RESPONSE.getBytes(); + response = LttngAgentResponse.FAILURE_RESPONSE; break; } SessiondCommand disableAppCtxCmd = new SessiondDisableAppContextCommand(inputData); - LttngAgentResponse response = disableAppCtxCmd.execute(logAgent); - responseData = response.getBytes(); + response = disableAppCtxCmd.execute(logAgent); log("Received disable app-context command"); break; } default: { /* Unknown command, send empty reply */ - responseData = new byte[4]; - ByteBuffer buf = ByteBuffer.wrap(responseData); - buf.order(ByteOrder.BIG_ENDIAN); + response = null; log("Received unknown command, ignoring"); break; } } /* Send response to the session daemon. */ - log("Sending response"); + byte[] responseData; + if (response == null) { + responseData = new byte[4]; + ByteBuffer buf = ByteBuffer.wrap(responseData); + buf.order(ByteOrder.BIG_ENDIAN); + } else { + log("Sending response: " + response.toString()); + responseData = response.getBytes(); + } this.outToSessiond.write(responseData, 0, responseData.length); this.outToSessiond.flush(); } @@ -363,10 +384,17 @@ public class LttngTcpSessiondClient implements Runnable { */ private SessiondCommandHeader recvHeader() throws IOException { byte data[] = new byte[SessiondCommandHeader.HEADER_SIZE]; + int bytesLeft = data.length; + int bytesOffset = 0; - int readLen = this.inFromSessiond.read(data, 0, data.length); - if (readLen != data.length) { - throw new IOException(); + while (bytesLeft > 0) { + int bytesRead = this.inFromSessiond.read(data, bytesOffset, bytesLeft); + + if (bytesRead < 0) { + throw new IOException(); + } + bytesLeft -= bytesRead; + bytesOffset += bytesRead; } return new SessiondCommandHeader(data); } @@ -380,15 +408,22 @@ public class LttngTcpSessiondClient implements Runnable { */ private byte[] recvPayload(SessiondCommandHeader headerCmd) throws IOException { byte payload[] = new byte[(int) headerCmd.getDataSize()]; + int bytesLeft = payload.length; + int bytesOffset = 0; /* Failsafe check so we don't waste our time reading 0 bytes. */ - if (payload.length == 0) { + if (bytesLeft == 0) { return null; } - int read = inFromSessiond.read(payload, 0, payload.length); - if (read != payload.length) { - throw new IOException("Unexpected number of bytes read in sessiond command payload"); + while (bytesLeft > 0) { + int bytesRead = inFromSessiond.read(payload, bytesOffset, bytesLeft); + + if (bytesRead < 0) { + throw new IOException(); + } + bytesLeft -= bytesRead; + bytesOffset += bytesRead; } return payload; }