- if (object_stream)
- finish_object();
-
- // Write out the object table which gives the sizes and locations of all
- // objects, and then add the trailing signature, which indicates the end of
- // the segment and gives the offset of the object table.
- int64_t index_offset = out->get_pos();
-
- for (object_table::const_iterator i = objects.begin();
- i != objects.end(); ++i) {
- out->write_s64(i->first);
- out->write_s64(i->second);
+ 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];