metadata_v2: more cleaning up

This commit is contained in:
Marcus Holland-Moritz 2020-11-28 17:55:20 +01:00
parent fdcccb3095
commit 3d833dc9ef
2 changed files with 53 additions and 65 deletions

View File

@ -130,7 +130,7 @@ class dir : public entry {
using entry_ptr = std::shared_ptr<entry>; using entry_ptr = std::shared_ptr<entry>;
std::vector<std::shared_ptr<entry>> entries_; std::vector<std::shared_ptr<entry>> entries_;
uint32_t inode_ = 0; uint32_t inode_{0};
}; };
class link : public entry { class link : public entry {

View File

@ -46,42 +46,6 @@
namespace dwarfs { namespace dwarfs {
template <typename LoggerPolicy>
class scanner_ : public scanner::impl {
public:
scanner_(logger& lgr, worker_group& wg, const block_manager::config& config,
std::shared_ptr<entry_factory> ef, std::shared_ptr<os_access> os,
std::shared_ptr<script> scr, const scanner_options& options);
void scan(filesystem_writer& fsw, const std::string& path, progress& prog);
private:
const block_manager::config& cfg_;
const scanner_options& options_;
std::shared_ptr<entry_factory> entry_;
std::shared_ptr<os_access> os_;
std::shared_ptr<script> script_;
worker_group& wg_;
logger& lgr_;
log_proxy<LoggerPolicy> log_;
};
template <typename LoggerPolicy>
scanner_<LoggerPolicy>::scanner_(logger& lgr, worker_group& wg,
const block_manager::config& cfg,
std::shared_ptr<entry_factory> ef,
std::shared_ptr<os_access> os,
std::shared_ptr<script> scr,
const scanner_options& options)
: cfg_(cfg)
, options_(options)
, entry_(std::move(ef))
, os_(std::move(os))
, script_(std::move(scr))
, wg_(wg)
, lgr_(lgr)
, log_(lgr) {}
class visitor_base : public entry_visitor { class visitor_base : public entry_visitor {
public: public:
void visit(file*) override {} void visit(file*) override {}
@ -196,28 +160,62 @@ class names_and_links_visitor : public entry_visitor {
class save_directories_visitor : public visitor_base { class save_directories_visitor : public visitor_base {
public: public:
save_directories_visitor(thrift::metadata::metadata& mv2, save_directories_visitor(size_t num_directories) {
global_entry_data const& ge_data, directories_.resize(num_directories);
std::vector<uint32_t>& dir_index) }
: mv2_(mv2)
, ge_data_(ge_data)
, dir_index_(dir_index) {}
void visit(dir* p) override { void visit(dir* p) override { directories_[p->inode_num()] = p; }
dir_index_.at(p->inode_num()) = mv2_.directories.size();
p->pack(mv2_, ge_data_);
if (!p->has_parent()) { void pack(thrift::metadata::metadata& mv2, global_entry_data& ge_data) {
p->pack_entry(mv2_, ge_data_); for (auto p : directories_) {
p->pack(mv2, ge_data);
if (!p->has_parent()) {
p->pack_entry(mv2, ge_data);
}
} }
} }
private: private:
thrift::metadata::metadata& mv2_; std::vector<dir*> directories_;
global_entry_data const& ge_data_;
std::vector<uint32_t>& dir_index_;
}; };
template <typename LoggerPolicy>
class scanner_ : public scanner::impl {
public:
scanner_(logger& lgr, worker_group& wg, const block_manager::config& config,
std::shared_ptr<entry_factory> ef, std::shared_ptr<os_access> os,
std::shared_ptr<script> scr, const scanner_options& options);
void scan(filesystem_writer& fsw, const std::string& path, progress& prog);
private:
const block_manager::config& cfg_;
const scanner_options& options_;
std::shared_ptr<entry_factory> entry_;
std::shared_ptr<os_access> os_;
std::shared_ptr<script> script_;
worker_group& wg_;
logger& lgr_;
log_proxy<LoggerPolicy> log_;
};
template <typename LoggerPolicy>
scanner_<LoggerPolicy>::scanner_(logger& lgr, worker_group& wg,
const block_manager::config& cfg,
std::shared_ptr<entry_factory> ef,
std::shared_ptr<os_access> os,
std::shared_ptr<script> scr,
const scanner_options& options)
: cfg_(cfg)
, options_(options)
, entry_(std::move(ef))
, os_(std::move(os))
, script_(std::move(scr))
, wg_(wg)
, lgr_(lgr)
, log_(lgr) {}
template <typename LoggerPolicy> template <typename LoggerPolicy>
void scanner_<LoggerPolicy>::scan(filesystem_writer& fsw, void scanner_<LoggerPolicy>::scan(filesystem_writer& fsw,
const std::string& path, progress& prog) { const std::string& path, progress& prog) {
@ -384,18 +382,16 @@ void scanner_<LoggerPolicy>::scan(filesystem_writer& fsw,
options_.no_time); // TODO: just pass options directly options_.no_time); // TODO: just pass options directly
thrift::metadata::metadata mv2; thrift::metadata::metadata mv2;
std::vector<uint32_t> dir_index;
dir_index.resize(first_link_inode);
mv2.link_index.resize(first_file_inode - first_link_inode); mv2.link_index.resize(first_file_inode - first_link_inode);
wg_.add_job([&] { wg_.add_job([&] {
log_.info() << "saving links..."; log_.info() << "saving names and links...";
names_and_links_visitor nlv(ge_data); names_and_links_visitor nlv(ge_data);
root->accept(nlv); root->accept(nlv);
ge_data.index(); ge_data.index();
log_.info() << "updating name offsets..."; log_.info() << "updating name and link indices...";
root->walk([&](entry* ep) { root->walk([&](entry* ep) {
ep->update(ge_data); ep->update(ge_data);
if (auto lp = dynamic_cast<link*>(ep)) { if (auto lp = dynamic_cast<link*>(ep)) {
@ -455,17 +451,9 @@ void scanner_<LoggerPolicy>::scan(filesystem_writer& fsw,
log_.info() << "saving directories..."; log_.info() << "saving directories...";
mv2.entry_index.resize(first_file_inode + im->count()); mv2.entry_index.resize(first_file_inode + im->count());
save_directories_visitor sdv(mv2, ge_data, dir_index); save_directories_visitor sdv(first_link_inode);
root->accept(sdv); root->accept(sdv);
sdv.pack(mv2, ge_data);
{
// order directories by inode number
std::vector<thrift::metadata::directory> tmp = std::move(mv2.directories);
mv2.directories.reserve(tmp.size());
for (auto i : dir_index) {
mv2.directories.push_back(std::move(tmp[i]));
}
}
mv2.uids = ge_data.get_uids(); mv2.uids = ge_data.get_uids();
mv2.gids = ge_data.get_gids(); mv2.gids = ge_data.get_gids();