cache_restore --omit-clean-shutdown
This commit is contained in:
parent
dcf4b0a99c
commit
31ce9a03fa
@ -23,7 +23,7 @@ namespace {
|
|||||||
emitter::ptr output_emitter(string const &path) {
|
emitter::ptr output_emitter(string const &path) {
|
||||||
block_manager<>::ptr bm = open_bm(path, block_io<>::READ_WRITE);
|
block_manager<>::ptr bm = open_bm(path, block_io<>::READ_WRITE);
|
||||||
metadata::ptr md(new metadata(bm, metadata::CREATE));
|
metadata::ptr md(new metadata(bm, metadata::CREATE));
|
||||||
return create_restore_emitter(md);
|
return create_restore_emitter(md, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
int repair(string const &old_path, string const &new_path) {
|
int repair(string const &old_path, string const &new_path) {
|
||||||
|
@ -23,20 +23,23 @@ namespace {
|
|||||||
struct flags {
|
struct flags {
|
||||||
flags()
|
flags()
|
||||||
: metadata_version(1),
|
: metadata_version(1),
|
||||||
override_metadata_version(false) {
|
override_metadata_version(false),
|
||||||
|
clean_shutdown(true) {
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<string> input;
|
optional<string> input;
|
||||||
optional<string> output;
|
optional<string> output;
|
||||||
|
|
||||||
uint32_t metadata_version;
|
uint32_t metadata_version;
|
||||||
bool override_metadata_version;
|
bool override_metadata_version;
|
||||||
|
bool clean_shutdown;
|
||||||
};
|
};
|
||||||
|
|
||||||
int restore(flags const &fs) {
|
int restore(flags const &fs) {
|
||||||
try {
|
try {
|
||||||
block_manager<>::ptr bm = open_bm(*fs.output, block_io<>::READ_WRITE);
|
block_manager<>::ptr bm = open_bm(*fs.output, block_io<>::READ_WRITE);
|
||||||
metadata::ptr md(new metadata(bm, metadata::CREATE));
|
metadata::ptr md(new metadata(bm, metadata::CREATE));
|
||||||
emitter::ptr restorer = create_restore_emitter(md);
|
emitter::ptr restorer = create_restore_emitter(md, fs.clean_shutdown);
|
||||||
|
|
||||||
if (fs.override_metadata_version) {
|
if (fs.override_metadata_version) {
|
||||||
cerr << "overriding" << endl;
|
cerr << "overriding" << endl;
|
||||||
@ -63,7 +66,8 @@ namespace {
|
|||||||
<< " {-o|--output} <output device or file>" << endl
|
<< " {-o|--output} <output device or file>" << endl
|
||||||
<< " {-V|--version}" << endl
|
<< " {-V|--version}" << endl
|
||||||
<< endl
|
<< endl
|
||||||
<< " {--debug-override-metadata-version} <integer>" << endl;
|
<< " {--debug-override-metadata-version} <integer>" << endl
|
||||||
|
<< " {--omit-clean-shutdown}" << endl;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -76,6 +80,7 @@ int main(int argc, char **argv)
|
|||||||
char const *short_opts = "hi:o:V";
|
char const *short_opts = "hi:o:V";
|
||||||
option const long_opts[] = {
|
option const long_opts[] = {
|
||||||
{ "debug-override-metadata-version", required_argument, NULL, 0 },
|
{ "debug-override-metadata-version", required_argument, NULL, 0 },
|
||||||
|
{ "omit-clean-shutdown", no_argument, NULL, 1 },
|
||||||
{ "help", no_argument, NULL, 'h'},
|
{ "help", no_argument, NULL, 'h'},
|
||||||
{ "input", required_argument, NULL, 'i' },
|
{ "input", required_argument, NULL, 'i' },
|
||||||
{ "output", required_argument, NULL, 'o'},
|
{ "output", required_argument, NULL, 'o'},
|
||||||
@ -90,6 +95,10 @@ int main(int argc, char **argv)
|
|||||||
fs.override_metadata_version = true;
|
fs.override_metadata_version = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
fs.clean_shutdown = false;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'h':
|
case 'h':
|
||||||
usage(cout, prog_name);
|
usage(cout, prog_name);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -47,13 +47,13 @@ metadata::metadata(block_manager<>::ptr bm, open_type ot)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
metadata::commit()
|
metadata::commit(bool clean_shutdown)
|
||||||
{
|
{
|
||||||
commit_space_map();
|
commit_space_map();
|
||||||
commit_mappings();
|
commit_mappings();
|
||||||
commit_hints();
|
commit_hints();
|
||||||
commit_discard_bits();
|
commit_discard_bits();
|
||||||
commit_superblock();
|
commit_superblock(clean_shutdown);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -130,10 +130,13 @@ metadata::commit_discard_bits()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
metadata::commit_superblock()
|
metadata::commit_superblock(bool clean_shutdown)
|
||||||
{
|
{
|
||||||
|
if (clean_shutdown)
|
||||||
sb_.flags.set_flag(superblock_flags::CLEAN_SHUTDOWN);
|
sb_.flags.set_flag(superblock_flags::CLEAN_SHUTDOWN);
|
||||||
|
|
||||||
write_superblock(tm_->get_bm(), sb_);
|
write_superblock(tm_->get_bm(), sb_);
|
||||||
|
|
||||||
sb_.flags.clear_flag(superblock_flags::CLEAN_SHUTDOWN);
|
sb_.flags.clear_flag(superblock_flags::CLEAN_SHUTDOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ namespace caching {
|
|||||||
|
|
||||||
metadata(block_manager<>::ptr bm, open_type ot);
|
metadata(block_manager<>::ptr bm, open_type ot);
|
||||||
|
|
||||||
void commit();
|
void commit(bool clean_shutdown = true);
|
||||||
void setup_hint_array(size_t width);
|
void setup_hint_array(size_t width);
|
||||||
|
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ namespace caching {
|
|||||||
void commit_mappings();
|
void commit_mappings();
|
||||||
void commit_hints();
|
void commit_hints();
|
||||||
void commit_discard_bits();
|
void commit_discard_bits();
|
||||||
void commit_superblock();
|
void commit_superblock(bool clean_shutdown);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -11,9 +11,10 @@ using namespace superblock_damage;
|
|||||||
namespace {
|
namespace {
|
||||||
class restorer : public emitter {
|
class restorer : public emitter {
|
||||||
public:
|
public:
|
||||||
restorer(metadata::ptr md)
|
restorer(metadata::ptr md, bool clean_shutdown)
|
||||||
: in_superblock_(false),
|
: in_superblock_(false),
|
||||||
md_(md) {
|
md_(md),
|
||||||
|
clean_shutdown_(clean_shutdown) {
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~restorer() {
|
virtual ~restorer() {
|
||||||
@ -44,7 +45,7 @@ namespace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual void end_superblock() {
|
virtual void end_superblock() {
|
||||||
md_->commit();
|
md_->commit(clean_shutdown_);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void begin_mappings() {
|
virtual void begin_mappings() {
|
||||||
@ -99,15 +100,16 @@ namespace {
|
|||||||
private:
|
private:
|
||||||
bool in_superblock_;
|
bool in_superblock_;
|
||||||
metadata::ptr md_;
|
metadata::ptr md_;
|
||||||
|
bool clean_shutdown_;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------
|
//----------------------------------------------------------------
|
||||||
|
|
||||||
emitter::ptr
|
emitter::ptr
|
||||||
caching::create_restore_emitter(metadata::ptr md)
|
caching::create_restore_emitter(metadata::ptr md, bool clean_shutdown)
|
||||||
{
|
{
|
||||||
return emitter::ptr(new restorer(md));
|
return emitter::ptr(new restorer(md, clean_shutdown));
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------
|
//----------------------------------------------------------------
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
//----------------------------------------------------------------
|
//----------------------------------------------------------------
|
||||||
|
|
||||||
namespace caching {
|
namespace caching {
|
||||||
emitter::ptr create_restore_emitter(metadata::ptr md);
|
emitter::ptr create_restore_emitter(metadata::ptr md, bool clean_shutdown = true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------
|
//----------------------------------------------------------------
|
||||||
|
@ -21,6 +21,7 @@ Feature: thin_restore
|
|||||||
{-V|--version}
|
{-V|--version}
|
||||||
|
|
||||||
{--debug-override-metadata-version} <integer>
|
{--debug-override-metadata-version} <integer>
|
||||||
|
{--omit-clean-shutdown}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -38,6 +39,7 @@ Feature: thin_restore
|
|||||||
{-V|--version}
|
{-V|--version}
|
||||||
|
|
||||||
{--debug-override-metadata-version} <integer>
|
{--debug-override-metadata-version} <integer>
|
||||||
|
{--omit-clean-shutdown}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -72,3 +74,9 @@ Feature: thin_restore
|
|||||||
And an empty dev file
|
And an empty dev file
|
||||||
When I run cache_restore with -i metadata.xml -o metadata.bin --debug-override-metadata-version 10298
|
When I run cache_restore with -i metadata.xml -o metadata.bin --debug-override-metadata-version 10298
|
||||||
Then it should pass
|
Then it should pass
|
||||||
|
|
||||||
|
Scenario: accepts --omit-clean-shutdown
|
||||||
|
Given a small xml file
|
||||||
|
And an empty dev file
|
||||||
|
When I run cache_restore with -i metadata.xml -o metadata.bin --omit-clean-shutdown
|
||||||
|
Then it should pass
|
||||||
|
Loading…
Reference in New Issue
Block a user