[DTrace-devel] [PATCH] END clause does not execute when consumer stops the producer

Kris Van Hees kris.van.hees at oracle.com
Tue Oct 20 18:25:44 PDT 2020


Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>

On Fri, Oct 16, 2020 at 02:22:43AM -0400, eugene.loh at oracle.com wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
> 
> The END probe's clause does not execute when the consumer requests
> tracing to stop.  One example is when the user sends a SIGINT to the
> dtrace command-line tool and it calls dtrace_stop().  This problem
> would also occur once -c is supported and the specified command finishes.
> 
> The problem is that the END probe checks that the activity state is
> DRAINING before executing its clause, but DRAINING is set only by
> calling the D exit() action.
> 
> Before calling END_probe(), advance the activity state to DRAINING if
> it is not yet that far.  Add a test for this problem.
> 
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
> ---
>  libdtrace/dt_work.c                    |  3 +++
>  test/unittest/actions/exit/tst.kill.sh | 31 ++++++++++++++++++++++++++
>  2 files changed, 34 insertions(+)
>  create mode 100755 test/unittest/actions/exit/tst.kill.sh
> 
> diff --git a/libdtrace/dt_work.c b/libdtrace/dt_work.c
> index 02246219..51da120e 100644
> --- a/libdtrace/dt_work.c
> +++ b/libdtrace/dt_work.c
> @@ -225,6 +225,9 @@ dtrace_stop(dtrace_hdl_t *dtp)
>  	if (dtp->dt_stopped)
>  		return 0;
>  
> +	if (dt_state_get_activity(dtp) < DT_ACTIVITY_DRAINING)
> +		dt_state_set_activity(dtp, DT_ACTIVITY_DRAINING);
> +
>  	END_probe();
>  
>  	dtp->dt_stopped = 1;
> diff --git a/test/unittest/actions/exit/tst.kill.sh b/test/unittest/actions/exit/tst.kill.sh
> new file mode 100755
> index 00000000..2ff465b8
> --- /dev/null
> +++ b/test/unittest/actions/exit/tst.kill.sh
> @@ -0,0 +1,31 @@
> +#!/bin/bash
> +#
> +# Oracle Linux DTrace.
> +# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
> +# Licensed under the Universal Permissive License v 1.0 as shown at
> +# http://oss.oracle.com/licenses/upl.
> +#
> +
> +dtrace=$1
> +out=$tmpdir/output.$$
> +
> +watch_output_for() {
> +    for iter in 1 2 3 4 5 6; do
> +        sleep 1
> +        if grep -q $1 $out; then
> +            iter=0
> +            break
> +        fi
> +    done
> +    if [[ $iter -ne 0 ]]; then
> +        echo ERROR: missing $1 in output file
> +        exit 1
> +    fi
> +}
> +
> +$dtrace $dt_flags -n BEGIN,END -o $out &
> +watch_output_for :BEGIN
> +kill %1
> +watch_output_for :END
> +echo success
> +
> -- 
> 2.18.4
> 
> 
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel



More information about the DTrace-devel mailing list