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();
}
}
}
* @return port value if found else 0.
*/
private static int getPortFromFile(String path) throws IOException {
- int port;
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(path), PORT_FILE_ENCODING));
String line = br.readLine();
- port = Integer.parseInt(line, 10);
+ if (line == null) {
+ /* File exists but is empty. */
+ return 0;
+ }
+
+ int port = Integer.parseInt(line, 10);
if (port < 0 || port > 65535) {
/* Invalid value. Ignore. */
port = 0;
}
+ return port;
+
+ } catch (NumberFormatException e) {
+ /* File contained something that was not a number. */
+ return 0;
} catch (FileNotFoundException e) {
/* No port available. */
- port = 0;
+ return 0;
} finally {
if (br != null) {
br.close();
}
}
-
- return port;
}
private void registerToSessiond() throws IOException {
/* 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. */
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;
}
{
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;
}
{
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();
}
*/
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);
}
*/
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;
}