linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Paul Moore <paul@paul-moore.com>
To: jack@suse.cz
Cc: viro@zeniv.linux.org.uk, linux-audit@redhat.com,
	linux-fsdevel@vger.kernel.org, rgb@redhat.com,
	amir73il@gmail.com
Subject: Re: [PATCH 12/11 TESTSUITE] audit_testsuite: Add stress test for tree watches
Date: Mon, 19 Nov 2018 10:19:55 -0500	[thread overview]
Message-ID: <CAHC9VhQO2Kmc8K7Hw=kizdLtRjqH6fkve8Rit2qdx1bP67aJzQ@mail.gmail.com> (raw)
In-Reply-To: <20181114121616.GB19383@quack2.suse.cz>

On Wed, Nov 14, 2018 at 7:16 AM Jan Kara <jack@suse.cz> wrote:
> On Tue 13-11-18 19:34:18, Paul Moore wrote:
> > On Tue, Sep 4, 2018 at 12:06 PM Jan Kara <jack@suse.cz> wrote:
> > > Add stress test for stressing audit tree watches by adding and deleting
> > > rules while events are generated and watched filesystems are mounted and
> > > unmounted in parallel.
> > >
> > > Signed-off-by: Jan Kara <jack@suse.cz>
> > > ---
> > >  tests/stress_tree/Makefile |   8 +++
> > >  tests/stress_tree/test     | 171 +++++++++++++++++++++++++++++++++++++++++++++
> > >  2 files changed, 179 insertions(+)
> > >  create mode 100644 tests/stress_tree/Makefile
> > >  create mode 100755 tests/stress_tree/test
> >
> > I'd like to get this into the audit-testsuite repo, but I think it
> > should live under test_manual/ instead of tests, is that okay with
> > you?  If so, no need to resubmit, I can move the file during the
> > merge.
>
> Sure, move it wherever you find it best.

Great, merged into the tests_manual directory, and fixed up some style
nits found via ./tools/check-syntax.  Thanks again!

