cmd-generic.c cmd-generic.h \
cmd-2-1.c cmd-2-1.h \
cmd-2-2.c cmd-2-2.h \
- cmd-2-4.c cmd-2-4.h
+ cmd-2-4.c cmd-2-4.h \
+ health-relayd.h
# link on liblttngctl for check if relayd is already alive.
lttng_relayd_LDADD = -lrt -lurcu-common -lurcu \
$(top_builddir)/src/common/hashtable/libhashtable.la \
$(top_builddir)/src/common/libcommon.la \
$(top_builddir)/src/common/compat/libcompat.la \
- $(top_builddir)/src/common/index/libindex.la
+ $(top_builddir)/src/common/index/libindex.la \
+ $(top_builddir)/src/common/health/libhealth.la
--- /dev/null
+#ifndef HEALTH_RELAYD_H
+#define HEALTH_RELAYD_H
+
+/*
+ * Copyright (C) 2012 - David Goulet <dgoulet@efficios.com>
+ * Copyright (C) 2013 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License, version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This program 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 General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <lttng/health-internal.h>
+
+enum health_type {
+ HEALTH_RELAYD_TYPE_DISPATCHER = 0,
+ HEALTH_RELAYD_TYPE_WORKER = 1,
+ HEALTH_RELAYD_TYPE_LISTENER = 2,
+
+ NR_HEALTH_RELAYD_TYPES,
+};
+
+#endif /* HEALTH_RELAYD_H */
#include "utils.h"
#include "lttng-relayd.h"
#include "live.h"
+#include "health-relayd.h"
/* command line options */
char *opt_output_path;
/* Global hash table that stores relay index object. */
struct lttng_ht *indexes_ht;
+/* Relayd health monitoring */
+static struct health_app *health_relayd;
+
/*
* usage function on stderr
*/
DBG("[thread] Relay listener started");
+ health_register(health_relayd, HEALTH_RELAYD_TYPE_LISTENER);
+
control_sock = relay_init_sock(control_uri);
if (!control_sock) {
goto error_sock_control;
if (err) {
DBG("Thread exited with error");
}
+ health_unregister(health_relayd);
DBG("Relay listener thread cleanup complete");
stop_threads();
return NULL;
DBG("[thread] Relay dispatcher started");
+ health_register(health_relayd, HEALTH_RELAYD_TYPE_DISPATCHER);
+
while (!CMM_LOAD_SHARED(dispatch_thread_exit)) {
/* Atomically prepare the queue futex */
futex_nto1_prepare(&relay_cmd_queue.futex);
}
error:
+ health_unregister(health_relayd);
DBG("Dispatch thread dying");
stop_threads();
return NULL;
rcu_register_thread();
+ health_register(health_relayd, HEALTH_RELAYD_TYPE_WORKER);
+
/* table of connections indexed on socket */
relay_connections_ht = lttng_ht_new(0, LTTNG_HT_TYPE_ULONG);
if (!relay_connections_ht) {
if (err) {
DBG("Thread exited with error");
}
+ health_unregister(health_relayd);
DBG("Worker thread cleanup complete");
free(data_buffer);
stop_threads();
goto exit_relay_ctx_viewer_streams;
}
+ /* Initialize thread health monitoring */
+ health_relayd = health_app_create(NR_HEALTH_RELAYD_TYPES);
+ if (!health_relayd) {
+ PERROR("health_app_create error");
+ goto exit_health_app_create;
+ }
+
/* Setup the dispatcher thread */
ret = pthread_create(&dispatcher_thread, NULL,
relay_thread_dispatcher, (void *) NULL);
}
exit_dispatcher:
+ health_app_destroy(health_relayd);
+
+exit_health_app_create:
lttng_ht_destroy(viewer_streams_ht);
exit_relay_ctx_viewer_streams: