Log Message: |
Append index data to the rev data file instead of using separate files.
This gives unpacked FSFS format 7 similar I/O characteristics and disk
space usage as earlier formats. It also eliminates the need for retries
after a potential background pack run because each file is now always
consistent with itself (earlier, data or index files might already have
been deleted while the respective other was still valid). Overall,
most of this patch is removing code necessary to handle separate files.
The new file format is simple:
<rep data><l2p index><p2l index><footer><footer length>
with the first three being identical what we had before. <footer length>
is a single byte giving the length of the preceding footer, so it's
easier to extract than the pre-f7 rev trailer and there is only one
per pack / rev file.
The footer itself is just two decimal file offsets marking the start
of the index sections, separated by a single space char.
* subversion/libsvn_fs_fs/low_level.h
(svn_fs_fs__parse_footer,
svn_fs_fs__unparse_footer): Declare new parser / generator API for the
f7 footer, similar to f6- revision trailer
but slightly simplified.
* subversion/libsvn_fs_fs/low_level.c
(svn_fs_fs__parse_footer,
svn_fs_fs__unparse_footer): Implement.
* subversion/libsvn_fs_fs/rev_file.h
(svn_fs_fs__revision_file_t): Add members for footer contents access
block size.
(svn_fs_fs__reopen_revision_file): Drop. Retry is no longer necessary.
(svn_fs_fs__auto_read_footer): Declare new function that reads the footer
if we didn't yet.
* subversion/libsvn_fs_fs/rev_file.c
(svn_fs_fs__reopen_revision_file): Drop.
(svn_fs_fs__auto_read_footer): Implement.
(svn_fs_fs__close_revision_file): Index streams don't carry any releasable
resources anymore.
* subversion/libsvn_fs_fs/index.h
(svn_fs_fs__packed_stream_close): Drop. There are no independent file
resources linked to the index data
streams anymore.
(svn_fs_fs__l2p_index_create,
svn_fs_fs__p2l_index_create): Rename to ...
(svn_fs_fs__l2p_index_append
svn_fs_fs__p2l_index_create): ... these and accept an open file instead
of a file name to be created.
* subversion/libsvn_fs_fs/index.c
(packed_stream_open): Instead of opening our own index file, accept an
already open one and use the specified offset range.
(svn_fs_fs__packed_stream_close): Drop.
(index_create): Drop. The files already exist.
(svn_fs_fs__l2p_index_create,
svn_fs_fs__p2l_index_create): Rename to ...
(svn_fs_fs__l2p_index_append
svn_fs_fs__p2l_index_create): ... these and use the already open file
instead of creating new ones.
(retry_open_l2p_index,
retry_open_p2l_index): No longer necessary.
(svn_fs_fs__item_offset,
svn_fs_fs__p2l_get_max_offset): No lookup retry necessary anymore.
(auto_open_l2p_index,
auto_open_p2l_index): Make sure we know the index location and then
open the stream based on the existing file.
* subversion/libsvn_fs_fs/transaction.h
(svn_fs_fs__add_index_data): New private API that combines index data
with the rep data file and finalizes it.
* subversion/libsvn_fs_fs/transaction.c
(svn_fs_fs__add_index_data): Implement.
(commit_body): Use the above.
* subversion/libsvn_fs_fs/fs_fs.c
(write_revision_zero): Update r0 template by simply appending the
index contents and a final footer.
* subversion/libsvn_fs_fs/cached_data.c
(block_read): Remove the now unnecessary retry-on-pack code.
* subversion/libsvn_fs_fs/hotcopy.c
(hotcopy_copy_shard_file): Remove index file copy code.
(hotcopy_copy_packed_shard,
hotcopy_revisions): Update callers.
* subversion/libsvn_fs_fs/pack.c
(close_pack_context): Use the new transaction.h API to finalize the
index data.
(pack_range): Instead of ending with the file, revision content now ends
where L2P index data starts.
* subversion/libsvn_fs_fs/util.h
(svn_fs_fs__path_l2p_index,
svn_fs_fs__path_p2l_index): Drop. These are no longer separate files.
* subversion/libsvn_fs_fs/util.c
(svn_fs_fs__path_l2p_index,
svn_fs_fs__path_p2l_index): Drop.
* subversion/libsvn_fs_fs/verify.c
(compare_p2l_to_rev): Rev contents now ends where the L2P index begins.
* subversion/tests/libsvn_fs_fs/fs-fs-pack-test.c
(pack_filesystem): There are no separate index files anymore.
* subversion/tests/cmdline/svnadmin_tests.py
(read_l2p): Use contents of the rev file instead of a separate index file.
(set_changed_path_list): Parse footer and splice data correctly retaining
the index contents as-is.
* tools/server-side/svnfsfs/load-index-cmd.c
(write_p2l_index,
write_l2p_index): Instead of creating the final index files, create
the proto-index files only.
(load_index): Trim the old index from the pack / rev file and append
the new ones using our new transaction.h API.
|