> > > diff --git a/tests/stress_tree/Makefile b/tests/stress_tree/Makefile
> > > new file mode 100644
> > > index 000000000000..7ade09aad86f
> > > --- /dev/null
> > > +++ b/tests/stress_tree/Makefile
> > > @@ -0,0 +1,8 @@
> > > +TARGETS=$(patsubst %.c,%,$(wildcard *.c))
> > > +
> > > +LDLIBS += -lpthread
> > > +
> > > +all: $(TARGETS)
> > > +clean:
> > > +       rm -f $(TARGETS)
> > > +
> > > diff --git a/tests/stress_tree/test b/tests/stress_tree/test
> > > new file mode 100755
> > > index 000000000000..6215bec810d1
> > > --- /dev/null
> > > +++ b/tests/stress_tree/test
> > > @@ -0,0 +1,171 @@
> > > +#!/usr/bin/perl
> > > +
> > > +use strict;
> > > +
> > > +use Test;
> > > +BEGIN { plan tests => 1 }
> > > +
> > > +use File::Temp qw/ tempdir tempfile /;
> > > +
> > > +###
> > > +# functions
> > > +
> > > +sub key_gen {
> > > +       my @chars = ( "A" .. "Z", "a" .. "z" );
> > > +       my $key = "testsuite-" . time . "-";
> > > +       $key .= $chars[ rand @chars ] for 1 .. 8;
> > > +       return $key;
> > > +}
> > > +
> > > +# Run stat on random files in subtrees to generate audit events
> > > +sub run_stat {
> > > +       my($dir,$dirs) = @_;
> > > +       my $path;
> > > +
> > > +       while (1) {
> > > +               $path = "$dir/mnt/mnt".int(rand($dirs))."/subdir".int(rand($dirs));
> > > +               stat($path);
> > > +       }
> > > +}
> > > +
> > > +# Generate audit rules for subtrees. Do one rule per subtree. Because watch
> > > +# recursively iterates child mounts and we mount $dir/leaf$i under various
> > > +# subtrees, the inode corresponding to $dir/leaf$i gets tagged by different
> > > +# trees.
> > > +sub run_mark_audit {
> > > +       my($dir,$dirs,$key) = @_;
> > > +
> > > +       while (1) {
> > > +               for (my $i=0; $i < $dirs; $i++) {
> > > +                       system("auditctl -w $dir/mnt/mnt$i -p r -k $key");
> > > +               }
> > > +               system("auditctl -D -k $key >& /dev/null");
> > > +       }
> > > +}
> > > +
> > > +sub umount_all {
> > > +       my($dir,$dirs,$ignore_fail) = @_;
> > > +
> > > +       for (my $i=0; $i < $dirs; $i++) {
> > > +               while (system("umount $dir/leaf$i >& /dev/null") > 0 &&
> > > +                      $ignore_fail == 0) {
> > > +                       # Nothing - loop until umount succeeds
> > > +               }
> > > +       }
> > > +       for (my $i=0; $i < $dirs; $i++) {
> > > +               for (my $j=0; $j < $dirs; $j++) {
> > > +                       while (system("umount $dir/mnt/mnt$i/subdir$j >& /dev/null") > 0 &&
> > > +                              $ignore_fail == 0) {
> > > +                               # Nothing - loop until umount succeeds
> > > +                       }
> > > +               }
> > > +               while (system("umount $dir/mnt/mnt$i >& /dev/null") > 0 &&
> > > +                      $ignore_fail == 0) {
> > > +                       # Nothing - loop until umount succeeds
> > > +               }
> > > +       }
> > > +}
> > > +
> > > +# Mount and unmount filesystems. We pick random leaf mount so that sometimes
> > > +# a leaf mount point root inode will gather more tags from different trees
> > > +# and sometimes we will be quicker in unmounting all instances of leaf and
> > > +# thus excercise inode evistion path
> > > +sub run_mount {
> > > +       my($dir,$dirs) = @_;
> > > +
> > > +       while (1) {
> > > +               # We use tmpfs here and not just bind mounts of some dir so
> > > +               # that the root inode gets evicted once all instances are
> > > +               # unmounted.
> > > +               for (my $i=0; $i < $dirs; $i++) {
> > > +                       system("mount -t tmpfs none $dir/leaf$i");
> > > +               }
> > > +               for (my $i=0; $i < $dirs; $i++) {
> > > +                       system("mount --bind $dir/dir$i $dir/mnt/mnt$i");
> > > +                       for (my $j=0; $j < $dirs; $j++) {
> > > +                               my $leaf="$dir/leaf".int(rand($dirs));
> > > +                               system("mount --bind $leaf $dir/mnt/mnt$i/subdir$j");
> > > +                       }
> > > +               }
> > > +               umount_all($dir, $dirs, 0);
> > > +       }
> > > +}
> > > +
> > > +
> > > +###
> > > +# setup
> > > +
> > > +# reset audit
> > > +system("auditctl -D >& /dev/null");
> > > +
> > > +# create temp directory
> > > +my $dir = tempdir( TEMPLATE => '/tmp/audit-testsuite-XXXX', CLEANUP => 1 );
> > > +
> > > +# create stdout/stderr sinks
> > > +( my $fh_out, my $stdout ) = tempfile(
> > > +       TEMPLATE => '/tmp/audit-testsuite-out-XXXX',
> > > +       UNLINK   => 1
> > > +);
> > > +( my $fh_err, my $stderr ) = tempfile(
> > > +       TEMPLATE => '/tmp/audit-testsuite-err-XXXX',
> > > +       UNLINK   => 1
> > > +);
> > > +
> > > +###
> > > +# tests
> > > +
> > > +my $dirs = 4;
> > > +
> > > +# setup directory hierarchy
> > > +for (my $i=0; $i < $dirs; $i++) {
> > > +       mkdir $dir."/dir".$i;
> > > +       for (my $j=0; $j < $dirs; $j++) {
> > > +               mkdir $dir."/dir".$i."/subdir".$j;
> > > +       }
> > > +}
> > > +mkdir "$dir/mnt";
> > > +for (my $i=0; $i < $dirs; $i++) {
> > > +       mkdir "$dir/mnt/mnt$i";
> > > +       mkdir "$dir/leaf$i";
> > > +}
> > > +
> > > +my $stat_pid = fork();
> > > +
> > > +if ($stat_pid == 0) {
> > > +       run_stat($dir, $dirs);
> > > +       # Never reached
> > > +       exit;
> > > +}
> > > +
> > > +my $mount_pid = fork();
> > > +
> > > +if ($mount_pid == 0) {
> > > +       run_mount($dir, $dirs);
> > > +       # Never reached
> > > +       exit;
> > > +}
> > > +
> > > +my $key = key_gen();
> > > +
> > > +my $audit_pid = fork();
> > > +
> > > +if ($audit_pid == 0) {
> > > +       run_mark_audit($dir, $dirs, $key);
> > > +       # Never reached
> > > +       exit;
> > > +}
> > > +
> > > +# Sleep for a minute to let stress test run...
> > > +sleep(60);
> > > +ok(1);
> > > +
> > > +###
> > > +# cleanup
> > > +
> > > +kill('KILL', $stat_pid, $mount_pid, $audit_pid);
> > > +# Wait for children to terminate
> > > +waitpid($stat_pid, 0);
> > > +waitpid($mount_pid, 0);
> > > +waitpid($audit_pid, 0);
> > > +system("auditctl -D >& /dev/null");
> > > +umount_all($dir, $dirs, 1);
> > > --
> > > 2.16.4
> > >
> >
> >
> > --
> > paul moore
> > www.paul-moore.com
> --
> Jan Kara <jack@suse.com>
> SUSE Labs, CR



