A pre-built node could be under populated (less than half-full) due to
following reasons:
- A single shared leaf generated by dm-thin key removal. The residency
could drop below 50%, until it reaches the merge threshold (33% or 44%,
depends on its context).
- A shared root, which could have any possible nr_entries.
- Underfull shared nodes (less than 33% residency) caused by kernel issues.
To avoid producing under populated nodes, those kinds of pre-built nodes,
except the roots, will be merged into their siblings.
The ref counts now are handled in a straightforward method:
The pre-built subtrees serve as snapshots of potentially shared nodes.
They hold an initial ref count on the pre-built nodes and their children.
The temporary ref counts are later dropped at the end of device building.
This way fixes the ref counts of unshifted nodes, thus the 'reserve'
operation introduced by commit 6d16c58 is reverted.
- Do not use shared internals as Defs
- Build Defs with common leaf sequences only, that could forms
more common Defs between partially shared subtrees.
To deal with variety in target attributes and their expected outputs,
the test parameters are categorized into traits, thus the test program
could define test parameters in a more structured way, without having
to pass multiple tightly-coupled parameters to test functions.
- Make the naming of test cases less ambiguous, e.g., rename
"missing_input_file" to "missing_input_arg" or "input_file_not_found"
- Unify the error messages on input/output options
- Update fixedbitset to 0.4
- Update indicatif to 0.16
- Update libc to 0.2.*
- Update nix to 0.21
- Update nom to 6.2.*
- Update dependencies with cargo-update
- Update crc32c to 0.6, which allows it to be built on AArch64.
- Update base64 to 0.13
- Update byteorder to 0.14
- Update io-uring to 0.4
- Update libc to 0.2.83
- Update nix to 0.19
- Update nom to 6.0.1
- Update quick-xml to 0.20
- Update rand to 0.8
- Update tempfile to 3.2
- Update tui to 0.14
Signed-off-by: Kay Lin <i@v2bv.net>
Multithreaded sync-io has performance similar to async-io. Also,
sync-io saves the hassle of setting ulimits to get io_uring working
on some systems (commit ba7fd7b). Now we default to sync-io, and
leave async-io as a hidden option for testing and benchmarking.
This was previously needed for thin-provisioning/thin_metadata_pack.cc
but that file was rewritten in Rust and no longer needs Boost. The flag
causes every binary to have a completely redundant depedency on
libboost_iostream.so, which is an issue for RHEL packaging.
The blocks storing metadata itself are located continuously within
a certain reserved range, hence there's no need to use a block set
as the representation.