Include sizes in references to blocks in each file's data list.
authorMichael Vrable <mvrable@cs.ucsd.edu>
Wed, 12 Dec 2007 18:34:46 +0000 (10:34 -0800)
committerMichael Vrable <mvrable@turin.ucsd.edu>
Wed, 12 Dec 2007 18:34:46 +0000 (10:34 -0800)
This optimization is aimed at large files that are composed of many
blocks--including the size of each block allows a restore program to
determine the offset at which each block begins in the output file (by
adding up the sizes of the previous block).  This may allow for more
efficient restores, in which file data is filled in as blocks are
encountered, instead of having to find the blocks in the order they appear
in the data list.

A future change might be to only include the sizes when necessary--files
which are composed of a single object do not need a size, nor does the last
block of a large file.  But for now, simply include the size on all
objects.

This is part of a recommended format change, but one that is both forward-
and backward-compatible.

localdb.cc
scandir.cc

index 004391b..17337f0 100644 (file)
@@ -258,6 +258,7 @@ ObjectReference LocalDb::FindObject(const string &checksum, int64_t size)
     } else if (rc == SQLITE_ROW) {
         ref = ObjectReference(IdToSegment(sqlite3_column_int64(stmt, 0)),
                               (const char *)sqlite3_column_text(stmt, 1));
+        ref.set_range(0, size);
     } else {
         fprintf(stderr, "Could not execute SELECT statement!\n");
         ReportError(rc);
index f653f43..9727133 100644 (file)
@@ -228,6 +228,7 @@ int64_t dumpfile(int fd, dictionary &file_info, const string &path,
                 o->write(tss);
                 ref = o->get_ref();
                 db->StoreObject(ref, block_csum, bytes, block_age);
+                ref.set_range(0, bytes);
                 delete o;
             }