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
;
71 perc
= strtol(av
[1], NULL
, 0);
72 if (perc
< 50 || perc
> 100) {
77 rebal
.saturation
= HAMMER_BTREE_INT_ELMS
* perc
/ 100;
79 printf("rebalance start %016jx:%04x\n",
80 (uintmax_t)rebal
.key_beg
.obj_id
,
81 rebal
.key_beg
.localization
);
83 fd
= open(filesystem
, O_RDONLY
);
85 err(1, "Unable to open %s", filesystem
);
89 if (ioctl(fd
, HAMMERIOC_REBALANCE
, &rebal
) < 0) {
90 printf("Rebalance %s failed: %s\n",
91 filesystem
, strerror(errno
));
92 } else if (rebal
.head
.flags
& HAMMER_IOC_HEAD_INTR
) {
93 printf("Rebalance %s interrupted by timer at %016jx:%04x\n",
95 (uintmax_t)rebal
.key_cur
.obj_id
,
96 rebal
.key_cur
.localization
);
98 hammer_set_cycle(&rebal
.key_cur
, 0);
101 hammer_reset_cycle();
102 printf("Rebalance %s succeeded\n", filesystem
);
106 printf("Rebalance:\n"
107 " %jd B-Tree nodes scanned\n"
108 " %jd B-Tree nodes deleted\n"
109 " %jd collision retries\n"
110 " %jd B-Tree nodes rebalanced\n",
111 (intmax_t)rebal
.stat_ncount
,
112 (intmax_t)rebal
.stat_deletions
,
113 (intmax_t)rebal
.stat_collisions
,
114 (intmax_t)rebal
.stat_nrebal
120 rebalance_usage(int exit_code
)
123 "hammer rebalance <filesystem> [saturation_percentage]\n"
124 "saturation_percentage is 50%%-100%%, default is 85%%.\n");