projects
/
cumulus.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix to segment age calculation in local database.
[cumulus.git]
/
metadata.cc
diff --git
a/metadata.cc
b/metadata.cc
index
dac3d20
..
2b5f12a
100644
(file)
--- a/
metadata.cc
+++ b/
metadata.cc
@@
-12,6
+12,7
@@
#include <map>
#include "metadata.h"
#include <map>
#include "metadata.h"
+#include "localdb.h"
#include "ref.h"
#include "store.h"
#include "util.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;
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 */
/* 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
void add_segment(const string& segment);
/* Like strcmp, but sorts in the order that files will be visited in the
@@
-106,7
+112,6
@@
MetadataWriter::MetadataWriter(TarSegmentStore *store,
throw IOException("Error opening statcache");
}
throw IOException("Error opening statcache");
}
- found_match = false;
old_metadata_eof = false;
this->store = store;
old_metadata_eof = false;
this->store = store;
@@
-187,28
+192,25
@@
bool MetadataWriter::find(const string& path)
while (!old_metadata_eof) {
string old_path = uri_decode(old_metadata["name"]);
int cmp = pathcmp(old_path.c_str(), path_str);
while (!old_metadata_eof) {
string old_path = uri_decode(old_metadata["name"]);
int cmp = pathcmp(old_path.c_str(), path_str);
- if (cmp == 0) {
- found_match = true;
+ if (cmp == 0)
return true;
return true;
- } else if (cmp > 0) {
- found_match = false;
+ else if (cmp > 0)
return false;
return false;
- } else {
+ else
read_statcache();
read_statcache();
- }
}
}
- found_match = false;
return false;
}
/* Does a file appear to be unchanged from the previous time it was backed up,
return false;
}
/* Does a file appear to be unchanged from the previous time it was backed up,
- * based on stat information?
- *
- * TODO: Notice files that were modified as they were being backed up the last
- * time. */
+ * based on stat information? */
bool MetadataWriter::is_unchanged(const struct stat *stat_buf)
{
bool MetadataWriter::is_unchanged(const struct stat *stat_buf)
{
+ if (old_metadata.find("volatile") != old_metadata.end()
+ && parse_int(old_metadata["volatile"]) != 0)
+ return false;
+
if (old_metadata.find("ctime") == old_metadata.end())
return false;
if (stat_buf->st_ctime != parse_int(old_metadata["ctime"]))
if (old_metadata.find("ctime") == old_metadata.end())
return false;
if (stat_buf->st_ctime != parse_int(old_metadata["ctime"]))
@@
-256,11
+258,9
@@
list<ObjectReference> MetadataWriter::get_blocks()
s++;
}
s++;
}
- ObjectReference *r = ObjectReference::parse(ref);
- if (r != NULL) {
- blocks.push_back(*r);
- delete r;
- }
+ ObjectReference r = ObjectReference::parse(ref);
+ if (!r.is_null())
+ blocks.push_back(r);
}
return blocks;
}
return blocks;
@@
-275,6
+275,13
@@
void MetadataWriter::metadata_flush()
ObjectReference indirect;
for (list<MetadataItem>::iterator i = items.begin();
i != items.end(); ++i) {
ObjectReference indirect;
for (list<MetadataItem>::iterator i = items.begin();
i != items.end(); ++i) {
+ // If indirectly referencing any other metadata logs, be sure those
+ // segments are properly referenced.
+ 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
if (!i->reused || !indirect.merge(i->ref)) {
// Write out an indirect reference to any previous objects which could
// be reused
if (!i->reused || !indirect.merge(i->ref)) {
@@
-321,6
+328,7
@@
void MetadataWriter::metadata_flush()
ObjectReference ref = meta->get_ref();
metadata_root << "@" << ref.to_string() << "\n";
add_segment(ref.get_segment());
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;
delete meta;
@@
-349,12
+357,11
@@
void MetadataWriter::add(dictionary info)
item.reused = false;
item.text += encode_dict(info) + "\n";
item.reused = false;
item.text += encode_dict(info) + "\n";
- if (info == old_metadata) {
- ObjectReference
*
ref = ObjectReference::parse(old_metadata_loc);
- if (
ref != NULL
) {
+ if (info == old_metadata
&& !flag_full_metadata
) {
+ ObjectReference ref = ObjectReference::parse(old_metadata_loc);
+ if (
!ref.is_null()
) {
item.reused = true;
item.reused = true;
- item.ref = *ref;
- delete ref;
+ item.ref = ref;
}
}
}
}
@@
-376,6
+383,7
@@
ObjectReference MetadataWriter::close()
root->write(store);
root->checksum();
add_segment(root->get_ref().get_segment());
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;
ObjectReference ref = root->get_ref();
delete root;