mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +03:00
Add DDT prune command
Requires the new 'flat' physical data which has the start time for a class entry. The amount to prune can be based on a target percentage of the unique entries or based on the age (i.e., every entry older than N days). Sponsored-by: Klara, Inc. Sponsored-by: iXsystems, Inc. Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Don Brady <don.brady@klarasystems.com> Closes #16277
This commit is contained in:
committed by
Brian Behlendorf
parent
4a4f7b019f
commit
d4d79451cb
@@ -130,6 +130,8 @@ static int zpool_do_version(int, char **);
|
||||
|
||||
static int zpool_do_wait(int, char **);
|
||||
|
||||
static int zpool_do_ddt_prune(int, char **);
|
||||
|
||||
static int zpool_do_help(int argc, char **argv);
|
||||
|
||||
static zpool_compat_status_t zpool_do_load_compat(
|
||||
@@ -170,6 +172,7 @@ typedef enum {
|
||||
HELP_CLEAR,
|
||||
HELP_CREATE,
|
||||
HELP_CHECKPOINT,
|
||||
HELP_DDT_PRUNE,
|
||||
HELP_DESTROY,
|
||||
HELP_DETACH,
|
||||
HELP_EXPORT,
|
||||
@@ -426,6 +429,8 @@ static zpool_command_t command_table[] = {
|
||||
{ "sync", zpool_do_sync, HELP_SYNC },
|
||||
{ NULL },
|
||||
{ "wait", zpool_do_wait, HELP_WAIT },
|
||||
{ NULL },
|
||||
{ "ddtprune", zpool_do_ddt_prune, HELP_DDT_PRUNE },
|
||||
};
|
||||
|
||||
#define NCOMMAND (ARRAY_SIZE(command_table))
|
||||
@@ -545,6 +550,8 @@ get_usage(zpool_help_t idx)
|
||||
case HELP_WAIT:
|
||||
return (gettext("\twait [-Hp] [-T d|u] [-t <activity>[,...]] "
|
||||
"<pool> [interval]\n"));
|
||||
case HELP_DDT_PRUNE:
|
||||
return (gettext("\tddtprune -d|-p <amount> <pool>\n"));
|
||||
default:
|
||||
__builtin_unreachable();
|
||||
}
|
||||
@@ -13342,6 +13349,88 @@ found:;
|
||||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
* zpool ddtprune -d|-p <amount> <pool>
|
||||
*
|
||||
* -d <days> Prune entries <days> old and older
|
||||
* -p <percent> Prune <percent> amount of entries
|
||||
*
|
||||
* Prune single reference entries from DDT to satisfy the amount specified.
|
||||
*/
|
||||
int
|
||||
zpool_do_ddt_prune(int argc, char **argv)
|
||||
{
|
||||
zpool_ddt_prune_unit_t unit = ZPOOL_DDT_PRUNE_NONE;
|
||||
uint64_t amount = 0;
|
||||
zpool_handle_t *zhp;
|
||||
char *endptr;
|
||||
int c;
|
||||
|
||||
while ((c = getopt(argc, argv, "d:p:")) != -1) {
|
||||
switch (c) {
|
||||
case 'd':
|
||||
if (unit == ZPOOL_DDT_PRUNE_PERCENTAGE) {
|
||||
(void) fprintf(stderr, gettext("-d cannot be "
|
||||
"combined with -p option\n"));
|
||||
usage(B_FALSE);
|
||||
}
|
||||
errno = 0;
|
||||
amount = strtoull(optarg, &endptr, 0);
|
||||
if (errno != 0 || *endptr != '\0' || amount == 0) {
|
||||
(void) fprintf(stderr,
|
||||
gettext("invalid days value\n"));
|
||||
usage(B_FALSE);
|
||||
}
|
||||
amount *= 86400; /* convert days to seconds */
|
||||
unit = ZPOOL_DDT_PRUNE_AGE;
|
||||
break;
|
||||
case 'p':
|
||||
if (unit == ZPOOL_DDT_PRUNE_AGE) {
|
||||
(void) fprintf(stderr, gettext("-p cannot be "
|
||||
"combined with -d option\n"));
|
||||
usage(B_FALSE);
|
||||
}
|
||||
errno = 0;
|
||||
amount = strtoull(optarg, &endptr, 0);
|
||||
if (errno != 0 || *endptr != '\0' ||
|
||||
amount == 0 || amount > 100) {
|
||||
(void) fprintf(stderr,
|
||||
gettext("invalid percentage value\n"));
|
||||
usage(B_FALSE);
|
||||
}
|
||||
unit = ZPOOL_DDT_PRUNE_PERCENTAGE;
|
||||
break;
|
||||
case '?':
|
||||
(void) fprintf(stderr, gettext("invalid option '%c'\n"),
|
||||
optopt);
|
||||
usage(B_FALSE);
|
||||
}
|
||||
}
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
if (unit == ZPOOL_DDT_PRUNE_NONE) {
|
||||
(void) fprintf(stderr,
|
||||
gettext("missing amount option (-d|-p <value>)\n"));
|
||||
usage(B_FALSE);
|
||||
} else if (argc < 1) {
|
||||
(void) fprintf(stderr, gettext("missing pool argument\n"));
|
||||
usage(B_FALSE);
|
||||
} else if (argc > 1) {
|
||||
(void) fprintf(stderr, gettext("too many arguments\n"));
|
||||
usage(B_FALSE);
|
||||
}
|
||||
zhp = zpool_open(g_zfs, argv[0]);
|
||||
if (zhp == NULL)
|
||||
return (-1);
|
||||
|
||||
int error = zpool_ddt_prune(zhp, unit, amount);
|
||||
|
||||
zpool_close(zhp);
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
find_command_idx(const char *command, int *idx)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user