]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/test/stress2/misc/temp.sh
openssh: update to OpenSSH v8.7p1
[FreeBSD/FreeBSD.git] / tools / test / stress2 / misc / temp.sh
1 #!/bin/sh
2
3 #
4 # Copyright (c) 2016 EMC Corp.
5 # All rights reserved.
6 #
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions
9 # are met:
10 # 1. Redistributions of source code must retain the above copyright
11 #    notice, this list of conditions and the following disclaimer.
12 # 2. Redistributions in binary form must reproduce the above copyright
13 #    notice, this list of conditions and the following disclaimer in the
14 #    documentation and/or other materials provided with the distribution.
15 #
16 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 # SUCH DAMAGE.
27 #
28
29 # Temp file test scenario.
30 # "temp: unlink(file.034434.48): Permission denied" seen.
31
32 . ../default.cfg
33 [ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
34
35 export LANG=C
36 dir=/tmp
37 odir=`pwd`
38 cd $dir
39 sed '1,/^EOF/d' < $odir/$0 > $dir/temp.c
40 mycc -o temp -Wall -Wextra -O0 -g temp.c || exit 1
41 rm -f temp.c
42 cd $odir
43
44 [ -z "$nfs_export" ] && exit 0
45 ping -c 2 `echo $nfs_export | sed 's/:.*//'` > /dev/null 2>&1 ||
46     exit 0
47
48 mount | grep "on $mntpoint " | grep -q nfs && umount $mntpoint
49 mount -t nfs -o tcp -o retrycnt=3 -o soft -o rw $nfs_export $mntpoint
50 mp2=$mntpoint/temp.`jot -rc 8 a z | tr -d '\n'`/temp.dir
51 rm -rf $mp2
52 mkdir -p $mp2
53 chmod 0777 $mp2
54
55 log=/tmp/temp.log
56 /tmp/temp $mp2 2> $log
57 s=$?
58 #[ $s -eq 0 ] && ministat -C 3 -A < $log
59 rm -rf $mp2
60
61 while mount | grep "on $mntpoint " | grep -q nfs; do
62         umount $mntpoint || sleep 1
63 done
64 rm -rf /tmp/temp $log
65 exit $s
66
67 EOF
68 #include <sys/param.h>
69 #include <sys/mman.h>
70 #include <sys/stat.h>
71 #include <sys/wait.h>
72
73 #include <machine/atomic.h>
74
75 #include <err.h>
76 #include <errno.h>
77 #include <fcntl.h>
78 #include <stdio.h>
79 #include <stdlib.h>
80 #include <time.h>
81 #include <unistd.h>
82
83 volatile u_int *share;
84
85 #define SYNC 0
86
87 #define FILES 1024
88 #define PARALLEL 4
89 #define RUNTIME (10 * 60)
90
91 void
92 test(char *dir)
93 {
94         pid_t pid;
95         int fd, i;
96         char path[1024];
97
98         atomic_add_int(&share[SYNC], 1);
99         while (share[SYNC] != PARALLEL)
100                 ;
101
102         pid = getpid();
103         for (i = 0; i < FILES; i++) {
104                 snprintf(path, sizeof(path), "%s/file.%06d.%d", dir, pid, i);
105                 if ((fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0640)) == -1)
106                         err(1, "open(%s)", path);
107                 if (write(fd, path, sizeof(path)) != sizeof(path))
108                         err(1, "write");
109                 close(fd);
110                 if (unlink(path) == -1)
111                         err(1, "unlink(%s)", path);
112         }
113         _exit(0);
114 }
115
116 int
117 main(int argc, char *argv[])
118 {
119         size_t len;
120         struct timeval start, stop, diff;
121         struct tm *tp;
122         time_t now, then;
123         uint64_t usec;
124         int e, i, loop, pids[PARALLEL], status;
125         char buf[80];
126
127         e = 0;
128         if (argc != 2) {
129                 fprintf(stderr, "Usage: %s <path>\n", argv[0]);
130                 _exit(1);
131         }
132         len = PAGE_SIZE;
133         if ((share = mmap(NULL, len, PROT_READ | PROT_WRITE,
134             MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED)
135                 err(1, "mmap");
136
137         loop = 0;
138         alarm(2 * RUNTIME);
139         now = time(NULL);
140         while ((time(NULL) - now) < RUNTIME && e == 0) {
141                 share[SYNC] = 0;
142                 gettimeofday(&start, NULL);
143                 for (i = 0; i < PARALLEL; i++) {
144                         if ((pids[i] = fork()) == 0)
145                                 test(argv[1]);
146                 }
147                 for (i = 0; i < PARALLEL; i++) {
148                         waitpid(pids[i], &status, 0);
149                         e += status == 0 ? 0 : 1;
150                 }
151                 gettimeofday(&stop, NULL);
152                 timersub(&stop, &start, &diff);
153                 usec  = ((uint64_t)1000000 *
154                     diff.tv_sec + diff.tv_usec);
155                 then = time(NULL);
156                 tp = localtime(&then);
157                 strftime(buf, sizeof(buf), "%H:%M:%S", tp);
158                 if (loop != 0) /* Skip warmup */
159                         fprintf(stderr, "%s %6d %.3f\n",
160                             buf, loop,
161                             (double)usec / 1000000);
162                 loop++;
163                 sleep(5);
164         }
165
166         return (e);
167 }