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

Julien Desfossez jdesfossez at efficios.com
Wed Oct 18 15:14:08 UTC 2017


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



More information about the lttng-dev mailing list