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 75%)
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
;
68 perc
= strtol(av
[1], NULL
, 0);
69 if (perc
< 50 || perc
> 100)
72 printf("rebalance start %016llx:%04x\n",
74 rebal
.key_beg
.localization
);
76 fd
= open(filesystem
, O_RDONLY
);
78 err(1, "Unable to open %s", filesystem
);
80 if (ioctl(fd
, HAMMERIOC_REBALANCE
, &rebal
) < 0) {
81 printf("Rebalance %s failed: %s\n",
82 filesystem
, strerror(errno
));
83 } else if (rebal
.head
.flags
& HAMMER_IOC_HEAD_INTR
) {
84 printf("Rebalance %s interrupted by timer at %016llx:%04x\n",
87 rebal
.key_cur
.localization
);
89 hammer_set_cycle(&rebal
.key_cur
, 0);
94 printf("Rebalance %s succeeded\n", filesystem
);
99 " %lld btree nodes scanned\n"
100 " %lld btree nodes deleted\n"
101 " %lld collision retries\n"
102 " %lld btree nodes rebalanced\n",
104 rebal
.stat_deletions
,
105 rebal
.stat_collisions
,
112 rebalance_usage(int exit_code
)
115 "hammer rebalance <filesystem> "
116 "[saturation-percentage 50-100]\n"
117 "By default 75%% is used.\n");