On Fri, Jul 11, 2025 at 10:54 AM Ilya Maximets <i.maxim...@ovn.org> wrote:

> Retis is very useful for debugging our system tests or debugging
> kernel issues through our system tests.  This change adds a convenient
> way to run any kernel system test with the retis capture on the
> background.  E.g.:
>
>   make check-kernel OVS_TEST_WITH_RETIS=yes TESTSUITEFLAGS='168 -d'
>
> Retis 1.5 is required, since we're using ifdump profile, and it also
> will mount debugfs for us in case of running in a different namespace.
> It should be available in $PATH.
>
> In addition to just capturing the retis.data, we're also running the
> capture with --print to print all the events as they appear, and
> producing the sorted output in the end.  This makes it easier to work
> across systems with different versions of retis and saves time for
> running the sort manually.  The raw data is still available for
> advanced processing, if needed.
>
> Not specifying any particular collector, capturing everything that's
> enabled by default.  OVS tracking is turned on by default.
>
> Since OVS tracking is used, it's required to start retis after the
> kernel datapath is created, otherwise it will fail to obtain the map
> of upcall PIDs.  That's why we need to start it after the bridge is
> created.  This also makes it necessary to build the OVS submodule
> with --enable-usdt-probes flag, otherwise retis may refuse to start
> when it can't find any probes in the running ovs-vswitchd.
>
> Only adding support for kernel test suite for now.  For userspace test
> suites it may also be useful at some point, but currently that requires
> running without --ovs-track and isn't too important.
>
> Startup of the retis capture adds significant amount of time to each
> test, so not running it by default.
>
> This change is ported from the corresponding OVS change:
>
> https://github.com/openvswitch/ovs/commit/22732c0e6770597031d1eb0a61ec922ea296c8b1
> The environment variable name starts with OVS_ for that reason.  But
> we already have the OVS_PAUSE_TEST, so just following the pattern.
>
> The DAEMONIZE() macro is changed to use 'on_exit' instead of appending
> commands directly to the 'cleanup' file.  That ensures the correct
> ordering between stopping the daemon and running the 'retis sort', as
> 'on_exit' ensures that cleanup commands are executed in the reverse
> order.  This makes the macro similar to OVS_DAEMONIZE in the OVS repo.
> In the future, a similar change can be made in the NETNS_DAEMONIZE()
> as well to ensure the proper ordering, but it's not necessary for now.
>
> Link: https://github.com/retis-org/retis
> Signed-off-by: Ilya Maximets <i.maxim...@ovn.org>
> ---
>  Documentation/topics/testing.rst | 24 ++++++++++++++++++++++++
>  NEWS                             |  3 +++
>  tests/system-common-macros.at    | 17 ++++++++++++++---
>  tests/system-kmod-macros.at      |  3 +++
>  4 files changed, 44 insertions(+), 3 deletions(-)
>
> diff --git a/Documentation/topics/testing.rst
> b/Documentation/topics/testing.rst
> index d85dc50c6..cc928ef64 100644
> --- a/Documentation/topics/testing.rst
> +++ b/Documentation/topics/testing.rst
> @@ -220,6 +220,30 @@ All the features documented under `Unit Tests`_ are
> available for the
>  datapath testsuites, except that the datapath testsuites do not
>  support running tests in parallel.
>
> +It is also possible to run `retis`_ capture along with the `check-kernel`
> tests
> +by setting `OVS_TEST_WITH_RETIS` environment variable to 'yes'.  This can
> be
> +useful for debugging the test cases.  For example, the following command
> can be
> +used to run the test 168 under `retis`::
> +
> +    $ make check-kernel OVS_TEST_WITH_RETIS=yes TESTSUITEFLAGS='168 -d'
> +
> +After the test is completed, the following data will be available in the
> test
> +directory:
> +
> +* `retis.err` - standard error stream of the `retis collect`.
> +* `retis.log` - standard output of the `retis collect`, contains all
> captured
> +  events in the order they appeared.
> +* `retis.data` - raw events collected by retis, `retis sort` or other
> commands
> +  can be used on this file for further analysis.
> +* `retis.sorted` - text file containing the output of `retis sort`
> executed on
> +  the `retis.data`, for convenience.
> +
> +Requires retis version 1.5 or newer.  And this also requires OVS
> submodule to
> +be built with `--enable-usdt-probes`.
> +
> +.. _retis: https://github.com/retis-org/retis
> +
> +
>  Performance testing
>  ~~~~~~~~~~~~~~~~~~~
>
> diff --git a/NEWS b/NEWS
> index 8fa0c3f26..365134d61 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -36,6 +36,9 @@ Post v25.03.0
>     - Added a new ACL option "--all" to "acl-list" command. When set,
>       "acl-list" command will also list port groups ACLs associated with
>       each port of the target logical switch.
> +   - Added support for running tests from the 'check-kernel' system test
> target
> +     under retis by setting OVS_TEST_WITH_RETIS=yes.  See the 'Testing'
> section
> +     of the documentation for more details.
>
>  OVN v25.03.0 - 07 Mar 2025
>  --------------------------
> diff --git a/tests/system-common-macros.at b/tests/system-common-macros.at
> index 93979ff62..a49776f38 100644
> --- a/tests/system-common-macros.at
> +++ b/tests/system-common-macros.at
> @@ -244,9 +244,20 @@ m4_define([FORMAT_CT],
>  #
>  m4_define([DAEMONIZE],
>     [$1 & echo $! > $2
> -     echo "kill \`cat $2\`" >> cleanup
> -   ]
> -)
> +    on_exit "kill \`cat $2\`"
> +   ])
> +
> +# RETIS_CHECK_AND_RUN()
> +#
> +# Start retis to track all the traffic passing through OVS.
> +m4_define([RETIS_CHECK_AND_RUN],
> +  [if test "$OVS_TEST_WITH_RETIS" = yes && retis --version > /dev/null;
> then
> +       on_exit 'retis sort --utc retis.data > retis.sorted'
> +       DAEMONIZE([retis -p ifdump collect --utc --allow-system-changes \
> +                        --ovs-track --out --print 2>retis.err
> 1>retis.log],
> +                 [retis.pid])
> +       OVS_WAIT_UNTIL([grep -q 'loaded' retis.err])
> +   fi])
>
>  # NETNS_DAEMONIZE([namespace], [command], [pidfile])
>  #
> diff --git a/tests/system-kmod-macros.at b/tests/system-kmod-macros.at
> index 41a8b7914..1ada0077e 100644
> --- a/tests/system-kmod-macros.at
> +++ b/tests/system-kmod-macros.at
> @@ -30,6 +30,9 @@ m4_define([OVS_TRAFFIC_VSWITCHD_START],
>     if test OVN_MONITOR_ALL = yes; then
>          ovs-vsctl set open . external_ids:ovn-monitor-all=true
>     fi
> +
> +   dnl Start retis capture if requested.
> +   RETIS_CHECK_AND_RUN()
>  ])
>
>  # OVS_TRAFFIC_VSWITCHD_STOP([ALLOWLIST], [extra_cmds])
> --
> 2.49.0
>
> _______________________________________________
> dev mailing list
> d...@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
>
Thank you Ilya,

I went ahead and merged this into main.

Regards,
Ales
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to