From 1b500e7ab6676535ce092106bf4f97929fc2dd54 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Wed, 26 Feb 2014 16:13:34 -0500 Subject: [PATCH] Fix: handle the registration done command for JUL Lockstep with lttng-ust. Part of the fix for issue #692 Signed-off-by: David Goulet --- src/bin/lttng-sessiond/jul-thread.c | 17 ++++++++++++++--- src/bin/lttng-sessiond/jul.c | 15 +++++++++++++++ src/bin/lttng-sessiond/jul.h | 1 + src/common/sessiond-comm/jul.h | 1 + tests/regression/ust/java-jul/test_java_jul | 8 ++++---- 5 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/bin/lttng-sessiond/jul-thread.c b/src/bin/lttng-sessiond/jul-thread.c index b4a71d798..9c924ea40 100644 --- a/src/bin/lttng-sessiond/jul-thread.c +++ b/src/bin/lttng-sessiond/jul-thread.c @@ -180,12 +180,13 @@ static void destroy_tcp_socket(struct lttcomm_sock *sock) /* * Handle a new JUL registration using the reg socket. After that, a new JUL * application is added to the global hash table and attach to an UST app - * object. + * object. If r_app is not NULL, the created app is set to the pointer. * * Return the new FD created upon accept() on success or else a negative errno * value. */ -static int handle_registration(struct lttcomm_sock *reg_sock) +static int handle_registration(struct lttcomm_sock *reg_sock, + struct jul_app **r_app) { int ret; pid_t pid; @@ -230,6 +231,10 @@ static int handle_registration(struct lttcomm_sock *reg_sock) * app and app before JUL. */ + if (r_app) { + *r_app = app; + } + return new_sock->fd; error_socket: @@ -319,16 +324,19 @@ restart: destroy_jul_app(pollfd); } else if (revents & (LPOLLIN)) { int new_fd; + struct jul_app *app = NULL; /* Pollin event of JUL app socket should NEVER happen. */ assert(pollfd == reg_sock->fd); - new_fd = handle_registration(reg_sock); + new_fd = handle_registration(reg_sock, &app); if (new_fd < 0) { WARN("[jul-thread] JUL registration failed. Ignoring."); /* Somehow the communication failed. Just continue. */ continue; } + /* Should not have a NULL app on success. */ + assert(app); /* Only add poll error event to only detect shutdown. */ ret = lttng_poll_add(&events, new_fd, @@ -340,6 +348,9 @@ restart: /* Update newly registered app. */ update_jul_app(new_fd); + + /* On failure, the poll will detect it and clean it up. */ + (void) jul_send_registration_done(app); } else { ERR("Unknown poll events %u for sock %d", revents, pollfd); continue; diff --git a/src/bin/lttng-sessiond/jul.c b/src/bin/lttng-sessiond/jul.c index 3c251998e..40730bb4f 100644 --- a/src/bin/lttng-sessiond/jul.c +++ b/src/bin/lttng-sessiond/jul.c @@ -344,6 +344,21 @@ error: return ret; } +/* + * Send back the registration DONE command to a given JUL application. + * + * Return 0 on success or else a negative value. + */ +int jul_send_registration_done(struct jul_app *app) +{ + assert(app); + assert(app->sock); + + DBG("JUL sending registration done to app socket %d", app->sock->fd); + + return send_header(app->sock, 0, JUL_CMD_REG_DONE, 0); +} + /* * Enable JUL event on every JUL applications registered with the session * daemon. diff --git a/src/bin/lttng-sessiond/jul.h b/src/bin/lttng-sessiond/jul.h index 1bcd5ef79..ccd59bc72 100644 --- a/src/bin/lttng-sessiond/jul.h +++ b/src/bin/lttng-sessiond/jul.h @@ -119,6 +119,7 @@ void jul_add_app(struct jul_app *app); void jul_delete_app(struct jul_app *app); struct jul_app *jul_find_app_by_sock(int sock); void jul_destroy_app(struct jul_app *app); +int jul_send_registration_done(struct jul_app *app); /* JUL action API */ int jul_enable_event(struct jul_event *event); diff --git a/src/common/sessiond-comm/jul.h b/src/common/sessiond-comm/jul.h index c9ab3d45a..f269fa816 100644 --- a/src/common/sessiond-comm/jul.h +++ b/src/common/sessiond-comm/jul.h @@ -30,6 +30,7 @@ enum lttcomm_jul_command { JUL_CMD_LIST = 1, JUL_CMD_ENABLE = 2, JUL_CMD_DISABLE = 3, + JUL_CMD_REG_DONE = 4, /* End registration process. */ }; /* diff --git a/tests/regression/ust/java-jul/test_java_jul b/tests/regression/ust/java-jul/test_java_jul index 6ea063859..affb7eb6d 100755 --- a/tests/regression/ust/java-jul/test_java_jul +++ b/tests/regression/ust/java-jul/test_java_jul @@ -66,7 +66,7 @@ function test_jul_before_start () destroy_lttng_session $SESSION_NAME # Validate test. Expecting all events. - trace_matches $EVENT_NAME $(($NR_ITER - 1)) $TRACE_PATH + trace_matches $EVENT_NAME $NR_ITER $TRACE_PATH if [ $? -ne 0 ]; then return $? fi @@ -89,7 +89,7 @@ function test_jul_after_start () destroy_lttng_session $SESSION_NAME # Validate test. Expecting all events. - trace_matches $EVENT_NAME $(($NR_ITER - 1)) $TRACE_PATH + trace_matches $EVENT_NAME $NR_ITER $TRACE_PATH if [ $? -ne 0 ]; then return $? fi @@ -112,7 +112,7 @@ function test_jul_loglevel () destroy_lttng_session $SESSION_NAME # Validate test. Expecting all events. - trace_matches $EVENT_NAME $(($NR_ITER - 1)) $TRACE_PATH + trace_matches $EVENT_NAME $NR_ITER $TRACE_PATH if [ $? -ne 0 ]; then return $? fi @@ -152,7 +152,7 @@ function test_jul_loglevel () destroy_lttng_session $SESSION_NAME # Validate test. Expecting all events. - trace_matches $EVENT_NAME $(($NR_ITER - 1)) $TRACE_PATH + trace_matches $EVENT_NAME $NR_ITER $TRACE_PATH return $? } -- 2.34.1