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=9fa8c3acdbcfbc22cf3d873d184b9011835b414b;hb=c0c0989ab70574e09b2f7e8b48c2da6af664a849;hp=c035e5e2e31043d4899ba2dc1bf1ee940ad249e7;hpb=f35c6aa089659c7d16867ce4eac740d30c2c0213;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 c035e5e2..9fa8c3ac 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 @@ -1,19 +1,9 @@ /* - * Copyright (C) 2015-2016 EfficiOS Inc., Alexandre Montplaisir - * Copyright (C) 2013 - David Goulet + * SPDX-License-Identifier: LGPL-2.1-only * - * This library is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License, version 2.1 only, - * as published by the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Copyright (C) 2015-2016 EfficiOS Inc. + * Copyright (C) 2015-2016 Alexandre Montplaisir + * Copyright (C) 2013 David Goulet */ package org.lttng.ust.agent.client; @@ -133,11 +123,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(); } } } @@ -364,10 +374,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); } @@ -381,15 +398,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; }