From 191f4058e264cb662e51ba16134fb03682044a3e Mon Sep 17 00:00:00 2001 From: Alexandre Montplaisir Date: Wed, 9 Sep 2015 19:46:08 -0400 Subject: [PATCH] Receive the event filter string in the Java agent Update to agent protocol 2.0, which now sends the filter string as part of the "enable event" command. Signed-off-by: Alexandre Montplaisir Signed-off-by: Mathieu Desnoyers --- .../agent/client/LttngTcpSessiondClient.java | 8 ++-- .../client/SessiondEnableEventCommand.java | 47 +++++++++++++++++-- 2 files changed, 46 insertions(+), 9 deletions(-) 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 d8788d32..6cf97138 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 @@ -42,8 +42,8 @@ public class LttngTcpSessiondClient implements Runnable { private static final String ROOT_PORT_FILE = "/var/run/lttng/agent.port"; private static final String USER_PORT_FILE = "/.lttng/agent.port"; - private static int protocolMajorVersion = 1; - private static int protocolMinorVersion = 0; + private static final int PROTOCOL_MAJOR_VERSION = 2; + private static final int PROTOCOL_MINOR_VERSION = 0; /** Command header from the session deamon. */ private final CountDownLatch registrationLatch = new CountDownLatch(1); @@ -211,8 +211,8 @@ public class LttngTcpSessiondClient implements Runnable { buf.putInt(domainValue); buf.putInt(Integer.parseInt(pid)); - buf.putInt(protocolMajorVersion); - buf.putInt(protocolMinorVersion); + buf.putInt(PROTOCOL_MAJOR_VERSION); + buf.putInt(PROTOCOL_MINOR_VERSION); this.outToSessiond.write(data, 0, data.length); this.outToSessiond.flush(); } diff --git a/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/client/SessiondEnableEventCommand.java b/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/client/SessiondEnableEventCommand.java index 388edc7d..c9183d19 100644 --- a/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/client/SessiondEnableEventCommand.java +++ b/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/client/SessiondEnableEventCommand.java @@ -33,7 +33,10 @@ import org.lttng.ust.agent.session.LogLevelSelector; */ class SessiondEnableEventCommand implements ISessiondCommand { - private static final int INT_SIZE = 4; + /** Fixed event name length. Value defined by the lttng agent protocol. */ + private static final int EVENT_NAME_LENGTH = 256; + + private final boolean commandIsValid; /* Parameters of the event rule being enabled */ private final String eventName; @@ -44,20 +47,54 @@ class SessiondEnableEventCommand implements ISessiondCommand { if (data == null) { throw new IllegalArgumentException(); } - int dataOffset = INT_SIZE * 2; - ByteBuffer buf = ByteBuffer.wrap(data); buf.order(ByteOrder.LITTLE_ENDIAN); int logLevel = buf.getInt(); int logLevelType = buf.getInt(); logLevelFilter = new LogLevelSelector(logLevel, logLevelType); - eventName = new String(data, dataOffset, data.length - dataOffset).trim(); - filterString = null; /* Not yet sent by the sessiond */ + /* Read the event name */ + byte[] eventNameBytes = new byte[EVENT_NAME_LENGTH]; + buf.get(eventNameBytes); + eventName = new String(eventNameBytes).trim(); + + /* + * Read the filter string. The buffer contains the length (number of + * bytes), then the bytes themselves. + * + * The length is represented as an unsigned int, but it should never + * be greater than Integer.MAX_VALUE. + */ + int filterStringLength = buf.getInt(); + if (filterStringLength < 0) { + /* + * The (unsigned) length is above what the sessiond should send. The + * command cannot be processed. + */ + filterString = null; + commandIsValid = false; + return; + } + if (filterStringLength == 0) { + /* There is explicitly no filter string */ + filterString = ""; + commandIsValid = true; + return; + } + + byte[] filterStringBytes = new byte[filterStringLength]; + buf.get(filterStringBytes); + filterString = new String(filterStringBytes).trim(); + + commandIsValid = true; } @Override public LttngAgentResponse execute(ILttngTcpClientListener agent) { + if (!commandIsValid) { + return LttngAgentResponse.FAILURE_RESPONSE; + } + EventRule rule = new EventRule(eventName, logLevelFilter, filterString); boolean success = agent.eventEnabled(rule); return (success ? LttngAgentResponse.SUCESS_RESPONSE : LttngAgentResponse.FAILURE_RESPONSE); -- 2.34.1