-- 
paul moore
www.paul-moore.com

  reply	other threads:[~2018-11-20  1:44 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-04 16:06 [PATCH 0/11 v3] audit: Fix various races when tagging and untagging mounts Jan Kara
2018-09-04 16:06 ` [PATCH 01/11] audit_tree: Remove mark->lock locking Jan Kara
2018-09-04 16:06 ` [PATCH 02/11] audit: Fix possible spurious -ENOSPC error Jan Kara
2018-09-04 16:06 ` [PATCH 03/11] audit: Fix possible tagging failures Jan Kara
2018-09-04 16:06 ` [PATCH 04/11] audit: Embed key into chunk Jan Kara
2018-09-13 20:06   ` Richard Guy Briggs
2018-09-04 16:06 ` [PATCH 05/11] audit: Make hash table insertion safe against concurrent lookups Jan Kara
2018-09-04 16:06 ` [PATCH 06/11] audit: Factor out chunk replacement code Jan Kara
2018-09-04 16:06 ` [PATCH 07/11] audit: Remove pointless check in insert_hash() Jan Kara
2018-09-04 16:06 ` [PATCH 08/11] audit: Provide helper for dropping mark's chunk reference Jan Kara
2018-09-04 16:06 ` [PATCH 09/11] audit: Allocate fsnotify mark independently of chunk Jan Kara
2018-09-14 14:09   ` Richard Guy Briggs
2018-09-17 16:46     ` Jan Kara
2018-10-03 22:11       ` Paul Moore
2018-10-03 22:08   ` Paul Moore
2018-10-03 22:39     ` Richard Guy Briggs
2018-10-04  6:57     ` Jan Kara
2018-09-04 16:06 ` [PATCH 10/11] audit: Replace chunk attached to mark instead of replacing mark Jan Kara
2018-09-04 16:06 ` [PATCH 11/11] audit: Use 'mark' name for fsnotify_mark variables Jan Kara
2018-09-14 18:29   ` Richard Guy Briggs
2018-09-17 16:44     ` Jan Kara
2018-09-17 18:13       ` Richard Guy Briggs
2018-09-04 16:06 ` [PATCH 12/11 TESTSUITE] audit_testsuite: Add stress test for tree watches Jan Kara
2018-09-14 18:21   ` Richard Guy Briggs
2018-09-17 16:56     ` Jan Kara
2018-10-05 21:06   ` Paul Moore
2018-10-09  7:40     ` Jan Kara
2018-10-10  6:43       ` Paul Moore
2018-10-11 11:39         ` Jan Kara
2018-10-11 23:03           ` Paul Moore
2018-10-15 10:04             ` Jan Kara
2018-10-15 15:39               ` Paul Moore
2018-10-17 10:09                 ` Jan Kara
2018-11-14  0:34   ` Paul Moore
2018-11-14 12:16     ` Jan Kara
2018-11-19 15:19       ` Paul Moore [this message]
2018-09-14 19:13 ` [PATCH 0/11 v3] audit: Fix various races when tagging and untagging mounts Richard Guy Briggs
2018-09-17 16:57   ` Jan Kara
2018-10-04  1:20     ` Paul Moore
2018-10-04  6:59       ` Jan Kara

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAHC9VhQO2Kmc8K7Hw=kizdLtRjqH6fkve8Rit2qdx1bP67aJzQ@mail.gmail.com' \
    --to=paul@paul-moore.com \
    --cc=amir73il@gmail.com \
    --cc=jack@suse.cz \
    --cc=linux-audit@redhat.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=rgb@redhat.com \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).