From: David Goulet Date: Fri, 27 Sep 2013 18:54:03 +0000 (-0400) Subject: Fix: make indexes HT global for real X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=commitdiff_plain;h=0a6518b0685cb9e07cf156a4c882dc6ec40db35a Fix: make indexes HT global for real Signed-off-by: David Goulet --- diff --git a/src/bin/lttng-relayd/index.c b/src/bin/lttng-relayd/index.c index 97918cd06..8cacdd2f0 100644 --- a/src/bin/lttng-relayd/index.c +++ b/src/bin/lttng-relayd/index.c @@ -22,6 +22,7 @@ #include #include +#include "lttng-relayd.h" #include "index.h" /* @@ -76,23 +77,20 @@ error: * * Return index object or else NULL on error. */ -struct relay_index *relay_index_find(uint64_t stream_id, - uint64_t net_seq_num, struct lttng_ht *ht) +struct relay_index *relay_index_find(uint64_t stream_id, uint64_t net_seq_num) { struct lttng_ht_node_two_u64 *node; struct lttng_ht_iter iter; struct lttng_ht_two_u64 key; struct relay_index *index = NULL; - assert(ht); - DBG3("Finding index for stream id %" PRIu64 " and seq_num %" PRIu64, stream_id, net_seq_num); key.key1 = stream_id; key.key2 = net_seq_num; - lttng_ht_lookup(ht, (void *)(&key), &iter); + lttng_ht_lookup(indexes_ht, (void *)(&key), &iter); node = lttng_ht_iter_get_node_two_u64(&iter); if (node == NULL) { goto end; @@ -111,21 +109,18 @@ end: * * RCU read side lock MUST be acquired. */ -void relay_index_add(struct relay_index *index, struct lttng_ht *ht, - struct relay_index **_index) +void relay_index_add(struct relay_index *index, struct relay_index **_index) { struct cds_lfht_node *node_ptr; assert(index); - assert(ht); - assert(_index); DBG2("Adding relay index with stream id %" PRIu64 " and seqnum %" PRIu64, index->key.key1, index->key.key2); - node_ptr = cds_lfht_add_unique(ht->ht, - ht->hash_fct((void *) &index->index_n.key, lttng_ht_seed), - ht->match_fct, (void *) &index->index_n.key, + node_ptr = cds_lfht_add_unique(indexes_ht->ht, + indexes_ht->hash_fct((void *) &index->index_n.key, lttng_ht_seed), + indexes_ht->match_fct, (void *) &index->index_n.key, &index->index_n.node); if (node_ptr != &index->index_n.node) { *_index = caa_container_of(node_ptr, struct relay_index, index_n.node); @@ -140,7 +135,7 @@ void relay_index_add(struct relay_index *index, struct lttng_ht *ht, * * Return 0 on success else a negative value. */ -int relay_index_write(int fd, struct relay_index *index, struct lttng_ht *ht) +int relay_index_write(int fd, struct relay_index *index) { int ret; struct lttng_ht_iter iter; @@ -150,7 +145,7 @@ int relay_index_write(int fd, struct relay_index *index, struct lttng_ht *ht) /* Delete index from hash table. */ iter.iter.node = &index->index_n.node; - ret = lttng_ht_del(ht, &iter); + ret = lttng_ht_del(indexes_ht, &iter); assert(!ret); call_rcu(&index->rcu_node, deferred_free_relay_index); @@ -182,7 +177,7 @@ void relay_index_free_safe(struct relay_index *index) * * RCU read side lock MUST be acquired. */ -void relay_index_delete(struct relay_index *index, struct lttng_ht *ht) +void relay_index_delete(struct relay_index *index) { int ret; struct lttng_ht_iter iter; @@ -192,25 +187,22 @@ void relay_index_delete(struct relay_index *index, struct lttng_ht *ht) /* Delete index from hash table. */ iter.iter.node = &index->index_n.node; - ret = lttng_ht_del(ht, &iter); + ret = lttng_ht_del(indexes_ht, &iter); assert(!ret); } /* * Destroy every relay index with the given stream id as part of the key. */ -void relay_index_destroy_by_stream_id(uint64_t stream_id, struct lttng_ht *ht) +void relay_index_destroy_by_stream_id(uint64_t stream_id) { struct lttng_ht_iter iter; struct relay_index *index; - assert(ht); - assert(ht->ht); - rcu_read_lock(); - cds_lfht_for_each_entry(ht->ht, &iter.iter, index, index_n.node) { + cds_lfht_for_each_entry(indexes_ht->ht, &iter.iter, index, index_n.node) { if (index->key.key1 == stream_id) { - relay_index_delete(index, ht); + relay_index_delete(index); relay_index_free_safe(index); } } diff --git a/src/bin/lttng-relayd/index.h b/src/bin/lttng-relayd/index.h index fc184e97d..3ca7263e3 100644 --- a/src/bin/lttng-relayd/index.h +++ b/src/bin/lttng-relayd/index.h @@ -47,14 +47,12 @@ struct relay_index { struct relay_index *relay_index_create(uint64_t stream_id, uint64_t net_seq_num); -struct relay_index *relay_index_find(uint64_t stream_id, - uint64_t net_seq_num, struct lttng_ht *ht); -void relay_index_add(struct relay_index *index, struct lttng_ht *ht, - struct relay_index **_index); -int relay_index_write(int fd, struct relay_index *index, struct lttng_ht *ht); +struct relay_index *relay_index_find(uint64_t stream_id, uint64_t net_seq_num); +void relay_index_add(struct relay_index *index, struct relay_index **_index); +int relay_index_write(int fd, struct relay_index *index); void relay_index_free(struct relay_index *index); void relay_index_free_safe(struct relay_index *index); -void relay_index_delete(struct relay_index *index, struct lttng_ht *ht); -void relay_index_destroy_by_stream_id(uint64_t stream_id, struct lttng_ht *ht); +void relay_index_delete(struct relay_index *index); +void relay_index_destroy_by_stream_id(uint64_t stream_id); #endif /* _RELAY_INDEX_H */ diff --git a/src/bin/lttng-relayd/lttng-relayd.h b/src/bin/lttng-relayd/lttng-relayd.h index 3b7c74604..da2324034 100644 --- a/src/bin/lttng-relayd/lttng-relayd.h +++ b/src/bin/lttng-relayd/lttng-relayd.h @@ -166,6 +166,7 @@ extern char *opt_output_path; extern struct lttng_ht *relay_streams_ht; extern struct lttng_ht *viewer_streams_ht; +extern struct lttng_ht *indexes_ht; struct relay_stream *relay_stream_find_by_id(uint64_t stream_id); diff --git a/src/bin/lttng-relayd/main.c b/src/bin/lttng-relayd/main.c index f12b1a335..e426469a3 100644 --- a/src/bin/lttng-relayd/main.c +++ b/src/bin/lttng-relayd/main.c @@ -101,9 +101,6 @@ static struct relay_cmd_queue relay_cmd_queue; static char *data_buffer; static unsigned int data_buffer_size; -/* Global hash table that stores relay index object. */ -static struct lttng_ht *indexes_ht; - /* We need those values for the file/dir creation. */ static uid_t relayd_uid; static gid_t relayd_gid; @@ -114,6 +111,9 @@ struct lttng_ht *relay_streams_ht; /* Global relay viewer stream hash table. */ struct lttng_ht *viewer_streams_ht; +/* Global hash table that stores relay index object. */ +struct lttng_ht *indexes_ht; + /* * usage function on stderr */ @@ -842,7 +842,7 @@ void relay_delete_session(struct relay_command *cmd, destroy_stream(stream, cmd->ctf_traces_ht); } /* Cleanup index of that stream. */ - relay_index_destroy_by_stream_id(stream->stream_handle, indexes_ht); + relay_index_destroy_by_stream_id(stream->stream_handle); } /* Make this session not visible anymore. */ @@ -1652,7 +1652,7 @@ end_no_session: */ static int relay_recv_index(struct lttcomm_relayd_hdr *recv_hdr, - struct relay_command *cmd, struct lttng_ht *indexes_ht) + struct relay_command *cmd) { int ret, send_ret, index_created = 0; struct relay_session *session = cmd->session; @@ -1663,7 +1663,6 @@ int relay_recv_index(struct lttcomm_relayd_hdr *recv_hdr, uint64_t net_seq_num; assert(cmd); - assert(indexes_ht); DBG("Relay receiving index"); @@ -1711,7 +1710,7 @@ int relay_recv_index(struct lttcomm_relayd_hdr *recv_hdr, stream->beacon_ts_end = -1ULL; } - index = relay_index_find(stream->stream_handle, net_seq_num, indexes_ht); + index = relay_index_find(stream->stream_handle, net_seq_num); if (!index) { /* A successful creation will add the object to the HT. */ index = relay_index_create(stream->stream_handle, net_seq_num); @@ -1729,7 +1728,7 @@ int relay_recv_index(struct lttcomm_relayd_hdr *recv_hdr, * already exist, destroy back the index created, set the data in this * object and write it on disk. */ - relay_index_add(index, indexes_ht, &wr_index); + relay_index_add(index, &wr_index); if (wr_index) { copy_index_control_data(wr_index, &index_info); free(index); @@ -1752,7 +1751,7 @@ int relay_recv_index(struct lttcomm_relayd_hdr *recv_hdr, stream->index_fd = ret; } - ret = relay_index_write(wr_index->fd, wr_index, indexes_ht); + ret = relay_index_write(wr_index->fd, wr_index); if (ret < 0) { goto end_rcu_unlock; } @@ -1818,7 +1817,7 @@ int relay_process_control(struct lttcomm_relayd_hdr *recv_hdr, ret = relay_end_data_pending(recv_hdr, cmd); break; case RELAYD_SEND_INDEX: - ret = relay_recv_index(recv_hdr, cmd, indexes_ht); + ret = relay_recv_index(recv_hdr, cmd); break; case RELAYD_UPDATE_SYNC_INFO: default: @@ -1836,8 +1835,7 @@ end: * relay_process_data: Process the data received on the data socket */ static -int relay_process_data(struct relay_command *cmd, - struct lttng_ht *indexes_ht) +int relay_process_data(struct relay_command *cmd) { int ret = 0, rotate_index = 0, index_created = 0; struct relay_stream *stream; @@ -1924,7 +1922,7 @@ int relay_process_data(struct relay_command *cmd, * exists, the control thread already received the data for it thus we need * to write it on disk. */ - index = relay_index_find(stream_id, net_seq_num, indexes_ht); + index = relay_index_find(stream_id, net_seq_num); if (!index) { /* A successful creation will add the object to the HT. */ index = relay_index_create(stream->stream_handle, net_seq_num); @@ -1954,7 +1952,7 @@ int relay_process_data(struct relay_command *cmd, * Try to add the relay index object to the hash table. If an object * already exist, destroy back the index created and set the data. */ - relay_index_add(index, indexes_ht, &wr_index); + relay_index_add(index, &wr_index); if (wr_index) { /* Copy back data from the created index. */ wr_index->fd = index->fd; @@ -1980,7 +1978,7 @@ int relay_process_data(struct relay_command *cmd, stream->index_fd = ret; } - ret = relay_index_write(wr_index->fd, wr_index, indexes_ht); + ret = relay_index_write(wr_index->fd, wr_index); if (ret < 0) { goto end_rcu_unlock; } @@ -2311,7 +2309,7 @@ restart: continue; } - ret = relay_process_data(relay_connection, indexes_ht); + ret = relay_process_data(relay_connection); /* connection closed */ if (ret < 0) { relay_cleanup_poll_connection(&events, pollfd); @@ -2355,7 +2353,7 @@ error_poll_create: { struct relay_index *index; cds_lfht_for_each_entry(indexes_ht->ht, &iter.iter, index, index_n.node) { - relay_index_delete(index, indexes_ht); + relay_index_delete(index); } lttng_ht_destroy(indexes_ht); }