Move stream file rotation functions to utils
authorJulien Desfossez <jdesfossez@efficios.com>
Thu, 28 Mar 2013 15:48:02 +0000 (11:48 -0400)
committerDavid Goulet <dgoulet@efficios.com>
Thu, 28 Mar 2013 16:55:25 +0000 (12:55 -0400)
These functions are now in libcommon which can be used by the relayd and
consumer.

Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
src/common/consumer.c
src/common/consumer.h
src/common/kernel-consumer/kernel-consumer.c
src/common/ust-consumer/ust-consumer.c
src/common/utils.c
src/common/utils.h
tests/unit/Makefile.am

index a9070b1c9bc3f976ef26a2fbbc183c7fd4b75343..52a4ed171d6b0dde5d1759c781f54ef45994cab0 100644 (file)
@@ -1287,99 +1287,6 @@ end:
        return ret;
 }
 
-/*
- * Create the tracefile on disk.
- *
- * Return 0 on success or else a negative value.
- */
-int lttng_create_output_file(struct lttng_consumer_stream *stream)
-{
-       int ret;
-       char full_path[PATH_MAX];
-       char *path_name_id = NULL;
-       char *path;
-
-       assert(stream);
-
-       /* Don't create anything if this is set for streaming. */
-       if (stream->net_seq_idx != (uint64_t) -1ULL) {
-               ret = 0;
-               goto end;
-       }
-
-       ret = snprintf(full_path, sizeof(full_path), "%s/%s",
-                       stream->chan->pathname, stream->name);
-       if (ret < 0) {
-               PERROR("snprintf create output file");
-               goto error;
-       }
-
-       /*
-        * If we split the trace in multiple files, we have to add the tracefile
-        * current count at the end of the tracefile name
-        */
-       if (stream->chan->tracefile_size > 0) {
-               ret = asprintf(&path_name_id, "%s_%" PRIu64, full_path,
-                               stream->tracefile_count_current);
-               if (ret < 0) {
-                       PERROR("Allocating path name ID");
-                       goto error;
-               }
-               path = path_name_id;
-       } else {
-               path = full_path;
-       }
-
-       ret = run_as_open(path, O_WRONLY | O_CREAT | O_TRUNC,
-                       S_IRWXU | S_IRWXG | S_IRWXO, stream->uid, stream->gid);
-       if (ret < 0) {
-               PERROR("open stream path %s", path);
-               goto error_open;
-       }
-       stream->out_fd = ret;
-       stream->tracefile_size_current = 0;
-
-error_open:
-       free(path_name_id);
-error:
-end:
-       return ret;
-}
-
-/*
- * Change the output tracefile according to the tracefile_size and
- * tracefile_count parameters. The stream lock MUST be held before calling this
- * function because we are modifying the stream status.
- *
- * Return 0 on success or else a negative value.
- */
-static int rotate_output_file(struct lttng_consumer_stream *stream)
-{
-       int ret;
-
-       assert(stream);
-       assert(stream->tracefile_size_current);
-
-       ret = close(stream->out_fd);
-       if (ret < 0) {
-               PERROR("Closing tracefile");
-               goto end;
-       }
-
-       if (stream->chan->tracefile_count > 0) {
-               stream->tracefile_count_current =
-                       (stream->tracefile_count_current + 1) %
-                       stream->chan->tracefile_count;
-       } else {
-               stream->tracefile_count_current++;
-       }
-
-       return lttng_create_output_file(stream);
-
-end:
-       return ret;
-}
-
 /*
  * Mmap the ring buffer, read it and write the data to the tracefile. This is a
  * core function for writing trace buffers to either the local filesystem or
@@ -1494,12 +1401,15 @@ ssize_t lttng_consumer_on_read_subbuffer_mmap(
                if (stream->chan->tracefile_size > 0 &&
                                (stream->tracefile_size_current + len) >
                                stream->chan->tracefile_size) {
-                       ret = rotate_output_file(stream);
+                       ret = utils_rotate_stream_file(stream->chan->pathname,
+                                       stream->name, stream->chan->tracefile_size,
+                                       stream->chan->tracefile_count, stream->uid, stream->gid,
+                                       stream->out_fd, &(stream->tracefile_count_current));
                        if (ret < 0) {
                                ERR("Rotating output file");
                                goto end;
                        }
-                       outfd = stream->out_fd;
+                       outfd = stream->out_fd = ret;
                }
                stream->tracefile_size_current += len;
        }
@@ -1671,12 +1581,15 @@ ssize_t lttng_consumer_on_read_subbuffer_splice(
                if (stream->chan->tracefile_size > 0 &&
                                (stream->tracefile_size_current + len) >
                                stream->chan->tracefile_size) {
-                       ret = rotate_output_file(stream);
+                       ret = utils_rotate_stream_file(stream->chan->pathname,
+                                       stream->name, stream->chan->tracefile_size,
+                                       stream->chan->tracefile_count, stream->uid, stream->gid,
+                                       stream->out_fd, &(stream->tracefile_count_current));
                        if (ret < 0) {
                                ERR("Rotating output file");
                                goto end;
                        }
-                       outfd = stream->out_fd;
+                       outfd = stream->out_fd = ret;
                }
                stream->tracefile_size_current += len;
        }
index 0931250b06fafc95e1d6b4648b5d9f3241b3f58e..19a590e801e9739ff2aca138c5bf9cfe62417e30 100644 (file)
@@ -494,7 +494,6 @@ struct lttng_consumer_local_data *lttng_consumer_create(
                int (*recv_stream)(struct lttng_consumer_stream *stream),
                int (*update_stream)(int sessiond_key, uint32_t state));
 void lttng_consumer_destroy(struct lttng_consumer_local_data *ctx);
-int lttng_create_output_file(struct lttng_consumer_stream *stream);
 ssize_t lttng_consumer_on_read_subbuffer_mmap(
                struct lttng_consumer_local_data *ctx,
                struct lttng_consumer_stream *stream, unsigned long len,
index 385af875a2d9b69aeeff6c58f5dcf8017338e16d..bc3ddc930cf1cb8a10d0cd03b9150a4385c15bed 100644 (file)
@@ -35,6 +35,7 @@
 #include <common/sessiond-comm/relayd.h>
 #include <common/compat/fcntl.h>
 #include <common/relayd/relayd.h>
+#include <common/utils.h>
 
 #include "kernel-consumer.h"
 
@@ -506,10 +507,16 @@ int lttng_kconsumer_on_recv_stream(struct lttng_consumer_stream *stream)
 
        assert(stream);
 
-       ret = lttng_create_output_file(stream);
-       if (ret < 0) {
-               ERR("Creating output file");
-               goto error;
+       /* Don't create anything if this is set for streaming. */
+       if (stream->net_seq_idx == (uint64_t) -1ULL) {
+               ret = utils_create_stream_file(stream->chan->pathname, stream->name,
+                               stream->chan->tracefile_size, stream->tracefile_count_current,
+                               stream->uid, stream->gid);
+               if (ret < 0) {
+                       goto error;
+               }
+               stream->out_fd = ret;
+               stream->tracefile_size_current = 0;
        }
 
        if (stream->output == LTTNG_EVENT_MMAP) {
index b558988dcf1a2ba4fcf6b6cabdff46c7166bbf25..bc0f585385814f1ba25be632f2a21fbd04232de9 100644 (file)
@@ -38,6 +38,7 @@
 #include <common/compat/fcntl.h>
 #include <common/consumer-metadata-cache.h>
 #include <common/consumer-timer.h>
+#include <common/utils.h>
 
 #include "ust-consumer.h"
 
@@ -1283,10 +1284,28 @@ end:
 
 /*
  * Called when a stream is created.
+ *
+ * Return 0 on success or else a negative value.
  */
 int lttng_ustconsumer_on_recv_stream(struct lttng_consumer_stream *stream)
 {
-       return lttng_create_output_file(stream);
+       int ret;
+
+       /* Don't create anything if this is set for streaming. */
+       if (stream->net_seq_idx == (uint64_t) -1ULL) {
+               ret = utils_create_stream_file(stream->chan->pathname, stream->name,
+                               stream->chan->tracefile_size, stream->tracefile_count_current,
+                               stream->uid, stream->gid);
+               if (ret < 0) {
+                       goto error;
+               }
+               stream->out_fd = ret;
+               stream->tracefile_size_current = 0;
+       }
+       ret = 0;
+
+error:
+       return ret;
 }
 
 /*
index a18e906d7f6b303d834482b2b00ce7f93a1fcdf5..9f3a8f942b1176867fc7e0d55253cbae321f6130 100644 (file)
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
+#include <inttypes.h>
 
 #include <common/common.h>
+#include <common/runas.h>
 
 #include "utils.h"
 
@@ -301,3 +303,85 @@ int utils_mkdir_recursive(const char *path, mode_t mode)
 error:
        return ret;
 }
+
+/*
+ * Create the stream tracefile on disk.
+ *
+ * Return 0 on success or else a negative value.
+ */
+int utils_create_stream_file(char *path_name, char *file_name, uint64_t size,
+               uint64_t count, int uid, int gid)
+{
+       int ret, out_fd;
+       char full_path[PATH_MAX], *path_name_id = NULL, *path;
+
+       assert(path_name);
+       assert(file_name);
+
+       ret = snprintf(full_path, sizeof(full_path), "%s/%s",
+                       path_name, file_name);
+       if (ret < 0) {
+               PERROR("snprintf create output file");
+               goto error;
+       }
+
+       /*
+        * If we split the trace in multiple files, we have to add the count at the
+        * end of the tracefile name
+        */
+       if (size > 0) {
+               ret = asprintf(&path_name_id, "%s_%" PRIu64, full_path, count);
+               if (ret < 0) {
+                       PERROR("Allocating path name ID");
+                       goto error;
+               }
+               path = path_name_id;
+       } else {
+               path = full_path;
+       }
+
+       out_fd = run_as_open(path, O_WRONLY | O_CREAT | O_TRUNC,
+                       S_IRWXU | S_IRWXG | S_IRWXO, uid, gid);
+       if (out_fd < 0) {
+               PERROR("open stream path %s", path);
+               goto error_open;
+       }
+       ret = out_fd;
+
+error_open:
+       free(path_name_id);
+error:
+       return ret;
+}
+
+/*
+ * Change the output tracefile according to the given size and count The
+ * new_count pointer is set during this operation.
+ *
+ * From the consumer, the stream lock MUST be held before calling this function
+ * because we are modifying the stream status.
+ *
+ * Return 0 on success or else a negative value.
+ */
+int utils_rotate_stream_file(char *path_name, char *file_name, uint64_t size,
+               uint64_t count, int uid, int gid, int out_fd, uint64_t *new_count)
+{
+       int ret;
+
+       ret = close(out_fd);
+       if (ret < 0) {
+               PERROR("Closing tracefile");
+               goto error;
+       }
+
+       if (count > 0) {
+               *new_count = (*new_count + 1) % count;
+       } else {
+               (*new_count)++;
+       }
+
+       return utils_create_stream_file(path_name, file_name, size, *new_count,
+                       uid, gid);
+error:
+       return ret;
+}
index f63e84e5b098dd5f5d658545d04d7d15c7ef64a3..2d39cefb96b7bfa27c12f2ee1865d294ca0bca9c 100644 (file)
@@ -26,5 +26,9 @@ char *utils_strdupdelim(const char *begin, const char *end);
 int utils_set_fd_cloexec(int fd);
 int utils_create_pid_file(pid_t pid, const char *filepath);
 int utils_mkdir_recursive(const char *path, mode_t mode);
+int utils_create_stream_file(char *path_name, char *file_name, uint64_t size,
+               uint64_t count, int uid, int gid);
+int utils_rotate_stream_file(char *path_name, char *file_name, uint64_t size,
+               uint64_t count, int uid, int gid, int out_fd, uint64_t *new_count);
 
 #endif /* _COMMON_UTILS_H */
index 169ca2ebe86d2dc351730081fb9129267d60f0f0..c9e1bfcf44d2cd99ca0ce4505993f501e7ad45a6 100644 (file)
@@ -22,7 +22,7 @@ endif
 
 # URI unit tests
 test_uri_SOURCES = test_uri.c
-test_uri_LDADD = $(LIBTAP) $(LIBCOMMON)
+test_uri_LDADD = $(LIBTAP) $(LIBCOMMON) $(LIBHASHTABLE)
 
 # Session unit test
 SESSIONS=$(top_srcdir)/src/bin/lttng-sessiond/session.c        \
This page took 0.031736 seconds and 4 git commands to generate.