Fix: Discard disable event command filter payload
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 6 Aug 2015 02:03:29 +0000 (22:03 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 6 Aug 2015 02:26:37 +0000 (22:26 -0400)
liblttng-ctl sends both the filter expression and filter bytecode
whenever lttng_disable_event_ext() is used _or_ when it is used
implicitly by lttng_disable_event() on an Agent domain (Log4j,
JUL or Python).

As of now, the session daemon ignores this filter payload.
However, on some rare occasions (the frequency of which depends
on the system's configuration and load), the second call to
sendmsg() done by liblttng-ctl could block and return an error
when the session daemon closed the socket (EPIPE).

This fix ensures the payload is received and discarded by the
session daemon, which in turn allows the client to handle the
session daemon's reply to the command.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-sessiond/main.c

index 792f519abbddb3cae7c2a1714a42ed96fff16361..d284debd695e76787189f5f5b7cae256a67bf3e2 100644 (file)
@@ -3267,8 +3267,34 @@ skip_domain:
        }
        case LTTNG_DISABLE_EVENT:
        {
+
+               /*
+                * FIXME: handle filter; for now we just receive the filter's
+                * bytecode along with the filter expression which are sent by
+                * liblttng-ctl and discard them.
+                *
+                * This fixes an issue where the client may block while sending
+                * the filter payload and encounter an error because the session
+                * daemon closes the socket without ever handling this data.
+                */
+               size_t count = cmd_ctx->lsm->u.disable.expression_len +
+                       cmd_ctx->lsm->u.disable.bytecode_len;
+
+               if (count) {
+                       char data[LTTNG_FILTER_MAX_LEN];
+
+                       DBG("Discarding disable event command payload of size %zu", count);
+                       while (count) {
+                               ret = lttcomm_recv_unix_sock(sock, data,
+                                       count > sizeof(data) ? sizeof(data) : count);
+                               if (ret < 0) {
+                                       goto error;
+                               }
+
+                               count -= (size_t) ret;
+                       }
+               }
                /* FIXME: passing packed structure to non-packed pointer */
-               /* TODO: handle filter */
                ret = cmd_disable_event(cmd_ctx->session, cmd_ctx->lsm->domain.type,
                                cmd_ctx->lsm->u.disable.channel_name,
                                &cmd_ctx->lsm->u.disable.event);
This page took 0.03609 seconds and 4 git commands to generate.