Fix: assign values to relayd connection type enum
[lttng-tools.git] / src / bin / lttng-relayd / main.c
index 43e6f318aef9eec57daecb9a6106f4b314c9296b..2208144dc4a3fd53858164c8e8b39211673030df 100644 (file)
@@ -111,6 +111,9 @@ static gid_t relayd_gid;
 /* Global relay stream hash table. */
 struct lttng_ht *relay_streams_ht;
 
+/* Global relay viewer stream hash table. */
+struct lttng_ht *viewer_streams_ht;
+
 /*
  * usage function on stderr
  */
@@ -761,6 +764,48 @@ void deferred_free_session(struct rcu_head *head)
        free(session);
 }
 
+static void close_stream(struct relay_stream *stream,
+               struct lttng_ht *ctf_traces_ht)
+{
+       int delret;
+       struct relay_viewer_stream *vstream;
+       struct lttng_ht_iter iter;
+
+       assert(stream);
+
+       delret = close(stream->fd);
+       if (delret < 0) {
+               PERROR("close stream");
+       }
+
+       if (stream->index_fd >= 0) {
+               delret = close(stream->index_fd);
+               if (delret < 0) {
+                       PERROR("close stream index_fd");
+               }
+       }
+
+       vstream = live_find_viewer_stream_by_id(stream->stream_handle);
+       if (vstream) {
+               /*
+                * Set the last good value into the viewer stream. This is done
+                * right before the stream gets deleted from the hash table. The
+                * lookup failure on the live thread side of a stream indicates
+                * that the viewer stream index received value should be used.
+                */
+               vstream->total_index_received = stream->total_index_received;
+       }
+
+       iter.iter.node = &stream->stream_n.node;
+       delret = lttng_ht_del(relay_streams_ht, &iter);
+       assert(!delret);
+       iter.iter.node = &stream->ctf_trace_node.node;
+       delret = lttng_ht_del(ctf_traces_ht, &iter);
+       assert(!delret);
+       call_rcu(&stream->rcu_node, deferred_free_stream);
+       DBG("Closed tracefile %d from close stream", stream->fd);
+}
+
 /*
  * relay_delete_session: Free all memory associated with a session and
  * close all the FDs
@@ -1029,14 +1074,13 @@ err_free_stream:
  */
 static
 int relay_close_stream(struct lttcomm_relayd_hdr *recv_hdr,
-               struct relay_command *cmd, struct lttng_ht *viewer_streams_ht)
+               struct relay_command *cmd)
 {
+       int ret, send_ret;
        struct relay_session *session = cmd->session;
        struct lttcomm_relayd_close_stream stream_info;
        struct lttcomm_relayd_generic_reply reply;
        struct relay_stream *stream;
-       int ret, send_ret;
-       struct lttng_ht_iter iter;
 
        DBG("Close stream received");
 
@@ -1070,42 +1114,7 @@ int relay_close_stream(struct lttcomm_relayd_hdr *recv_hdr,
        stream->close_flag = 1;
 
        if (close_stream_check(stream)) {
-               int delret;
-               struct relay_viewer_stream *vstream;
-
-               delret = close(stream->fd);
-               if (delret < 0) {
-                       PERROR("close stream");
-               }
-
-               if (stream->index_fd >= 0) {
-                       delret = close(stream->index_fd);
-                       if (delret < 0) {
-                               PERROR("close stream index_fd");
-                       }
-               }
-
-               vstream = live_find_viewer_stream_by_id(stream->stream_handle,
-                               viewer_streams_ht);
-               if (vstream) {
-                       /*
-                        * Set the last good value into the viewer stream. This is done
-                        * right before the stream gets deleted from the hash table. The
-                        * lookup failure on the live thread side of a stream indicates
-                        * that the viewer stream index received value should be used.
-                        */
-                       vstream->total_index_received = stream->total_index_received;
-               }
-
-               iter.iter.node = &stream->stream_n.node;
-               delret = lttng_ht_del(relay_streams_ht, &iter);
-               assert(!delret);
-               iter.iter.node = &stream->ctf_trace_node.node;
-               delret = lttng_ht_del(cmd->ctf_traces_ht, &iter);
-               assert(!delret);
-               call_rcu(&stream->rcu_node,
-                               deferred_free_stream);
-               DBG("Closed tracefile %d from close stream", stream->fd);
+               close_stream(stream, cmd->ctf_traces_ht);
        }
 
 end_unlock:
@@ -1795,7 +1804,7 @@ int relay_process_control(struct lttcomm_relayd_hdr *recv_hdr,
                ret = relay_send_version(recv_hdr, cmd, ctx->sessions_ht);
                break;
        case RELAYD_CLOSE_STREAM:
-               ret = relay_close_stream(recv_hdr, cmd, ctx->viewer_streams_ht);
+               ret = relay_close_stream(recv_hdr, cmd);
                break;
        case RELAYD_DATA_PENDING:
                ret = relay_data_pending(recv_hdr, cmd);
@@ -2001,24 +2010,7 @@ int relay_process_data(struct relay_command *cmd,
 
        /* Check if we need to close the FD */
        if (close_stream_check(stream)) {
-               int cret;
-               struct lttng_ht_iter iter;
-
-               cret = close(stream->fd);
-               if (cret < 0) {
-                       PERROR("close stream process data");
-               }
-
-               cret = close(stream->index_fd);
-               if (cret < 0) {
-                       PERROR("close stream index_fd");
-               }
-               iter.iter.node = &stream->stream_n.node;
-               ret = lttng_ht_del(relay_streams_ht, &iter);
-               assert(!ret);
-               call_rcu(&stream->rcu_node,
-                       deferred_free_stream);
-               DBG("Closed tracefile %d after recv data", stream->fd);
+               close_stream(stream, cmd->ctf_traces_ht);
        }
 
 end_rcu_unlock:
@@ -2360,9 +2352,15 @@ error:
                                        &iter, relay_connection, sessions_ht);
                }
        }
-       rcu_read_unlock();
 error_poll_create:
-       lttng_ht_destroy(indexes_ht);
+       {
+               struct relay_index *index;
+               cds_lfht_for_each_entry(indexes_ht->ht, &iter.iter, index, index_n.node) {
+                       relay_index_delete(index, indexes_ht);
+               }
+               lttng_ht_destroy(indexes_ht);
+       }
+       rcu_read_unlock();
 indexes_ht_error:
        lttng_ht_destroy(relay_connections_ht);
 relay_connections_ht_error:
@@ -2484,8 +2482,8 @@ int main(int argc, char **argv)
        }
 
        /* tables of streams indexed by stream ID */
-       relay_ctx->viewer_streams_ht = lttng_ht_new(0, LTTNG_HT_TYPE_U64);
-       if (!relay_ctx->viewer_streams_ht) {
+       viewer_streams_ht = lttng_ht_new(0, LTTNG_HT_TYPE_U64);
+       if (!viewer_streams_ht) {
                goto exit_relay_ctx_viewer_streams;
        }
 
@@ -2538,7 +2536,7 @@ exit_dispatcher:
                PERROR("pthread_join");
                goto error;     /* join error, exit without cleanup */
        }
-       lttng_ht_destroy(relay_ctx->viewer_streams_ht);
+       lttng_ht_destroy(viewer_streams_ht);
 
 exit_relay_ctx_viewer_streams:
        lttng_ht_destroy(relay_streams_ht);
This page took 0.028039 seconds and 5 git commands to generate.