Reimplement fsfs private operations required by `svnfsfs` (stats, dump index, load index) as "ioctls".
Technically we achieve this by introducing the new svn_fs_ioctl() API that adds a generic way of performing backend-specific I/O operations.
This change serves two purposes:
- It allows us to properly expose FS-specific details and invoke FS-specific operations everywhere without necessarily promoting them into a proper public API (the ioctl code itself may be made either public or private, depending on the requirements).
- It solves a potential dependency/linking problem where tools like `svnfsfs` work through the libsvn_fs's loader, but also have to load and call private APIs from libsvn_fs_fs thus ignoring the loader. The latter part may potentially cause issues with the global shared state, etc. With the patch, all such operations always go through the FS loader.
* subversion/include/svn_error_codes.h (SVN_ERR_FS_UNRECOGNIZED_IOCTL_CODE): New error code.
* subversion/include/private/svn_fs_fs_private.h (svn_fs_fs__get_stats, svn_fs_fs__dump_index, svn_fs_fs__load_index): These functions are now implemented as... (SVN_FS_FS__IOCTL_GET_STATS, SVN_FS_FS__IOCTL_DUMP_INDEX, SVN_FS_FS__IOCTL_LOAD_INDEX): ...these new ioctls, which ... (svn_fs_fs__ioctl_get_stats_input_t, svn_fs_fs__ioctl_get_stats_output_t, svn_fs_fs__ioctl_dump_index_input_t, svn_fs_fs__ioctl_load_index_input_t): ...use these new structures.
* subversion/libsvn_fs/fs-loader.h (fs_library_vtable_t.ioctl, fs_vtable_t.ioctl): New vtable members.
* subversion/libsvn_fs/fs-loader.c (svn_fs_ioctl): Implement the new API by forwarding it to an appropriate vtable member.
* subversion/libsvn_fs_fs/fs_fs.h (svn_fs_fs__get_stats, svn_fs_fs__dump_index, svn_fs_fs__load_index): These functions are now declared here.
* subversion/libsvn_fs_fs/fs.c (): Include `svn_fs_fs_private.h`. (fs_ioctl): Implement the ioctl dispatcher for three current fsfs-specific operations. (fs_vtable): Initialize the `ioctl` field. (library_vtable): Initialize the `ioctl` field to NULL.
Make the fsfs stats test work properly with LZ4 compression.
One of the expectations has been that for our test Greek Tree repository, the on-disk size of the directory representations should be _more_ than their actual size (due to the overheads associated with serializing them on the disk).
This assumption is quite sensitive to the used compression algorithm. For example, the actual size of the directory representations is 618 bytes. Assuming directory deltification is enabled, with zlib compression the size is 708 bytes (more than actual), but with LZ4 compression it's 571 bytes, and that is less than the actual size. While I think that such result can be explained just by the fact that the compression algorithms are just different, the test should take that into account.
* subversion/tests/libsvn_fs_fs/fs-fs-private-test.c (verify_representation_stats): Expect sane relation between the packed and the actual sizes, but don't assume that the packed size will _always_ exceed the actual size.