[lttng-dev] [PATCH lttng-modules] Command to dump the metadata cache again

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Tue Feb 20 12:00:57 EST 2018


Merged into master, thanks!

Mathieu

----- On Oct 18, 2017, at 11:14 AM, Julien Desfossez jdesfossez at efficios.com wrote:

> 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 <jdesfossez at efficios.com>
> ---
> 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 b2e5b1c..e2bc401 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 77e5e98..d202b72 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 21c4113..8719173 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.7.4

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com


More information about the lttng-dev mailing list