Date: Thu, 5 Dec 2013 10:20:40 +0000 (UTC) From: Peter Holm <pho@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r258970 - user/pho/stress2/misc Message-ID: <201312051020.rB5AKee6065601@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: pho Date: Thu Dec 5 10:20:40 2013 New Revision: 258970 URL: http://svnweb.freebsd.org/changeset/base/258970 Log: Added two new rename(2) scenarios. Sponsored by: EMC / Isilon storage division Added: user/pho/stress2/misc/rename11.sh (contents, props changed) user/pho/stress2/misc/rename12.sh (contents, props changed) Added: user/pho/stress2/misc/rename11.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/pho/stress2/misc/rename11.sh Thu Dec 5 10:20:40 2013 (r258970) @@ -0,0 +1,139 @@ +#!/bin/sh + +# +# Copyright (c) 2013 EMC Corp. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ +# + +# SU problem with "mkdir(d.008740.000987): Too many links" seen. + +[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 + +. ../default.cfg + +here=`pwd` +cd /tmp +sed '1,/^EOF/d' < $here/$0 > rename11.c +cc -o rename11 -Wall -Wextra rename11.c || exit 1 +rm -f rename11.c + +mount | grep "on $mntpoint " | grep -q /dev/md && umount -f $mntpoint +mdconfig -l | grep -q md$mdstart && mdconfig -d -u $mdstart + +mdconfig -a -t swap -s 2g -u $mdstart || exit 1 +bsdlabel -w md$mdstart auto +#newfs md${mdstart}$part > /dev/null # No problems seen without SU +newfs $newfs_flags md${mdstart}$part > /dev/null +mount /dev/md${mdstart}$part $mntpoint + +mkdir ${mntpoint}/dir +( + cd ${mntpoint}/dir + /tmp/rename11 || echo FAIL +) + +while mount | grep "on $mntpoint " | grep -q /dev/md; do + umount $mntpoint || sleep 1 +done + +checkfs /dev/md${mdstart}$part +mdconfig -d -u $mdstart +rm -rf /tmp/rename11 +exit 0 +EOF +#include <err.h> +#include <fcntl.h> +#include <libgen.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <unistd.h> + +#define LOOPS 10 +#define PARALLEL 3 +#define ND 5000 + +void +check(char *name) +{ + struct stat sb; + + if (stat(name, &sb) == -1) + warn("stat(%s)", name); + else + warnx("stat(%s) succeeded!", name); +} + +void +dirs(void) +{ + pid_t pid; + int i, j; + char name[80], to[80]; + + pid = getpid(); + + for (j = 0; j < LOOPS; j++) { + for (i = 0; i < ND; i++) { + snprintf(name, sizeof(name), "d.%06d.%06d", pid, i); + if (mkdir(name, 0700) == -1) + err(1, "mkdir(%s)", name); + snprintf(to , sizeof(to ), "d2.%06d.%06d", pid, i); + if (rename(name, to) == -1) + warn("rename(%s, %s)", name, to); + if (rename(to, name) == -1) + warn("rename(%s, %s)", to, name); + if (rmdir(name) == -1) { + check(name); + err(1, "rmdir(%s)", name); + } + } + } + + _exit(0); +} + +int +main(void) +{ + int i, r, s; + + r = 0; + for (i = 0; i < PARALLEL; i++) { + if (fork() == 0) + dirs(); + } + + for (i = 0; i < PARALLEL; i++) { + wait(&s); + r += WEXITSTATUS(s); + } + + return (r); +} Added: user/pho/stress2/misc/rename12.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/pho/stress2/misc/rename12.sh Thu Dec 5 10:20:40 2013 (r258970) @@ -0,0 +1,186 @@ +#!/bin/sh + +# +# Copyright (c) 2013 EMC Corp. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ +# + +# No problems seen with SU. Panics with SU+J, just like suj30.sh + +[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 + +. ../default.cfg + +here=`pwd` +cd /tmp +sed '1,/^EOF/d' < $here/$0 > rename12.c +cc -o rename12 -Wall -Wextra rename12.c || exit 1 +rm -f rename12.c + +mount | grep "on $mntpoint " | grep -q /dev/md && umount -f $mntpoint +mdconfig -l | grep -q md$mdstart && mdconfig -d -u $mdstart + +mdconfig -a -t swap -s 4g -u $mdstart || exit 1 +bsdlabel -w md$mdstart auto +newfs $newfs_flags md${mdstart}$part > /dev/null +mount /dev/md${mdstart}$part $mntpoint + +inodes=`df -i $mntpoint | tail -1 | awk '{print $7}'` +N=12 +for i in `jot 4`; do + for j in `jot $N`; do + mkdir -p $mntpoint/d$j/dir1 + mkdir -p $mntpoint/d$j/dir2 + (cd $mntpoint/d$j; /tmp/rename12 $((inodes/N)) ) & + done + for j in `jot $N`; do + wait + rmdir $mntpoint/d$j/dir1 + rmdir $mntpoint/d$j/dir2 + done +done + +while mount | grep "on $mntpoint " | grep -q /dev/md; do + umount $mntpoint || sleep 1 +done + +checkfs /dev/md${mdstart}$part +mdconfig -d -u $mdstart +rm -rf /tmp/rename12 +exit 0 +EOF +#include <err.h> +#include <errno.h> +#include <fcntl.h> +#include <libgen.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <unistd.h> + +pid_t crpid; +long n; +int mvpipe[2], rmpipe[2]; + +void +cr(void) +{ + pid_t pid; + int i; + char name[80]; + + setproctitle("cr"); + pid = getpid(); + usleep(arc4random() & 1000); + for (i = 0; i < n; i++) { + snprintf(name, sizeof(name), "dir1/d.%06d.%06d", pid, i); + if (mkdir(name, 0700) == -1) + err(1, "mkdir(%s). %s:%d", name, __FILE__, __LINE__); + if (write(mvpipe[1], &i, sizeof(i)) != sizeof(i)) + err(1, "write mvpipe"); + } + + _exit(0); +} + +void +mv(void) +{ + pid_t pid; + int i; + char name[80], to[80]; + + setproctitle("mv"); + pid = crpid; + i = 0; + while (i != n - 1 && + read(mvpipe[0], &i, sizeof(i)) == sizeof(i)) { + snprintf(name, sizeof(name), "dir1/d.%06d.%06d", pid, i); + snprintf(to , sizeof(to ), "dir2/d.%06d.%06d", pid, i); + if (rename(name, to) == -1) + warn("rename(%s, %s)", name, to); + if (write(rmpipe[1], &i, sizeof(i)) != sizeof(i)) + err(1, "write rmpipe"); + } + _exit(0); +} + +void +rm(void) +{ + pid_t pid; + int i; + char to[80]; + + setproctitle("rm"); + pid = crpid; + while (i != n - 1 && + read(rmpipe[0], &i, sizeof(i)) == sizeof(i)) { + snprintf(to, sizeof(to ), "dir2/d.%06d.%06d", pid, i); + if (rmdir(to) == -1) + warn("rmdir(%s)", to); + } + _exit(0); +} + +int +main(int argc, char **argv) +{ + int r, s; + + if (argc != 2) + errx(1, "Usage %s <num inodes>", argv[0]); + n = atol(argv[1]); + if (n > 32765) { +// fprintf(stderr, "Changing number of dirs from %ld to 32765\n", n); + n = 32765 - 1; + } + + if (pipe(mvpipe) == -1) + err(1, "pipe()"); + if (pipe(rmpipe) == -1) + err(1, "pipe()"); + + r = 0; + if ((crpid = fork()) == 0) + cr(); + if (fork() == 0) + mv(); + if (fork() == 0) + rm(); + + wait(&s); + r += WEXITSTATUS(s); + wait(&s); + r += WEXITSTATUS(s); + wait(&s); + r += WEXITSTATUS(s); + + return (r); +}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201312051020.rB5AKee6065601>