From d1344afaa0bc9707015a0ded9b312e43e58ed2d9 Mon Sep 17 00:00:00 2001 From: Julien Desfossez Date: Wed, 18 Oct 2017 11:14:08 -0400 Subject: [PATCH] Command to dump the metadata cache again This command allows the consumer to ask for the metadata cache to be dumped entirely another time. This is used by the session rotation feature to get a new copy of what was in the metadata cache without regenerating it and re-sampling the offset from epoch. Signed-off-by: Julien Desfossez Signed-off-by: Mathieu Desnoyers --- lib/ringbuffer/vfs.h | 5 +++++ lttng-abi.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ lttng-events.c | 2 -- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/lib/ringbuffer/vfs.h b/lib/ringbuffer/vfs.h index b2e5b1c8..e2bc4010 100644 --- a/lib/ringbuffer/vfs.h +++ b/lib/ringbuffer/vfs.h @@ -123,6 +123,11 @@ ssize_t vfs_lib_ring_buffer_splice_read(struct file *in, loff_t *ppos, #define RING_BUFFER_SNAPSHOT_SAMPLE_POSITIONS _IO(0xF6, 0x0E) /* Flush the current sub-buffer, even if empty. */ #define RING_BUFFER_FLUSH_EMPTY _IO(0xF6, 0x0F) +/* + * Reset the position of what has been consumed from the metadata cache to 0 + * so it can be read again. + */ +#define RING_BUFFER_METADATA_CACHE_DUMP _IO(0xF6, 0x10) #ifdef CONFIG_COMPAT /* Get a snapshot of the current ring buffer producer and consumer positions */ diff --git a/lttng-abi.c b/lttng-abi.c index 77e5e985..d202b728 100644 --- a/lttng-abi.c +++ b/lttng-abi.c @@ -654,6 +654,38 @@ void lttng_metadata_ring_buffer_ioctl_put_next_subbuf(struct file *filp, stream->metadata_out = stream->metadata_in; } +/* + * Reset the counter of how much metadata has been consumed to 0. That way, + * the consumer receives the content of the metadata cache unchanged. This is + * different from the metadata_regenerate where the offset from epoch is + * resampled, here we want the exact same content as the last time the metadata + * was generated. This command is only possible if all the metadata written + * in the cache has been output to the metadata stream to avoid corrupting the + * metadata file. + * + * Return 0 on success, a negative value on error. + */ +static +int lttng_metadata_cache_dump(struct lttng_metadata_stream *stream) +{ + int ret; + struct lttng_metadata_cache *cache = stream->metadata_cache; + + mutex_lock(&cache->lock); + if (stream->metadata_out != cache->metadata_written) { + ret = -EBUSY; + goto end; + } + stream->metadata_out = 0; + stream->metadata_in = 0; + wake_up_interruptible(&stream->read_wait); + ret = 0; + +end: + mutex_unlock(&cache->lock); + return ret; +} + static long lttng_metadata_ring_buffer_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) @@ -706,6 +738,12 @@ long lttng_metadata_ring_buffer_ioctl(struct file *filp, return put_u64(stream->version, arg); } + case RING_BUFFER_METADATA_CACHE_DUMP: + { + struct lttng_metadata_stream *stream = filp->private_data; + + return lttng_metadata_cache_dump(stream); + } default: break; } @@ -783,6 +821,12 @@ long lttng_metadata_ring_buffer_compat_ioctl(struct file *filp, return put_u64(stream->version, arg); } + case RING_BUFFER_METADATA_CACHE_DUMP: + { + struct lttng_metadata_stream *stream = filp->private_data; + + return lttng_metadata_cache_dump(stream); + } default: break; } diff --git a/lttng-events.c b/lttng-events.c index 75c3fb17..6f122dd7 100644 --- a/lttng-events.c +++ b/lttng-events.c @@ -342,8 +342,6 @@ end: return ret; } - - int lttng_channel_enable(struct lttng_channel *channel) { int ret = 0; -- 2.34.1