X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=metadata.cc;h=71d7b7266bfb8cf13fc78ebb5635f080c9e9a082;hb=013636b17f3e44f5ac4837750a3888999d35d2f8;hp=c27278bccb14ce539064eb0d72de766e039de611;hpb=1b39ce3ff11a0c7cc742dc3f1aae2161df7cc6ab;p=cumulus.git diff --git a/metadata.cc b/metadata.cc index c27278b..71d7b72 100644 --- a/metadata.cc +++ b/metadata.cc @@ -1,5 +1,5 @@ /* LBS: An LFS-inspired filesystem backup system - * Copyright (C) 2007 Michael Vrable + * Copyright (C) 2007-2008 Michael Vrable * * Handling of metadata written to backup snapshots. This manages the writing * of file metadata into new backup snapshots, including breaking the metadata @@ -12,6 +12,7 @@ #include #include "metadata.h" +#include "localdb.h" #include "ref.h" #include "store.h" #include "util.h" @@ -24,7 +25,12 @@ using std::ostringstream; static const size_t LBS_METADATA_BLOCK_SIZE = 65536; +// If true, forces a full write of metadata: will not include pointers to +// metadata in old snapshots. +bool flag_full_metadata = false; + /* TODO: Move to header file */ +extern LocalDb *db; void add_segment(const string& segment); /* Like strcmp, but sorts in the order that files will be visited in the @@ -271,8 +277,10 @@ void MetadataWriter::metadata_flush() i != items.end(); ++i) { // If indirectly referencing any other metadata logs, be sure those // segments are properly referenced. - if (i->reused) + if (i->reused) { add_segment(i->ref.get_segment()); + db->UseSegment(i->ref.get_segment(), 1.0); + } // Write out an indirect reference to any previous objects which could // be reused @@ -320,6 +328,7 @@ void MetadataWriter::metadata_flush() ObjectReference ref = meta->get_ref(); metadata_root << "@" << ref.to_string() << "\n"; add_segment(ref.get_segment()); + db->UseSegment(ref.get_segment(), 1.0); delete meta; @@ -348,7 +357,7 @@ void MetadataWriter::add(dictionary info) item.reused = false; item.text += encode_dict(info) + "\n"; - if (info == old_metadata) { + if (info == old_metadata && !flag_full_metadata) { ObjectReference ref = ObjectReference::parse(old_metadata_loc); if (!ref.is_null()) { item.reused = true; @@ -374,6 +383,7 @@ ObjectReference MetadataWriter::close() root->write(store); root->checksum(); add_segment(root->get_ref().get_segment()); + db->UseSegment(root->get_ref().get_segment(), 1.0); ObjectReference ref = root->get_ref(); delete root;