hash.process(block_buf, bytes);
- // tarstore processing
- LbsObject *o = new LbsObject;
- o->set_group("data");
- o->set_data(block_buf, bytes);
- o->write(tss);
- object_list.push_back(o->get_name());
- segment_list.insert(o->get_ref().get_segment());
-
- // Index this block so it can be used by future snapshots
+ // Either find a copy of this block in an already-existing segment, or
+ // index it so it can be re-used in the future
SHA1Checksum block_hash;
block_hash.process(block_buf, bytes);
- db->StoreObject(o->get_ref(), block_hash.checksum_str(), bytes);
+ string block_csum = block_hash.checksum_str();
+ ObjectReference ref = db->FindObject(block_csum, bytes);
+
+ // Store a copy of the object if one does not yet exist
+ if (ref.get_segment().size() == 0) {
+ LbsObject *o = new LbsObject;
+ o->set_group("data");
+ o->set_data(block_buf, bytes);
+ o->write(tss);
+ ref = o->get_ref();
+ db->StoreObject(ref, block_csum, bytes);
+ delete o;
+ }
+ object_list.push_back(ref.to_string());
+ segment_list.insert(ref.get_segment());
+ db->UseObject(ref);
size += bytes;
-
- delete o;
}
file_info["checksum"] = hash.checksum_str();
tss = new TarSegmentStore(backup_dest);
- string database_path = backup_dest + "/localdb.sqlite";
- db = new LocalDb;
- db->Open(database_path.c_str());
-
/* Write a backup descriptor file, which says which segments are needed and
* where to start to restore this snapshot. The filename is based on the
* current time. */
string desc_filename = backup_dest + "/" + desc_buf + ".lbs";
std::ofstream descriptor(desc_filename.c_str());
+ /* Open the local database which tracks all objects that are stored
+ * remotely, for efficient incrementals. Provide it with the name of this
+ * snapshot. */
+ string database_path = backup_dest + "/localdb.sqlite";
+ db = new LocalDb;
+ db->Open(database_path.c_str(), desc_buf);
+
try {
scanfile(".");
} catch (IOException e) {