- // tarstore processing
- string blockid = tss->write_object(block_buf, bytes, "data");
- if (segment_list.size() > 0)
- segment_list += " ";
- segment_list += blockid;
+ // 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);
+ 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;
+
+ /* We might still have seen this checksum before, if the object was
+ * stored at some time in the past, but we have decided to clean
+ * the segment the object was originally stored in (FindObject will
+ * not return such objects). When rewriting the object contents,
+ * put it in a separate group, so that old objects get grouped
+ * together. The hope is that these old objects will continue to
+ * be used in the future, and we obtain segments which will
+ * continue to be well-utilized. */
+ if (db->IsOldObject(block_csum, bytes))
+ o->set_group("compacted");
+ else
+ 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;
+ }