.o_scan_threads = DEF_SCAN_THREADS,
.o_slot_size = DEF_SLOT_SIZE,
.o_scan_rate = DEF_SCAN_RATE,
+ .o_max_used = -1,
+ .o_min_used = -1,
};
enum llapi_message_level lx_log_level = LLAPI_MSG_INFO;
printf("Usage: %s [options]\n"
"\t-b, --debug, enable debugging output\n"
"\t-D, --device, OST device\n"
- "\t-h, --freehi, high watermark, %% of space (default: %u)\n"
+ /* -h, --freehi, high watermark, %% of space (default: %u) */
"\t--help, print this help message\n"
"\t-i, --interval, seconds to next check (default: %u)\n"
"\t-j, --max_jobs, max.jobs to release replicas (default: %u)\n"
- "\t-l, --freelo, low watermark, %% of space (default: %u)\n"
+ "\t--min-used=MIN, start slow purge when %% space used reaches MIN (default %u)\n"
+ "\t--max-used=MAX, start fast purge when %% space used reaches MAX (default %u)\n"
+ "\t--used=USED, equivalent to --min-used=USED --max-used=(USED + 5)\n"
+ /* -l, --freelo, low watermark, %% of space (default: %u) */
"\t-m, --mds, MDS idx:host:mountpoint (can specify multiple)\n"
"\t-M, --mount, local Lustre client's mountpoint\n"
"\t-p, --pool, pool to remove replicas from (default: %s)\n"
"\t--version, print version information and exit\n",
program_invocation_short_name,
DEF_INTERVAL,
- 100 - DEF_MIN_USED,
DEF_MAX_JOBS,
- 100 - DEF_MAX_USED,
+ DEF_MIN_USED,
+ DEF_MAX_USED,
DEF_POOL,
DEF_SCAN_RATE,
DEF_SLOT_SIZE,
printf(" config example:\n"
"\tdevice=lustre-OST0000\n"
"\tmount=/mnt/lustre\n"
- "\tfreelo=20\n"
- "\tfreehi=30\n"
+ "\tmax-used=80\n"
+ "\tmin-used=70\n"
"\tmax_jobs=8\n"
"\tpool=<pool>\n"
"\tmds=0:mds1host:/mnt/lustre\n"
LX_FATAL("cannot open '%s/.lustre/fid': %s\n", name, strerror(errno));
}
-#define LPURGE_INTERNAL_DUMP_FIDS 1
-#define LPURGE_OPT_VERSION 2
-#define LPURGE_OPT_LOG_TIMESTAMPS 3
+enum {
+ LPURGE_INTERNAL_DUMP_FIDS = 1,
+ LPURGE_OPT_LOG_TIMESTAMPS,
+ LPURGE_OPT_MAX_USED,
+ LPURGE_OPT_MIN_USED,
+ LPURGE_OPT_USED,
+ LPURGE_OPT_VERSION,
+};
static struct option options[] = {
{ "device", required_argument, NULL, 'D'},
{ "freelo", required_argument, NULL, 'l'},
{ "help", no_argument, NULL, 'H' },
{ "interval", required_argument, NULL, 'i'},
+ { "max-used", required_argument, NULL, LPURGE_OPT_MAX_USED },
{ "max_jobs", required_argument, NULL, 'j'},
+ { "min-used", required_argument, NULL, LPURGE_OPT_MIN_USED },
{ "mds", required_argument, NULL, 'm'},
{ "mount", required_argument, NULL, 'M'},
{ "pool", required_argument, NULL, 'p'},
{ "scan_threads", required_argument, NULL, 't'},
{ "slot_size", required_argument, NULL, 'S'},
{ "timestamps", no_argument, NULL, LPURGE_OPT_LOG_TIMESTAMPS},
+ { "used", required_argument, NULL, LPURGE_OPT_USED },
{ "version", no_argument, NULL, LPURGE_OPT_VERSION},
{ NULL }
};
case LPURGE_INTERNAL_DUMP_FIDS:
opt.o_fids_dumpfile = xstrdup(optarg);
break;
+ case LPURGE_OPT_MAX_USED:
+ value = strtol(optarg, &endptr, 10);
+ if (*endptr != '\0' || !(1 <= value && value <= 100))
+ LX_FATAL("invalid argument ('%s') to --max-used\n", optarg);
+
+ opt.o_max_used = value;
+ break;
+ case LPURGE_OPT_MIN_USED:
+ value = strtol(optarg, &endptr, 10);
+ if (*endptr != '\0' || !(0 <= value && value <= 99))
+ LX_FATAL("invalid argument ('%s') to --min-used\n", optarg);
+
+ opt.o_min_used = value;
+ break;
+ case LPURGE_OPT_USED:
+ value = strtol(optarg, &endptr, 10);
+ if (*endptr != '\0' || !(0 <= value && value <= 95))
+ LX_FATAL("invalid argument ('%s') to --used\n", optarg);
+
+ opt.o_min_used = value;
+ opt.o_max_used = value + 5;
+ break;
case LPURGE_OPT_VERSION:
lipe_version();
exit(0);
load_config(optarg);
break;
case 'h':
+ LX_WARN("options '-h' and '--freehi' are deprecated, please use '--min-used' or '--used' instead\n");
value = strtol(optarg, &endptr, 10);
if (*endptr != '\0' || value < 0)
LX_FATAL("invalid high watermark: '%s'\n", optarg);
opt.o_max_jobs = value;
break;
case 'l':
+ LX_WARN("options '-l' and '--freelo' are deprecated, please use '--max-used' or '--used' instead\n");
value = strtol(optarg, &endptr, 10);
if (*endptr != '\0' || value < 0)
LX_FATAL("invalid low watermark: '%s'\n", optarg);
opt.o_pool = DEF_POOL;
LX_INFO("source pool isn't defined, use '%s'\n", opt.o_pool);
}
- if (opt.o_max_used == 0) {
+
+ if (opt.o_max_used == -1) {
opt.o_max_used = DEF_MAX_USED;
LX_INFO("max_used is not defined, using %u\n", opt.o_max_used);
}
- if (opt.o_max_used < 1 || opt.o_max_used > 99)
+
+ if (!(0 <= opt.o_max_used && opt.o_max_used <= 100))
LX_FATAL("invalid max_used value %u\n", opt.o_max_used);
- if (opt.o_min_used == 0) {
+ if (opt.o_min_used == -1) {
opt.o_min_used = DEF_MIN_USED;
- LX_INFO("min_used is not defined, useing %u\n", opt.o_min_used);
+ LX_INFO("min_used is not defined, using %u\n", opt.o_min_used);
}
- if (opt.o_min_used < 1 || opt.o_min_used > 99)
+
+ if (!(0 <= opt.o_min_used && opt.o_min_used <= 100))
LX_FATAL("invalid min_used value %u\n", opt.o_min_used);
+ if (!(opt.o_min_used < opt.o_max_used))
+ LX_FATAL("min_used (%u) must be less than max_used (%u)\n", opt.o_min_used, opt.o_max_used);
+
if (!ostprefix)
LX_FATAL("OST device is not defined\n");