fsx: add support for recording operations to a file

Usually, fsx dumps an .fsxops file on failure with same basename
as work file and possibly under dirctory specified by -P dirpath.

The --record-ops[=opsfile] flag can be use to dump ops file also
on success and to optionally specify the ops file name.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Reviewed-by: Eryu Guan <eguan@redhat.com>
Signed-off-by: Eryu Guan <eguan@redhat.com>
This commit is contained in:
Amir Goldstein
2017-09-07 10:26:36 +03:00
committed by Eryu Guan
parent bd918dff01
commit 3f742550df
+15 -2
View File
@@ -180,6 +180,7 @@ int aio_rw(int rw, int fd, char *buf, unsigned len, unsigned offset);
#endif #endif
const char *replayops = NULL; const char *replayops = NULL;
const char *recordops = NULL;
FILE * fsxlogf = NULL; FILE * fsxlogf = NULL;
FILE * replayopsf = NULL; FILE * replayopsf = NULL;
char opsfile[1024]; char opsfile[1024];
@@ -1676,6 +1677,8 @@ usage(void)
-W: mapped write operations DISabled\n\ -W: mapped write operations DISabled\n\
-R: read() system calls only (mapped reads disabled)\n\ -R: read() system calls only (mapped reads disabled)\n\
-Z: O_DIRECT (use -R, -W, -r and -w too)\n\ -Z: O_DIRECT (use -R, -W, -r and -w too)\n\
--replay-ops opsfile: replay ops from recorded .fsxops file\n\
--record-ops[=opsfile]: dump ops file also on success. optionally specify ops file name\n\
fname: this filename is REQUIRED (no default)\n"); fname: this filename is REQUIRED (no default)\n");
exit(90); exit(90);
} }
@@ -1844,6 +1847,7 @@ __test_fallocate(int mode, const char *mode_str)
static struct option longopts[] = { static struct option longopts[] = {
{"replay-ops", required_argument, 0, 256}, {"replay-ops", required_argument, 0, 256},
{"record-ops", optional_argument, 0, 255},
{ } { }
}; };
@@ -2034,6 +2038,11 @@ main(int argc, char **argv)
case 'Z': case 'Z':
o_direct = O_DIRECT; o_direct = O_DIRECT;
break; break;
case 255: /* --record-ops */
if (optarg)
strncpy(opsfile, optarg, sizeof(opsfile));
recordops = opsfile;
break;
case 256: /* --replay-ops */ case 256: /* --replay-ops */
replayops = optarg; replayops = optarg;
break; break;
@@ -2113,8 +2122,10 @@ main(int argc, char **argv)
prterr(logfile); prterr(logfile);
exit(93); exit(93);
} }
strncat(opsfile, dirpath ? bname : fname, 256); if (!*opsfile) {
strcat(opsfile, ".fsxops"); strncat(opsfile, dirpath ? bname : fname, 256);
strcat(opsfile, ".fsxops");
}
unlink(opsfile); unlink(opsfile);
if (replayops) { if (replayops) {
@@ -2195,6 +2206,8 @@ main(int argc, char **argv)
report_failure(99); report_failure(99);
} }
prt("All %lu operations completed A-OK!\n", testcalls); prt("All %lu operations completed A-OK!\n", testcalls);
if (recordops)
logdump();
exit(0); exit(0);
return 0; return 0;