[era_dump] add --logical
This commit is contained in:
parent
54f38e6702
commit
49e59ca781
@ -19,10 +19,12 @@ using namespace std;
|
||||
namespace {
|
||||
struct flags {
|
||||
flags()
|
||||
: repair_(false) {
|
||||
: repair_(false),
|
||||
logical_(false) {
|
||||
}
|
||||
|
||||
bool repair_;
|
||||
bool logical_;
|
||||
};
|
||||
|
||||
//--------------------------------
|
||||
@ -40,11 +42,11 @@ namespace {
|
||||
|
||||
if (want_stdout(output)) {
|
||||
emitter::ptr e = create_xml_emitter(cout);
|
||||
metadata_dump(md, e, fs.repair_);
|
||||
metadata_dump(md, e, fs.repair_, fs.logical_);
|
||||
} else {
|
||||
ofstream out(output.c_str());
|
||||
emitter::ptr e = create_xml_emitter(out);
|
||||
metadata_dump(md, e, fs.repair_);
|
||||
metadata_dump(md, e, fs.repair_, fs.logical_);
|
||||
}
|
||||
|
||||
} catch (std::exception &e) {
|
||||
@ -61,7 +63,8 @@ namespace {
|
||||
<< " {-h|--help}" << endl
|
||||
<< " {-o <xml file>}" << endl
|
||||
<< " {-V|--version}" << endl
|
||||
<< " {--repair}" << endl;
|
||||
<< " {--repair}" << endl
|
||||
<< " {--logical}" << endl;
|
||||
}
|
||||
}
|
||||
|
||||
@ -79,6 +82,7 @@ int main(int argc, char **argv)
|
||||
{ "output", required_argument, NULL, 'o' },
|
||||
{ "version", no_argument, NULL, 'V' },
|
||||
{ "repair", no_argument, NULL, 1 },
|
||||
{ "logical", no_argument, NULL, 2 },
|
||||
{ NULL, no_argument, NULL, 0 }
|
||||
};
|
||||
|
||||
@ -88,6 +92,10 @@ int main(int argc, char **argv)
|
||||
fs.repair_ = true;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
fs.logical_ = true;
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
usage(cout, basename(argv[0]));
|
||||
return 0;
|
||||
|
@ -39,6 +39,34 @@ namespace {
|
||||
emitter::ptr e_;
|
||||
};
|
||||
|
||||
class writeset_tree_collator : public writeset_tree_detail::writeset_visitor {
|
||||
public:
|
||||
writeset_tree_collator(map<uint32_t, uint32_t> &exceptions)
|
||||
: exceptions_(exceptions),
|
||||
current_era_(0) {
|
||||
}
|
||||
|
||||
virtual void writeset_begin(uint32_t era, uint32_t nr_bits) {
|
||||
current_era_ = era;
|
||||
}
|
||||
|
||||
virtual void bit(uint32_t bit, bool value) {
|
||||
if (value) {
|
||||
map<uint32_t, uint32_t>::const_iterator it = exceptions_.find(bit);
|
||||
if (it == exceptions_.end() || it->second < current_era_)
|
||||
exceptions_.insert(make_pair(bit, current_era_));
|
||||
}
|
||||
}
|
||||
|
||||
virtual void writeset_end() {
|
||||
}
|
||||
|
||||
private:
|
||||
map<uint32_t, uint32_t> &exceptions_;
|
||||
uint32_t current_era_;
|
||||
};
|
||||
|
||||
|
||||
struct ignore_writeset_tree_damage : public writeset_tree_detail::damage_visitor {
|
||||
void visit(writeset_tree_detail::missing_eras const &d) {
|
||||
}
|
||||
@ -61,16 +89,22 @@ namespace {
|
||||
|
||||
class era_array_emitter : public era_array_visitor {
|
||||
public:
|
||||
era_array_emitter(emitter::ptr e)
|
||||
: e_(e) {
|
||||
era_array_emitter(emitter::ptr e, map<uint32_t, uint32_t> const &exceptions)
|
||||
: e_(e),
|
||||
exceptions_(exceptions) {
|
||||
}
|
||||
|
||||
virtual void visit(uint32_t index, uint32_t era) {
|
||||
map<uint32_t, uint32_t>::const_iterator it = exceptions_.find(index);
|
||||
if (it != exceptions_.end() && it->second > era)
|
||||
e_->era(index, it->second);
|
||||
else
|
||||
e_->era(index, era);
|
||||
}
|
||||
|
||||
private:
|
||||
emitter::ptr e_;
|
||||
map<uint32_t, uint32_t> exceptions_;
|
||||
};
|
||||
|
||||
struct ignore_era_array_damage : public era_array_detail::damage_visitor {
|
||||
@ -90,18 +124,9 @@ namespace {
|
||||
raise_metadata_damage();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------
|
||||
|
||||
void
|
||||
era::metadata_dump(metadata::ptr md, emitter::ptr e, bool repair)
|
||||
{
|
||||
superblock const &sb = md->sb_;
|
||||
|
||||
e->begin_superblock(to_string(sb.uuid), sb.data_block_size,
|
||||
sb.nr_blocks,
|
||||
sb.current_era);
|
||||
dump(metadata::ptr md, emitter::ptr e, bool repair)
|
||||
{
|
||||
{
|
||||
writeset_tree_emitter visitor(e);
|
||||
@ -117,7 +142,8 @@ era::metadata_dump(metadata::ptr md, emitter::ptr e, bool repair)
|
||||
|
||||
e->begin_era_array();
|
||||
{
|
||||
era_array_emitter visitor(e);
|
||||
map<uint32_t, uint32_t> exceptions;
|
||||
era_array_emitter visitor(e, exceptions);
|
||||
|
||||
ignore_era_array_damage ignore;
|
||||
fatal_era_array_damage fatal;
|
||||
@ -129,6 +155,57 @@ era::metadata_dump(metadata::ptr md, emitter::ptr e, bool repair)
|
||||
}
|
||||
e->end_era_array();
|
||||
}
|
||||
|
||||
void dump_logical(metadata::ptr md, emitter::ptr e, bool repair)
|
||||
{
|
||||
// This will potentially use a lot of memory, but I don't
|
||||
// see a way around it.
|
||||
map<uint32_t, uint32_t> exceptions;
|
||||
|
||||
{
|
||||
writeset_tree_collator visitor(exceptions);
|
||||
|
||||
ignore_writeset_tree_damage ignore;
|
||||
fatal_writeset_tree_damage fatal;
|
||||
writeset_tree_detail::damage_visitor &dv = repair ?
|
||||
static_cast<writeset_tree_detail::damage_visitor &>(ignore) :
|
||||
static_cast<writeset_tree_detail::damage_visitor &>(fatal);
|
||||
|
||||
walk_writeset_tree(md->tm_, *md->writeset_tree_, visitor, dv);
|
||||
}
|
||||
|
||||
e->begin_era_array();
|
||||
{
|
||||
era_array_emitter visitor(e, exceptions);
|
||||
|
||||
ignore_era_array_damage ignore;
|
||||
fatal_era_array_damage fatal;
|
||||
era_array_detail::damage_visitor &dv = repair ?
|
||||
static_cast<era_array_detail::damage_visitor &>(ignore) :
|
||||
static_cast<era_array_detail::damage_visitor &>(fatal);
|
||||
|
||||
walk_era_array(*md->era_array_, visitor, dv);
|
||||
}
|
||||
e->end_era_array();
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------
|
||||
|
||||
void
|
||||
era::metadata_dump(metadata::ptr md, emitter::ptr e,
|
||||
bool repair, bool logical)
|
||||
{
|
||||
superblock const &sb = md->sb_;
|
||||
e->begin_superblock(to_string(sb.uuid), sb.data_block_size,
|
||||
sb.nr_blocks,
|
||||
sb.current_era);
|
||||
{
|
||||
if (logical)
|
||||
dump_logical(md, e, repair);
|
||||
else
|
||||
dump(md, e, repair);
|
||||
}
|
||||
e->end_superblock();
|
||||
}
|
||||
|
||||
|
@ -7,7 +7,8 @@
|
||||
//----------------------------------------------------------------
|
||||
|
||||
namespace era {
|
||||
void metadata_dump(metadata::ptr md, emitter::ptr out, bool repair);
|
||||
void metadata_dump(metadata::ptr md, emitter::ptr out,
|
||||
bool repair, bool logical);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user