When reading from a TCP socket, there is no guarantee that the
read will return all the requested data. We need to loop and continue
reading until we gather all the expected data.
This fixes flakiness of the lttng-ust-java-tests.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
*/
private SessiondCommandHeader recvHeader() throws IOException {
byte data[] = new byte[SessiondCommandHeader.HEADER_SIZE];
*/
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);
}
}
return new SessiondCommandHeader(data);
}
*/
private byte[] recvPayload(SessiondCommandHeader headerCmd) throws IOException {
byte payload[] = new byte[(int) headerCmd.getDataSize()];
*/
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. */
/* Failsafe check so we don't waste our time reading 0 bytes. */
- if (payload.length == 0) {
- 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;