Make integrity check optional to speed up dwarfsck

This commit is contained in:
Marcus Holland-Moritz 2021-03-22 17:55:28 +01:00
parent 9f0e9340dd
commit 5c20498f62
3 changed files with 10 additions and 4 deletions

View File

@ -64,7 +64,8 @@ class filesystem_v2 {
filesystem_writer& writer, rewrite_options const& opts); filesystem_writer& writer, rewrite_options const& opts);
static int identify(logger& lgr, std::shared_ptr<mmif> mm, std::ostream& os, static int identify(logger& lgr, std::shared_ptr<mmif> mm, std::ostream& os,
int detail_level = 0, size_t num_readers = 1); int detail_level = 0, size_t num_readers = 1,
bool check_integrity = false);
void dump(std::ostream& os, int detail_level) const { void dump(std::ostream& os, int detail_level) const {
impl_->dump(os, detail_level); impl_->dump(os, detail_level);

View File

@ -475,7 +475,7 @@ void filesystem_v2::rewrite(logger& lgr, progress& prog,
int filesystem_v2::identify(logger& lgr, std::shared_ptr<mmif> mm, int filesystem_v2::identify(logger& lgr, std::shared_ptr<mmif> mm,
std::ostream& os, int detail_level, std::ostream& os, int detail_level,
size_t num_readers) { size_t num_readers, bool check_integrity) {
// TODO: // TODO:
LOG_PROXY(debug_logger_policy, lgr); LOG_PROXY(debug_logger_policy, lgr);
filesystem_parser parser(mm); filesystem_parser parser(mm);
@ -493,7 +493,7 @@ int filesystem_v2::identify(logger& lgr, std::shared_ptr<mmif> mm,
DWARFS_THROW(runtime_error, "checksum error in section: " + s.name()); DWARFS_THROW(runtime_error, "checksum error in section: " + s.name());
} }
if (!s.verify(*mm)) { if (check_integrity and !s.verify(*mm)) {
DWARFS_THROW(runtime_error, DWARFS_THROW(runtime_error,
"integrity check error in section: " + s.name()); "integrity check error in section: " + s.name());
} }

View File

@ -47,6 +47,7 @@ int dwarfsck(int argc, char** argv) {
size_t num_workers; size_t num_workers;
int detail; int detail;
bool json = false; bool json = false;
bool check_integrity = false;
// clang-format off // clang-format off
po::options_description opts("Command line options"); po::options_description opts("Command line options");
@ -60,6 +61,9 @@ int dwarfsck(int argc, char** argv) {
("num-workers,n", ("num-workers,n",
po::value<size_t>(&num_workers)->default_value(num_cpu), po::value<size_t>(&num_workers)->default_value(num_cpu),
"number of reader worker threads") "number of reader worker threads")
("check-integrity",
po::value<bool>(&check_integrity)->zero_tokens(),
"check integrity of each block")
("json", ("json",
po::value<bool>(&json)->zero_tokens(), po::value<bool>(&json)->zero_tokens(),
"print metadata in JSON format") "print metadata in JSON format")
@ -111,7 +115,8 @@ int dwarfsck(int argc, char** argv) {
filesystem_v2 fs(lgr, mm); filesystem_v2 fs(lgr, mm);
std::cout << folly::toPrettyJson(fs.metadata_as_dynamic()) << std::endl; std::cout << folly::toPrettyJson(fs.metadata_as_dynamic()) << std::endl;
} else { } else {
filesystem_v2::identify(lgr, mm, std::cout, detail, num_workers); filesystem_v2::identify(lgr, mm, std::cout, detail, num_workers,
check_integrity);
} }
} catch (system_error const& e) { } catch (system_error const& e) {
LOG_ERROR << folly::exceptionStr(e); LOG_ERROR << folly::exceptionStr(e);