Print an error message when a snapshot record is made with a
max size smaller than the subbuffers. This limitation is now
documented in the man page.

Signed-off-by: Jérémie Galarneau <[email protected]>
---
 doc/man/lttng.1                   |  4 ++-
 src/bin/lttng/commands/snapshot.c | 59 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/doc/man/lttng.1 b/doc/man/lttng.1
index 972f71c..bf1b67e 100644
--- a/doc/man/lttng.1
+++ b/doc/man/lttng.1
@@ -787,7 +787,9 @@ List the output of a session. Attributes of the output are 
printed.
 Snapshot a session's buffer(s) for all domains. If an URL is specified, it is
 used instead of a previously added output. Specifying only a name or/and a max
 size will override the current output values. For instance, you can record a
-snapshot with a custom maximum size or with a different name.
+snapshot with a custom maximum size or with a different name. However, the
+max size must be high enough to contain a complete subbuffer. See the
+--subbuf-size switch for default subbuffer sizes.
 
 .nf
 $ lttng snapshot add-output -n mysnapshot file:///data/snapshot
diff --git a/src/bin/lttng/commands/snapshot.c 
b/src/bin/lttng/commands/snapshot.c
index c704eee..7fda949 100644
--- a/src/bin/lttng/commands/snapshot.c
+++ b/src/bin/lttng/commands/snapshot.c
@@ -125,6 +125,56 @@ static int count_arguments(const char **argv)
        return i;
 }
 
+static uint64_t get_largest_subbuf()
+{
+       int domain_count;
+       int channel_count;
+       int domain_idx;
+       int channel_idx;
+       struct lttng_domain *domains;
+       uint64_t largest_subbuf = 0;
+
+       domain_count = lttng_list_domains(current_session_name, &domains);
+       if (domain_count < 0) {
+               ERR("Unable to list session %s's domains",
+                       current_session_name);
+               goto end;
+       }
+
+       for (domain_idx = 0; domain_idx < domain_count; domain_idx++) {
+               struct lttng_channel *channels;
+               struct lttng_handle *handle = lttng_create_handle(
+                       current_session_name, &domains[domain_idx]);
+
+               if (!handle) {
+                       ERR("Unable to create handle for session %s",
+                               current_session_name);
+                       goto end;
+               }
+
+               channel_count = lttng_list_channels(handle, &channels);
+               if (channel_count < 0) {
+                       ERR("Unable to list channels for session %s",
+                               current_session_name);
+                       goto end;
+               }
+
+               for (channel_idx = 0; channel_idx < channel_count;
+                       channel_idx++) {
+                       if (channels[channel_idx].attr.subbuf_size >
+                               largest_subbuf) {
+                               largest_subbuf =
+                                       channels[channel_idx].attr.subbuf_size;
+                       }
+               }
+               free(channels);
+               lttng_destroy_handle(handle);
+       }
+end:
+       free(domains);
+       return largest_subbuf;
+}
+
 /*
  * Create a snapshot output object from arguments using the given URL.
  *
@@ -160,6 +210,15 @@ static struct lttng_snapshot_output 
*create_output_from_args(const char *url)
        }
 
        if (opt_max_size) {
+               /* Validate that the max size can contain one subbuffer. */
+               uint64_t largest_subbuf = get_largest_subbuf();
+               if (largest_subbuf == 0) {
+                       goto error;
+               } else if (largest_subbuf > opt_max_size) {
+                       ERR("Snapshot size must be greater or equal to the 
largest subbuffer's size (%zu).",
+                               largest_subbuf);
+                       goto error;
+               }
                ret = lttng_snapshot_output_set_size(opt_max_size, output);
                if (ret < 0) {
                        goto error;
-- 
1.9.1


_______________________________________________
lttng-dev mailing list
[email protected]
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to