[ltt-dev] [LTTNG-TOOLS PATCH 1/2] Function to handle snapshots in liblttngkconsumerd
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Tue Aug 16 13:55:33 EDT 2011
* Julien Desfossez (julien.desfossez at polymtl.ca) wrote:
> This patchs adds the wrappers to take a snapshot for a specific FD and
> to retreive the produced position.
> Also refactor the sync tracefile operation.
>
merged, thanks!
Mathieu
> Signed-off-by: Julien Desfossez <julien.desfossez at polymtl.ca>
> ---
> include/lttng/lttng-kconsumerd.h | 18 ++++
> liblttngkconsumerd/lttngkconsumerd.c | 142 +++++++++++++++++++---------------
> 2 files changed, 98 insertions(+), 62 deletions(-)
>
> diff --git a/include/lttng/lttng-kconsumerd.h b/include/lttng/lttng-kconsumerd.h
> index 8d16d56..7e195ab 100644
> --- a/include/lttng/lttng-kconsumerd.h
> +++ b/include/lttng/lttng-kconsumerd.h
> @@ -132,6 +132,24 @@ extern int lttng_kconsumerd_on_read_subbuffer_splice(
> struct lttng_kconsumerd_fd *kconsumerd_fd, unsigned long len);
>
> /*
> + * Take a snapshot for a specific fd
> + *
> + * Returns 0 on success, < 0 on error
> + */
> +int lttng_kconsumerd_take_snapshot(struct lttng_kconsumerd_local_data *ctx,
> + struct lttng_kconsumerd_fd *kconsumerd_fd);
> +
> +/*
> + * Get the produced position
> + *
> + * Returns 0 on success, < 0 on error
> + */
> +int lttng_kconsumerd_get_produced_snapshot(
> + struct lttng_kconsumerd_local_data *ctx,
> + struct lttng_kconsumerd_fd *kconsumerd_fd,
> + unsigned long *pos);
> +
> +/*
> * Send return code to session daemon.
> *
> * Returns the return code of sendmsg : the number of bytes transmitted or -1
> diff --git a/liblttngkconsumerd/lttngkconsumerd.c b/liblttngkconsumerd/lttngkconsumerd.c
> index ba26026..d36da9b 100644
> --- a/liblttngkconsumerd/lttngkconsumerd.c
> +++ b/liblttngkconsumerd/lttngkconsumerd.c
> @@ -361,6 +361,42 @@ void lttng_kconsumerd_set_command_sock_path(
> ctx->kconsumerd_command_sock_path = sock;
> }
>
> +static void lttng_kconsumerd_sync_trace_file(
> + struct lttng_kconsumerd_fd *kconsumerd_fd, off_t orig_offset)
> +{
> + int outfd = kconsumerd_fd->out_fd;
> + /*
> + * This does a blocking write-and-wait on any page that belongs to the
> + * subbuffer prior to the one we just wrote.
> + * Don't care about error values, as these are just hints and ways to
> + * limit the amount of page cache used.
> + */
> + if (orig_offset >= kconsumerd_fd->max_sb_size) {
> + sync_file_range(outfd, orig_offset - kconsumerd_fd->max_sb_size,
> + kconsumerd_fd->max_sb_size,
> + SYNC_FILE_RANGE_WAIT_BEFORE
> + | SYNC_FILE_RANGE_WRITE
> + | SYNC_FILE_RANGE_WAIT_AFTER);
> + /*
> + * Give hints to the kernel about how we access the file:
> + * POSIX_FADV_DONTNEED : we won't re-access data in a near future after
> + * we write it.
> + *
> + * We need to call fadvise again after the file grows because the
> + * kernel does not seem to apply fadvise to non-existing parts of the
> + * file.
> + *
> + * Call fadvise _after_ having waited for the page writeback to
> + * complete because the dirty page writeback semantic is not well
> + * defined. So it can be expected to lead to lower throughput in
> + * streaming.
> + */
> + posix_fadvise(outfd, orig_offset - kconsumerd_fd->max_sb_size,
> + kconsumerd_fd->max_sb_size, POSIX_FADV_DONTNEED);
> + }
> +}
> +
> +
> /*
> * Mmap the ring buffer, read it and write the data to the tracefile.
> *
> @@ -371,7 +407,6 @@ int lttng_kconsumerd_on_read_subbuffer_mmap(
> struct lttng_kconsumerd_fd *kconsumerd_fd, unsigned long len)
> {
> unsigned long mmap_offset;
> - char *padding = NULL;
> long ret = 0;
> off_t orig_offset = kconsumerd_fd->out_fd_offset;
> int fd = kconsumerd_fd->consumerd_fd;
> @@ -400,42 +435,11 @@ int lttng_kconsumerd_on_read_subbuffer_mmap(
> kconsumerd_fd->out_fd_offset += ret;
> }
>
> - /*
> - * This does a blocking write-and-wait on any page that belongs to the
> - * subbuffer prior to the one we just wrote.
> - * Don't care about error values, as these are just hints and ways to
> - * limit the amount of page cache used.
> - */
> - if (orig_offset >= kconsumerd_fd->max_sb_size) {
> - sync_file_range(outfd, orig_offset - kconsumerd_fd->max_sb_size,
> - kconsumerd_fd->max_sb_size,
> - SYNC_FILE_RANGE_WAIT_BEFORE
> - | SYNC_FILE_RANGE_WRITE
> - | SYNC_FILE_RANGE_WAIT_AFTER);
> + lttng_kconsumerd_sync_trace_file(kconsumerd_fd, orig_offset);
>
> - /*
> - * Give hints to the kernel about how we access the file:
> - * POSIX_FADV_DONTNEED : we won't re-access data in a near future after
> - * we write it.
> - *
> - * We need to call fadvise again after the file grows because the
> - * kernel does not seem to apply fadvise to non-existing parts of the
> - * file.
> - *
> - * Call fadvise _after_ having waited for the page writeback to
> - * complete because the dirty page writeback semantic is not well
> - * defined. So it can be expected to lead to lower throughput in
> - * streaming.
> - */
> - posix_fadvise(outfd, orig_offset - kconsumerd_fd->max_sb_size,
> - kconsumerd_fd->max_sb_size, POSIX_FADV_DONTNEED);
> - }
> goto end;
>
> end:
> - if (padding != NULL) {
> - free(padding);
> - }
> return ret;
> }
>
> @@ -482,36 +486,8 @@ int lttng_kconsumerd_on_read_subbuffer_splice(
> SYNC_FILE_RANGE_WRITE);
> kconsumerd_fd->out_fd_offset += ret;
> }
> + lttng_kconsumerd_sync_trace_file(kconsumerd_fd, orig_offset);
>
> - /*
> - * This does a blocking write-and-wait on any page that belongs to the
> - * subbuffer prior to the one we just wrote.
> - * Don't care about error values, as these are just hints and ways to
> - * limit the amount of page cache used.
> - */
> - if (orig_offset >= kconsumerd_fd->max_sb_size) {
> - sync_file_range(outfd, orig_offset - kconsumerd_fd->max_sb_size,
> - kconsumerd_fd->max_sb_size,
> - SYNC_FILE_RANGE_WAIT_BEFORE
> - | SYNC_FILE_RANGE_WRITE
> - | SYNC_FILE_RANGE_WAIT_AFTER);
> - /*
> - * Give hints to the kernel about how we access the file:
> - * POSIX_FADV_DONTNEED : we won't re-access data in a near future after
> - * we write it.
> - *
> - * We need to call fadvise again after the file grows because the
> - * kernel does not seem to apply fadvise to non-existing parts of the
> - * file.
> - *
> - * Call fadvise _after_ having waited for the page writeback to
> - * complete because the dirty page writeback semantic is not well
> - * defined. So it can be expected to lead to lower throughput in
> - * streaming.
> - */
> - posix_fadvise(outfd, orig_offset - kconsumerd_fd->max_sb_size,
> - kconsumerd_fd->max_sb_size, POSIX_FADV_DONTNEED);
> - }
> goto end;
>
> splice_error:
> @@ -536,6 +512,48 @@ end:
> }
>
> /*
> + * Take a snapshot for a specific fd
> + *
> + * Returns 0 on success, < 0 on error
> + */
> +int lttng_kconsumerd_take_snapshot(struct lttng_kconsumerd_local_data *ctx,
> + struct lttng_kconsumerd_fd *kconsumerd_fd)
> +{
> + int ret = 0;
> + int infd = kconsumerd_fd->consumerd_fd;
> +
> + ret = kernctl_snapshot(infd);
> + if (ret != 0) {
> + ret = errno;
> + perror("Getting sub-buffer snapshot.");
> + }
> +
> + return ret;
> +}
> +
> +/*
> + * Get the produced position
> + *
> + * Returns 0 on success, < 0 on error
> + */
> +int lttng_kconsumerd_get_produced_snapshot(
> + struct lttng_kconsumerd_local_data *ctx,
> + struct lttng_kconsumerd_fd *kconsumerd_fd,
> + unsigned long *pos)
> +{
> + int ret;
> + int infd = kconsumerd_fd->consumerd_fd;
> +
> + ret = kernctl_snapshot_get_produced(infd, pos);
> + if (ret != 0) {
> + ret = errno;
> + perror("kernctl_snapshot_get_produced");
> + }
> +
> + return ret;
> +}
> +
> +/*
> * Poll on the should_quit pipe and the command socket return -1 on error and
> * should exit, 0 if data is available on the command socket
> */
> --
> 1.7.4.1
>
--
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list