[2/8] xfstests: add different logging option to fsstress
Phil White
pwhite at sgi.com
Fri Dec 2 17:27:57 CST 2011
On Sat, Oct 29, 2011 at 12:48:11AM -0000, Dmitry Monakhov wrote:
> Currently the only way to log fsstress's output is to redirect it's shared
> stdout to pipe which is very painfull because:
>
> 1) Pipe writers are serialized via i_mutex so we waste cpu-cores power on stupid
> sinchronization for loging purpose, instead of hunting real race conditions,
> and bugs inside file system.
> 2) Usually output is corrupted due to luck of sychronization on shared stdout.
>
> Since fsstress's children operate on independend paths, let's just open didicated
> log file for each child and simply avoid useless sycnhronization.
>
> Reviewed-by: Christoph Hellwig <hch at lst.de>
> Signed-off-by: Dmitry Monakhov <dmonakhov at openvz.org>
>
> ---
> ltp/fsstress.c | 33 ++++++++++++++++++++++++++++++++-
> 1 files changed, 32 insertions(+), 1 deletions(-)
>
> diff --git a/ltp/fsstress.c b/ltp/fsstress.c
> index 51ecda2..c7001f3 100644
> --- a/ltp/fsstress.c
> +++ b/ltp/fsstress.c
> @@ -258,6 +258,8 @@ int main(int argc, char **argv)
> char buf[10];
> int c;
> char *dirname = NULL;
> + char *logname = NULL;
> + char rpath[PATH_MAX];
> int fd;
> int i;
> int j;
> @@ -273,7 +275,7 @@ int main(int argc, char **argv)
> nops = sizeof(ops) / sizeof(ops[0]);
> ops_end = &ops[nops];
> myprog = argv[0];
> - while ((c = getopt(argc, argv, "d:e:f:i:m:n:p:rs:vwzHS")) != -1) {
> + while ((c = getopt(argc, argv, "d:e:f:i:m:n:o:p:rs:vwzHS")) != -1) {
> switch (c) {
> case 'd':
> dirname = optarg;
> @@ -311,6 +313,10 @@ int main(int argc, char **argv)
> case 'n':
> operations = atoi(optarg);
> break;
> + case 'o':
> + logname = optarg;
> + break;
> +
> case 'p':
> nproc = atoi(optarg);
> break;
> @@ -351,10 +357,26 @@ int main(int argc, char **argv)
> }
>
> (void)mkdir(dirname, 0777);
> + if (logname && logname[0] != '/') {
> + if (getcwd(rpath, sizeof(rpath)) < 0){
> + perror("getcwd failed");
> + exit(1);
> + }
> + } else {
> + rpath[0] = '\0';
> + }
> if (chdir(dirname) < 0) {
> perror(dirname);
> exit(1);
> }
> + if (logname) {
> + char path[PATH_MAX];
> + snprintf(path, sizeof(path), "%s/%s", rpath, logname);
> + if (freopen(path, "a", stdout) == NULL) {
> + perror("freopen logfile failed");
> + exit(1);
> + }
> + }
> sprintf(buf, "fss%x", (unsigned int)getpid());
> fd = creat(buf, 0666);
> if (lseek64(fd, (off64_t)(MAXFSIZE32 + 1ULL), SEEK_SET) < 0)
> @@ -409,6 +431,15 @@ int main(int argc, char **argv)
> close(fd);
> for (i = 0; i < nproc; i++) {
> if (fork() == 0) {
> + if (logname) {
> + char path[PATH_MAX];
> + snprintf(path, sizeof(path), "%s/%s.%d",
> + rpath, logname, i);
> + if (freopen(path, "a", stdout) == NULL) {
> + perror("freopen logfile failed");
> + exit(1);
> + }
> + }
> procid = i;
> doproc();
> return 0;
Looks good to me.
Reviewed-By: Phil White <pwhite at sgi.com>
Tested-By: Phil White <pwhite at sgi.com>
More information about the xfs
mailing list