From bd70ec7d7ad091a1b1b676c7cbed56fac355a2fd Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Sun, 29 Nov 2020 13:19:58 +0100 Subject: [PATCH] Cleanup scanner --- src/dwarfs/scanner.cpp | 83 ++++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 35 deletions(-) diff --git a/src/dwarfs/scanner.cpp b/src/dwarfs/scanner.cpp index ec52c3f4..c6583b92 100644 --- a/src/dwarfs/scanner.cpp +++ b/src/dwarfs/scanner.cpp @@ -243,6 +243,9 @@ class scanner_ : public scanner::impl { void scan(filesystem_writer& fsw, const std::string& path, progress& prog); private: + std::shared_ptr scan_tree(const std::string& path, progress& prog); + void order_files(inode_manager& im); + const block_manager::config& cfg_; const scanner_options& options_; std::shared_ptr entry_; @@ -270,12 +273,8 @@ scanner_::scanner_(logger& lgr, worker_group& wg, , log_(lgr) {} template -void scanner_::scan(filesystem_writer& fsw, - const std::string& path, progress& prog) { - log_.info() << "scanning " << path; - - prog.set_status_function(status_string); - +std::shared_ptr +scanner_::scan_tree(const std::string& path, progress& prog) { auto root = entry_->create(*os_, path); if (root->type() != entry::E_DIR) { @@ -367,6 +366,48 @@ void scanner_::scan(filesystem_writer& fsw, } } + return root; +} + +template +void scanner_::order_files(inode_manager& im) { + switch (options_.file_order) { + case file_order_mode::NONE: + log_.info() << "keeping inode order"; + break; + + case file_order_mode::PATH: { + log_.info() << "ordering " << im.count() << " inodes by path name..."; + auto ti = log_.timed_info(); + im.order_inodes(); + ti << im.count() << " inodes ordered"; + break; + } + + case file_order_mode::SCRIPT: + log_.info() << "ordering " << im.count() << " inodes using script..."; + im.order_inodes(script_); + break; + + case file_order_mode::SIMILARITY: { + log_.info() << "ordering " << im.count() << " inodes by similarity..."; + auto ti = log_.timed_info(); + im.order_inodes_by_similarity(); + ti << im.count() << " inodes ordered"; + break; + } + } +} + +template +void scanner_::scan(filesystem_writer& fsw, + const std::string& path, progress& prog) { + log_.info() << "scanning " << path; + + prog.set_status_function(status_string); + + auto root = scan_tree(path, prog); + // now scan all files scan_files_visitor sfv(wg_, *os_, prog); root->accept(sfv); @@ -374,9 +415,6 @@ void scanner_::scan(filesystem_writer& fsw, log_.info() << "waiting for background scanners..."; wg_.wait(); - std::unordered_map, folly::Hash> - file_hash; - log_.info() << "assigning directory and link inodes..."; uint32_t first_link_inode = 0; @@ -401,32 +439,7 @@ void scanner_::scan(filesystem_writer& fsw, << prog.duplicate_files << "/" << prog.files_found << " duplicate files"; - switch (options_.file_order) { - case file_order_mode::NONE: - log_.info() << "keeping inode order"; - break; - - case file_order_mode::PATH: { - log_.info() << "ordering " << im->count() << " inodes by path name..."; - auto ti = log_.timed_info(); - im->order_inodes(); - ti << im->count() << " inodes ordered"; - break; - } - - case file_order_mode::SCRIPT: - log_.info() << "ordering " << im->count() << " inodes using script..."; - im->order_inodes(script_); - break; - - case file_order_mode::SIMILARITY: { - log_.info() << "ordering " << im->count() << " inodes by similarity..."; - auto ti = log_.timed_info(); - im->order_inodes_by_similarity(); - ti << im->count() << " inodes ordered"; - break; - } - } + order_files(*im); log_.info() << "assigning file inodes..."; im->number_inodes(first_file_inode);