[DTrace-devel] [PATCH] test: Improve tst.dlclose1.sh test for USDT probes

Kris Van Hees kris.van.hees at oracle.com
Fri Apr 22 15:24:08 UTC 2022


I picked up the test anyway, with

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

But with one change: /usr/awk is not the standard path (anymore) for awk, and
on some distros it will not be found.  Use /usr/bin/awk instead.  (I made the
change in this patch.)

On Fri, Apr 08, 2022 at 02:48:21PM -0400, Kris Van Hees via DTrace-devel wrote:
> On Fri, Apr 08, 2022 at 12:57:10PM -0400, Eugene Loh via DTrace-devel wrote:
> > On 4/8/22 12:15 PM, Kris Van Hees wrote:
> > 
> > > On Fri, Apr 08, 2022 at 11:58:47AM -0400, Eugene Loh via DTrace-devel wrote:
> > > > On 4/8/22 10:35 AM, Kris Van Hees wrote:
> > > > 
> > > > > I would prefer to put this test on hold until we actually have USDT support in
> > > > > this version.
> > > > Meanwhile, the test is failing on OL8/ARM.  The motivation was to deal with
> > > > test failures we see every release.
> > > If it is giving inconsistent behaviour between architectures and/or UEK or OL
> > > versions, I'd say "skip it" with an annotation that it needs USDT.
> > Sounds reasonable.
> > 
> > There is that other issue, though, that the test is just weak:  it's happy
> > if no USDT probes are found and clearly there are lots of reasons that could
> > be the case.  (E.g. USDT probes have not been implemented.)  So since I've
> > gone through the trouble of cleaning the test up and checking it, I think
> > it'd be nice to push the test so it's available once USDT is working.
> 
> Rather than putting it in the tree untested, I'd rather see it put it on a
> separate branch of patches pending final review.  E.g. make a personal tree
> indicating it is for USDT development and put the patch there.  Then when work
> starts on USDT, that branch can be rebased and form the basis for the USDT
> work.
> 
> I certainly do not want to lose this test - it is a nice piece of work.
> 
> > > > > I agree witg your approach but there simply is not way for us
> > > > > to test right now whether this conclusively works or not.
> > > > I checked the new test on legacy DTrace.
> > > Yes, but the imolementation will be quite different for DTrace using BPF.  It
> > > defintely should behave the same way once we implement it, but wuthout a way
> > > to verify the changes on the new implementation.
> > Sorry, I don't follow.  I get that the implementation will be different, and
> > I get that that doesn't matter since we're targeting the same behavior.  I
> > just don't understand the last part.  We cannot check the test on the new
> > implementation until the new implementation exists, but the cleaned up test
> > -- vetted on an implementation that works -- gives us a leg up on testing
> > the new USDT implementation once it is available.
> > > As an aside, does the old version of the test succeed or fail on the legacy
> > > version?
> > Succeed.  Note:
> > 
> > *)  The old test started failing on ARM/OL8 because no probes were firing in
> > pause().  That is the subject of a separate email.  I think legacy DTrace is
> > not available on OL8 and therefore does not see this issue.
> > 
> > *)  Its success was unrelated to the legacy version having USDT support.  In
> > fact, the test has been passing on the new implementation precisely because
> > there are no USDT probes.
> > > > > On Tue, Apr 05, 2022 at 04:40:13PM -0400, eugene.loh--- via DTrace-devel wrote:
> > > > > > From: Eugene Loh <eugene.loh at oracle.com>
> > > > > > 
> > > > > > This test has been failing on aarch64/OL8 ever since its XFAIL was removed
> > > > > > in 8359ab81fa5e "tests: fix usdt/tst.dlclose1.sh".
> > > > > > 
> > > > > > That patch changed the problematic bufsize setting in the test, but it
> > > > > > could have removed the unnecessary bufsize setting altogether.
> > > > > > 
> > > > > > The test was then passing gratuitously.  As expected, it failed to find
> > > > > > USDT probes after the dlclose() call, but the reason was that there were
> > > > > > no USDT probes at all simply because they are not yet supported in DTrace
> > > > > > on BPF.
> > > > > > 
> > > > > > Meanwhile, the test was failing on aarch64/OL8 because no probes were
> > > > > > firing in the pause() call.
> > > > > > 
> > > > > > Fix the test so that it first confirms there are USDT probes before the
> > > > > > dlclose() call and second that there are no such probes after the call.
> > > > > > 
> > > > > > Use a different mechanism to synchronize between user program and test
> > > > > > script given the increased synchronization.
> > > > > > 
> > > > > > Eliminate the unnecessary bufsize setting.
> > > > > > 
> > > > > > When checking for USDT probes, make sure they are for the expected
> > > > > > process and not for any other test_prov* (e.g. an orphaned process from
> > > > > > an earlier test run).
> > > > > > 
> > > > > > Set @@xfail since USDT probes are not yet fully implemented.  (This new
> > > > > > version of the test has been checked on legacy DTrace.)
> > > > > > 
> > > > > > Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
> > > > > > ---
> > > > > >    test/unittest/usdt/tst.dlclose1.r   |   8 +-
> > > > > >    test/unittest/usdt/tst.dlclose1.r.p |  12 +++
> > > > > >    test/unittest/usdt/tst.dlclose1.sh  | 141 +++++++++++++++++++++-------
> > > > > >    3 files changed, 126 insertions(+), 35 deletions(-)
> > > > > >    create mode 100755 test/unittest/usdt/tst.dlclose1.r.p
> > > > > > 
> > > > > > diff --git a/test/unittest/usdt/tst.dlclose1.r b/test/unittest/usdt/tst.dlclose1.r
> > > > > > index 91cf962d..7873cb51 100644
> > > > > > --- a/test/unittest/usdt/tst.dlclose1.r
> > > > > > +++ b/test/unittest/usdt/tst.dlclose1.r
> > > > > > @@ -1,4 +1,6 @@
> > > > > > -   ID   PROVIDER            MODULE                          FUNCTION NAME
> > > > > > -
> > > > > > +started pid NNN
> > > > > > + ID PROVIDER MODULE FUNCTION NAME
> > > > > > +NNN test_provNNN livelib.so go go
> > > > > > + ID PROVIDER MODULE FUNCTION NAME
> > > > > >    -- @@stderr --
> > > > > > -dtrace: failed to match test_prov*:::: No probe matches description
> > > > > > +dtrace: failed to match test_provNNN:::: No probe matches description
> > > > > > diff --git a/test/unittest/usdt/tst.dlclose1.r.p b/test/unittest/usdt/tst.dlclose1.r.p
> > > > > > new file mode 100755
> > > > > > index 00000000..da4a2cbc
> > > > > > --- /dev/null
> > > > > > +++ b/test/unittest/usdt/tst.dlclose1.r.p
> > > > > > @@ -0,0 +1,12 @@
> > > > > > +#!/bin/awk -f
> > > > > > +{
> > > > > > +	# ignore the specific probe ID or process ID
> > > > > > +	# (the script ensures the process ID is consistent)
> > > > > > +	gsub(/[0-9]+/, "NNN");
> > > > > > +
> > > > > > +	# ignore the numbers of spaces for alignment
> > > > > > +	# (they depend on the ID widths)
> > > > > > +	gsub(/ +/, " ");
> > > > > > +
> > > > > > +	print;
> > > > > > +}
> > > > > > diff --git a/test/unittest/usdt/tst.dlclose1.sh b/test/unittest/usdt/tst.dlclose1.sh
> > > > > > index b33ca4cf..81fa2415 100755
> > > > > > --- a/test/unittest/usdt/tst.dlclose1.sh
> > > > > > +++ b/test/unittest/usdt/tst.dlclose1.sh
> > > > > > @@ -1,19 +1,34 @@
> > > > > >    #!/bin/bash
> > > > > >    #
> > > > > >    # Oracle Linux DTrace.
> > > > > > -# Copyright (c) 2007, 2021, Oracle and/or its affiliates. All rights reserved.
> > > > > > +# Copyright (c) 2007, 2022, 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.
> > > > > >    #
> > > > > > -# This test verifies that USDT providers are removed when its associated
> > > > > > +# This test verifies that USDT providers are removed when the associated
> > > > > >    # load object is closed via dlclose(3dl).
> > > > > > -
> > > > > > -PATH=/usr/bin:/usr/sbin:$PATH
> > > > > > -
> > > > > > -if [ $# != 1 ]; then
> > > > > > -	echo expected one argument: '<'dtrace-path'>'
> > > > > > -	exit 2
> > > > > > -fi
> > > > > > +#
> > > > > > +# The expected sequence of events is:
> > > > > > +#
> > > > > > +#     main.c                                 script
> > > > > > +#     ==============================         =================================
> > > > > > +#
> > > > > > +#     load livelib.so
> > > > > > +#     write "started" to myfile.txt
> > > > > > +#                                            see "started" in myfile.txt
> > > > > > +#                                            check USDT provider test_prov$pid
> > > > > > +#                                            signal USR1
> > > > > > +#     get USR1
> > > > > > +#     run dlclose()
> > > > > > +#     write  "dlclosed" to myfile.txt
> > > > > > +#                                            see "dlclosed" in myfile.txt
> > > > > > +#                                            check USDT provider test_prov$pid
> > > > > > +#                                            kill main.c
> > > > > > +#
> > > > > > +# The first USDT provider check should find test_prov$pid.
> > > > > > +# The second should not.
> > > > > > +#
> > > > > > +# @@xfail: dtv2 (USDT probes)
> > > > > >    dtrace=$1
> > > > > >    CC=/usr/bin/gcc
> > > > > > @@ -23,6 +38,10 @@ DIRNAME="$tmpdir/usdt-dlclose1.$$.$RANDOM"
> > > > > >    mkdir -p $DIRNAME
> > > > > >    cd $DIRNAME
> > > > > > +#
> > > > > > +# set up Makefile
> > > > > > +#
> > > > > > +
> > > > > >    cat > Makefile <<EOF
> > > > > >    all: main livelib.so deadlib.so
> > > > > > @@ -59,6 +78,10 @@ clobber: clean
> > > > > >    	rm -f main livelib.so deadlib.so
> > > > > >    EOF
> > > > > > +#
> > > > > > +# set up some small files
> > > > > > +#
> > > > > > +
> > > > > >    cat > prov.d <<EOF
> > > > > >    provider test_prov {
> > > > > >    	probe go();
> > > > > > @@ -67,7 +90,6 @@ EOF
> > > > > >    cat > livelib.c <<EOF
> > > > > >    #include "prov.h"
> > > > > > -
> > > > > >    void
> > > > > >    go(void)
> > > > > >    {
> > > > > > @@ -82,57 +104,112 @@ go(void)
> > > > > >    }
> > > > > >    EOF
> > > > > > +#
> > > > > > +# set up main.c
> > > > > > +#
> > > > > >    cat > main.c <<EOF
> > > > > >    #include <dlfcn.h>
> > > > > > +#include <signal.h>
> > > > > >    #include <unistd.h>
> > > > > >    #include <stdio.h>
> > > > > > +void *live;
> > > > > > +
> > > > > > +static void
> > > > > > +interrupt(int sig)
> > > > > > +{
> > > > > > +	/* close livelib.so to remove USDT probes */
> > > > > > +	dlclose(live);
> > > > > > +
> > > > > > +	/* notification */
> > > > > > +	printf("dlclosed\n");
> > > > > > +	fflush(stdout);
> > > > > > +}
> > > > > > +
> > > > > >    int
> > > > > >    main(int argc, char **argv)
> > > > > >    {
> > > > > > -	void *live;
> > > > > > +	struct sigaction act;
> > > > > > +	/* open livelib.so to make USDT probes visible */
> > > > > >    	if ((live = dlopen("./livelib.so", RTLD_LAZY | RTLD_LOCAL)) == NULL) {
> > > > > >    		printf("dlopen of livelib.so failed: %s\n", dlerror());
> > > > > >    		return 1;
> > > > > >    	}
> > > > > > -	dlclose(live);
> > > > > > +	/* set the handler to listen for SIGUSR1 */
> > > > > > +	act.sa_handler = interrupt;
> > > > > > +	act.sa_flags = 0;
> > > > > > +	if (sigaction(SIGUSR1, &act, NULL)) {
> > > > > > +		printf("set handler failed\n");
> > > > > > +		return 1;
> > > > > > +	}
> > > > > > +
> > > > > > +	/* notification */
> > > > > > +	printf("started\n");
> > > > > > +	fflush(stdout);
> > > > > > +	/* wait for SIGUSR1 to execute handler */
> > > > > > +	pause();
> > > > > > +
> > > > > > +	/* wait for SIGKILL to terminate */
> > > > > >    	pause();
> > > > > >    	return 0;
> > > > > >    }
> > > > > >    EOF
> > > > > > +#
> > > > > > +# make
> > > > > > +#
> > > > > > +
> > > > > >    make > /dev/null
> > > > > >    if [ $? -ne 0 ]; then
> > > > > >    	echo "failed to build" >& 2
> > > > > >    	exit 1
> > > > > >    fi
> > > > > > -script() {
> > > > > > -	$dtrace -Zw -x bufsize=64k -c ./main -qs /dev/stdin <<EOF
> > > > > > -	syscall::pause:entry,
> > > > > > -	syscall::rt_sig*:entry
> > > > > > -	/pid == \$target/
> > > > > > -	{
> > > > > > -		system("$dtrace -l -P test_prov*");
> > > > > > -		system("kill %d", \$target);
> > > > > > -		exit(0);
> > > > > > -	}
> > > > > > +#
> > > > > > +# set up a wait mechanism
> > > > > > +#
> > > > > > -	tick-1s
> > > > > > -	/i++ == 5/
> > > > > > -	{
> > > > > > -		printf("failed\n");
> > > > > > -		exit(1);
> > > > > > -	}
> > > > > > -EOF
> > > > > > +# args:
> > > > > > +#   1: number of seconds to wait
> > > > > > +#   2: string to watch for
> > > > > > +#   3: file to watch
> > > > > > +function mywait() {
> > > > > > +	for iter in `seq $1`; do
> > > > > > +		sleep 1
> > > > > > +		if grep -q "$2" $3; then
> > > > > > +			iter=0
> > > > > > +			break
> > > > > > +		fi
> > > > > > +	done
> > > > > > +	if [[ $iter -ne 0 ]]; then
> > > > > > +		echo did not see message: $2
> > > > > > +		echo "==================== start of messages"
> > > > > > +		cat $3
> > > > > > +		echo "==================== end of messages"
> > > > > > +		kill -s KILL $pid
> > > > > > +		exit 1
> > > > > > +	fi
> > > > > >    }
> > > > > > -script
> > > > > > -status=$?
> > > > > > +#
> > > > > > +# run the process in the background and check USDT probes
> > > > > > +#
> > > > > > +
> > > > > > +./main > myfile.txt &
> > > > > > +pid=$!
> > > > > > +echo started pid $pid
> > > > > > +
> > > > > > +mywait 6 "started"  myfile.txt # wait for process to start
> > > > > > +$dtrace -lP test_prov$pid      # check USDT probes
> > > > > > +kill -s USR1 $pid              # signal process
> > > > > > +
> > > > > > +mywait 6 "dlclosed" myfile.txt # wait for process to dlclose
> > > > > > +$dtrace -lP test_prov$pid      # check USDT probes
> > > > > > +kill -s KILL $pid              # kill process
> > > > > > -exit $status
> > > > > > +exit 0
> > > > > > -- 
> > > > > > 2.18.4
> > > > > > 
> > > > > > 
> > > > > > _______________________________________________
> > > > > > DTrace-devel mailing list
> > > > > > DTrace-devel at oss.oracle.com
> > > > > > https://oss.oracle.com/mailman/listinfo/dtrace-devel
> > > > _______________________________________________
> > > > DTrace-devel mailing list
> > > > DTrace-devel at oss.oracle.com
> > > > https://oss.oracle.com/mailman/listinfo/dtrace-devel
> > 
> > _______________________________________________
> > DTrace-devel mailing list
> > DTrace-devel at oss.oracle.com
> > https://oss.oracle.com/mailman/listinfo/dtrace-devel
> 
> _______________________________________________
> 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