diff --git a/HISTORY b/HISTORY index 1ef436a1..0881352c 100644 --- a/HISTORY +++ b/HISTORY @@ -23,6 +23,8 @@ SnapRAID HISTORY old state. * The -e, --filter-error option is more efficient and triggers a lot less data to be read. + * In the "status" command the "Wasted" column now shows a negative + number for the amount of space that you can still waste. * Renames the -s and -t options to -S and -B as they are intended to be manual only operations. diff --git a/cmdline/status.c b/cmdline/status.c index 8d280ef7..803f329e 100644 --- a/cmdline/status.c +++ b/cmdline/status.c @@ -68,7 +68,7 @@ int state_status(struct snapraid_state* state) uint64_t file_size; uint64_t file_block_count; uint64_t file_block_free; - uint64_t base = 1024 * 1024 * (uint64_t)1024; + uint64_t base = 1024 * 1024 * 1024ULL; block_off_t parity_block_free; unsigned unsynced_blocks; uint64_t all_wasted; @@ -123,7 +123,7 @@ int state_status(struct snapraid_state* state) block_off_t disk_block_max_by_space; block_off_t disk_block_max_by_parity; block_off_t disk_block_max; - uint64_t wasted; + int64_t wasted; /* for each file in the disk */ node = disk->filelist; @@ -178,27 +178,34 @@ int state_status(struct snapraid_state* state) disk_block_max_by_space = disk_block_count + disk->free_blocks; disk_block_max_by_parity = blockmax + parity_block_free; - /* the maximum usable space in a disk is limited by the smaller */ - /* between the disk size and the parity size */ + /* the maximum usable space in a disk is limited by the smallest */ + /* of the disk size and the parity size */ /* the wasted space is the space that we have to leave */ /* free on the data disk, when the parity is filled up */ if (disk_block_max_by_space < disk_block_max_by_parity) { disk_block_max = disk_block_max_by_space; - /* no wasted space, as we have enough parity */ - wasted = 0; } else { disk_block_max = disk_block_max_by_parity; - /* wasted space is the difference of the two maximum size */ - wasted = (disk_block_max_by_space - disk_block_max_by_parity) * (uint64_t)state->block_size; } + /* wasted space is the difference of the two maximum size */ + /* if negative, it's extra space available in parity */ + wasted = (int64_t)disk_block_max_by_space - (int64_t)disk_block_max_by_parity; + wasted *= state->block_size; + all_wasted += wasted; file_block_free += disk_block_max - disk_block_count; printf("%8u", disk_file_count); printf("%8u", disk_file_fragmented); printf("%8u", disk_extra_fragment); - printf("%6" PRIu64 ".%01" PRIu64, wasted / base, (wasted * 10 / base) % 10); + if (wasted < -100LL * 1024 * 1024 * 1024) { + printf(" -"); + } else if (wasted < 0) { + printf("%6" PRId64 ".%01" PRIu64, wasted / (int64_t)base, (-wasted * 10 / base) % 10); + } else { + printf("%6" PRIu64 ".%01" PRIu64, wasted / base, (wasted * 10 / base) % 10); + } printf("%8" PRIu64, disk_file_size / base); printf("%8" PRIu64, (disk_block_max - disk_block_count) * (uint64_t)state->block_size / base); printf(" %3u%%", perc(disk_block_count, disk_block_max)); @@ -215,6 +222,7 @@ int state_status(struct snapraid_state* state) ftag("summary:disk_block_max_by_space:%s:%u\n", disk->name, disk_block_max_by_space); ftag("summary:disk_block_max_by_parity:%s:%u\n", disk->name, disk_block_max_by_parity); ftag("summary:disk_block_max:%s:%u\n", disk->name, disk_block_max); + ftag("summary:disk_space_wasted:%s:%" PRId64 "\n", disk->name, wasted); } /* totals */ diff --git a/snapraid.1 b/snapraid.1 index 8f661161..3981d5c4 100644 --- a/snapraid.1 +++ b/snapraid.1 @@ -645,8 +645,8 @@ It includes information about the parity fragmentation, how old are the blocks without checking, and all the recorded silent errors encountered while scrubbing. .PP -Note that the information presented refers at the latest time you run \[dq]sync\[dq]. -Later modifications are not taken into account. +Note that the information presented refers at the latest time you +run \[dq]sync\[dq]. Later modifications are not taken into account. .PP Nothing is modified. .SS smart @@ -1179,7 +1179,7 @@ In details, for each file, even of few bytes, a whole block of parity is always allocated, and with many files this may result in a lot of unused parity space. And when you completely fill the parity disk, you are not allowed to add more files in the data disks. -But note that wasted parity doesn\'t sum between data disk. Wasted space +Note that wasted parity doesn\'t sum between data disk. Wasted space resulting from a high number of files in a data disk, limits only the amount of data in such data disk and not in others. .PP @@ -1191,6 +1191,8 @@ in 12 GiB less space available in the data disk. You can get the amount of wasted space in each disk using \[dq]status\[dq]. This is the amount of space that you must leave free in the data disks, or use for files not included in the array. +If this value is negative, it means that your are near to fill +the parity, and it represent the space you can still waste. .PP To avoid to problem, you can use a bigger partition for parity. For example, if you have the parity partition bigger than 12 GiB diff --git a/snapraid.d b/snapraid.d index 4deeab51..a3b11bb6 100644 --- a/snapraid.d +++ b/snapraid.d @@ -371,8 +371,8 @@ Commands are the blocks without checking, and all the recorded silent errors encountered while scrubbing. - Note that the information presented refers at the latest time you run "sync". - Later modifications are not taken into account. + Note that the information presented refers at the latest time you + run "sync". Later modifications are not taken into account. Nothing is modified. @@ -920,7 +920,7 @@ Configuration always allocated, and with many files this may result in a lot of unused parity space. And when you completely fill the parity disk, you are not allowed to add more files in the data disks. - But note that wasted parity doesn't sum between data disk. Wasted space + Note that wasted parity doesn't sum between data disk. Wasted space resulting from a high number of files in a data disk, limits only the amount of data in such data disk and not in others. @@ -932,6 +932,8 @@ Configuration You can get the amount of wasted space in each disk using "status". This is the amount of space that you must leave free in the data disks, or use for files not included in the array. + If this value is negative, it means that your are near to fill + the parity, and it represent the space you can still waste. To avoid to problem, you can use a bigger partition for parity. For example, if you have the parity partition bigger than 12 GiB diff --git a/snapraid.txt b/snapraid.txt index 3c344e17..8090eb1c 100644 --- a/snapraid.txt +++ b/snapraid.txt @@ -397,8 +397,8 @@ It includes information about the parity fragmentation, how old are the blocks without checking, and all the recorded silent errors encountered while scrubbing. -Note that the information presented refers at the latest time you run "sync". -Later modifications are not taken into account. +Note that the information presented refers at the latest time you +run "sync". Later modifications are not taken into account. Nothing is modified. @@ -996,7 +996,7 @@ In details, for each file, even of few bytes, a whole block of parity is always allocated, and with many files this may result in a lot of unused parity space. And when you completely fill the parity disk, you are not allowed to add more files in the data disks. -But note that wasted parity doesn't sum between data disk. Wasted space +Note that wasted parity doesn't sum between data disk. Wasted space resulting from a high number of files in a data disk, limits only the amount of data in such data disk and not in others. @@ -1008,6 +1008,8 @@ in 12 GiB less space available in the data disk. You can get the amount of wasted space in each disk using "status". This is the amount of space that you must leave free in the data disks, or use for files not included in the array. +If this value is negative, it means that your are near to fill +the parity, and it represent the space you can still waste. To avoid to problem, you can use a bigger partition for parity. For example, if you have the parity partition bigger than 12 GiB