+ struct segment_info *segment;
+
+ // Find the segment into which the object should be written, looking up by
+ // group. If no segment exists yet, create one.
+ if (segments.find(group) == segments.end()) {
+ segment = new segment_info;
+
+ segment->name = generate_uuid();
+ segment->group = group;
+ segment->basename = segment->name + ".tar";
+ segment->basename += filter_extension;
+ segment->count = 0;
+ segment->data_size = 0;
+ segment->rf = remote->alloc_file(segment->basename,
+ group == "metadata" ? "segments0"
+ : "segments1");
+ segment->file = new Tarfile(segment->rf, segment->name);
+
+ segments[group] = segment;
+ } else {
+ segment = segments[group];
+ }
+
+ int id = segment->count;
+ char id_buf[64];
+ sprintf(id_buf, "%08x", id);
+
+ segment->file->write_object(id, data, len);
+ segment->count++;
+ segment->data_size += len;
+
+ group_sizes[group].first += len;
+
+ ObjectReference ref(segment->name, id_buf);
+ ref.set_range(0, len, true);
+ if (checksum.size() > 0)
+ ref.set_checksum(checksum);
+ if (db != NULL)
+ db->StoreObject(ref, age);
+
+ // If this segment meets or exceeds the size target, close it so that
+ // future objects will go into a new segment.
+ if (segment->file->size_estimate() >= SEGMENT_SIZE)
+ close_segment(group);
+
+ return ref;