2 * Copyright (c) 2009 The DragonFly Project. All rights reserved.
4 * This code is derived from software contributed to The DragonFly Project
5 * by Matthew Dillon <dillon@backplane.com>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
17 * 3. Neither the name of The DragonFly Project nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific, prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 static void rebalance_usage(int exit_code
);
40 * rebalance <filesystem> [saturation_percentage] (default 85%)
43 hammer_cmd_rebalance(char **av
, int ac
)
45 struct hammer_ioc_rebalance rebal
;
46 const char *filesystem
;
53 bzero(&rebal
, sizeof(rebal
));
55 rebal
.key_beg
.localization
= HAMMER_MIN_LOCALIZATION
;
56 rebal
.key_beg
.obj_id
= HAMMER_MIN_OBJID
;
57 hammer_get_cycle(&rebal
.key_beg
, NULL
);
59 rebal
.key_end
.localization
= HAMMER_MAX_LOCALIZATION
;
60 rebal
.key_end
.obj_id
= HAMMER_MAX_OBJID
;
61 rebal
.allpfs
= AllPFS
;
69 perc
= strtol(av
[1], NULL
, 0);
70 if (perc
< 50 || perc
> 100)
73 rebal
.saturation
= HAMMER_BTREE_INT_ELMS
* perc
/ 100;
75 printf("rebalance start %016jx:%04x\n",
76 (uintmax_t)rebal
.key_beg
.obj_id
,
77 rebal
.key_beg
.localization
);
79 fd
= open(filesystem
, O_RDONLY
);
81 err(1, "Unable to open %s", filesystem
);
83 if (ioctl(fd
, HAMMERIOC_REBALANCE
, &rebal
) < 0) {
84 printf("Rebalance %s failed: %s\n",
85 filesystem
, strerror(errno
));
86 } else if (rebal
.head
.flags
& HAMMER_IOC_HEAD_INTR
) {
87 printf("Rebalance %s interrupted by timer at %016jx:%04x\n",
89 (uintmax_t)rebal
.key_cur
.obj_id
,
90 rebal
.key_cur
.localization
);
92 hammer_set_cycle(&rebal
.key_cur
, 0);
97 printf("Rebalance %s succeeded\n", filesystem
);
101 printf("Rebalance:\n"
102 " %jd B-Tree nodes scanned\n"
103 " %jd B-Tree nodes deleted\n"
104 " %jd collision retries\n"
105 " %jd B-Tree nodes rebalanced\n",
106 (intmax_t)rebal
.stat_ncount
,
107 (intmax_t)rebal
.stat_deletions
,
108 (intmax_t)rebal
.stat_collisions
,
109 (intmax_t)rebal
.stat_nrebal
115 rebalance_usage(int exit_code
)
118 "hammer rebalance <filesystem> [saturation_percentage]\n"
119 "saturation_percentage is 50%%-100%%, default is 85%%.\n");