.migrate_cmd = "dsmmigrate",
};
-enum offline_op {OP_LOADFILE, OP_SAVEFILE, OP_SETOFFLINE, OP_GETOFFLINE, OP_ENDOFLIST};
+static pid_t parent_pid;
+
+enum offline_op {OP_LOADFILE, OP_SAVEFILE, OP_MIGRATE, OP_GETOFFLINE, OP_ENDOFLIST};
struct child {
unsigned offline_count;
unsigned online_count;
unsigned migrate_fail_count;
+ unsigned io_fail_count;
unsigned migrate_ok_count;
unsigned count;
unsigned lastcount;
#endif
if (pread(fd, buf, options.fsize, 0) != options.fsize) {
- printf("\npread of '%s' failed - %s\n", fname, strerror(errno));
+ if (child->io_fail_count == 0) {
+ printf("pread failed on '%s' - %s\n", fname, strerror(errno));
+ }
+ child->io_fail_count++;
close(fd);
return;
}
memset(buf, fnumber%256, options.fsize);
if (pwrite(fd, buf, options.fsize, 0) != options.fsize) {
- printf("\npwrite of '%s' failed - %s\n", fname, strerror(errno));
+ if (child->io_fail_count == 0) {
+ printf("pwrite failed on '%s' - %s\n", fname, strerror(errno));
+ }
+ child->io_fail_count++;
close(fd);
return;
}
/*
set a file offline
*/
-static void child_setoffline(struct child *child, const char *fname)
+static void child_migrate(struct child *child, const char *fname)
{
char *cmd = NULL;
int ret;
unsigned fnumber = random() % options.nfiles;
char *fname = filename(fnumber);
+ if (kill(parent_pid, 0) != 0) {
+ /* parent has exited */
+ exit(0);
+ }
+
child->tv_start = timeval_current();
child->op = random() % OP_ENDOFLIST;
case OP_SAVEFILE:
child_savefile(child, fname, fnumber);
break;
- case OP_SETOFFLINE:
- child_setoffline(child, fname);
+ case OP_MIGRATE:
+ child_migrate(child, fname);
break;
case OP_GETOFFLINE:
child_getoffline(child, fname);
{
int i, op;
unsigned total=0, total_offline=0, total_online=0,
- total_migrate_failures=0, total_migrate_ok=0;
+ total_migrate_failures=0, total_migrate_ok=0,
+ total_io_failures=0;
double latencies[OP_ENDOFLIST];
if (timeval_elapsed(&tv_start) >= options.timelimit) {
total_online += children[i].online_count;
total_offline += children[i].offline_count;
total_migrate_failures += children[i].migrate_fail_count;
+ total_io_failures += children[i].io_fail_count;
total_migrate_ok += children[i].migrate_ok_count;
for (op=0;op<OP_ENDOFLIST;op++) {
if (children[i].latencies[op] > latencies[op]) {
}
}
- printf("ops/s=%4u offline=%5u online=%4u migfail=%4u migok=%4u set_lat=%.1f get_lat=%.1f save_lat=%.1f load_lat=%.1f\r",
+ printf("ops/s=%4u offline=%5u online=%4u migfail=%4u migok=%4u iofail=%u mig_lat=%.1f stat_lat=%.1f save_lat=%.1f load_lat=%.1f\r",
total, total_offline, total_online,
total_migrate_failures,
total_migrate_ok,
- latencies[OP_SETOFFLINE],
+ total_io_failures,
+ latencies[OP_MIGRATE],
latencies[OP_GETOFFLINE],
latencies[OP_SAVEFILE],
latencies[OP_LOADFILE]);
free(fname);
}
+ parent_pid = getpid();
+
printf("Starting %u child processes for %u seconds\n",
options.nprocesses, options.timelimit);