[lttng-dev] [PATCH lttng-tools] Better error reporting when a snapshot record size is too small
David Goulet
dgoulet at efficios.com
Tue Apr 15 10:44:08 EDT 2014
On 15 Apr (10:32:09), Jérémie Galarneau wrote:
> 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.
Why is this not done on the session daemon side? Like "Oh you provided
me with a wrong max size" type of error message.
Because here this fixes the issue only on the command line side but a
user using the API would still fail somehow silently or ... ?
Not that I don't like the approach here but I just need to know if there
is a specific reason it's done on the lttng client side only. This patch
adds two calls that can exchange quite a bit of data with the sessiond
(list domains and channels) so unless there is no other way, I would go
for a sessiond side validation instead.
Cheers!
David
>
> Signed-off-by: Jérémie Galarneau <jeremie.galarneau at efficios.com>
> ---
> 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
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 603 bytes
Desc: Digital signature
URL: <http://lists.lttng.org/pipermail/lttng-dev/attachments/20140415/bd16f4b9/attachment.sig>
More information about the lttng-dev
mailing list