Re: [2/8] xfstests: add different logging option to fsstress

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxx>
> Signed-off-by: Dmitry Monakhov <dmonakhov@xxxxxxxxxx>
> 
> ---
> 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@xxxxxxx>
Tested-By: Phil White <pwhite@xxxxxxx>

_______________________________________________
xfs mailing list
xfs@xxxxxxxxxxx
http://oss.sgi.com/mailman/listinfo/xfs


[Index of Archives]     [Linux XFS Devel]     [Linux Filesystem Development]     [Filesystem Testing]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux