Factor out a bit of FSFS code. ### Does a "write a rev num to a file" helper already exist for the 'current' file? If so, this should use it instead of adding its own function. * subversion/libsvn_fs_fs/fs_fs.c (write_min_packed_rev_file): New function. (pack_shard, pack_revprop_shard): Use it instead of inline code. --This line, and those below, will be ignored-- Index: subversion/libsvn_fs_fs/fs_fs.c =================================================================== --- subversion/libsvn_fs_fs/fs_fs.c (revision 1041423) +++ subversion/libsvn_fs_fs/fs_fs.c (working copy) @@ -7517,6 +7517,29 @@ svn_fs_fs__begin_obliteration_txn(svn_fs /****** Packing FSFS shards *********/ + +/* Write a file FILENAME in directory FS_PATH, containing a single line + * with the number NUMBER in ASCII decimal. Move the file into place + * atomically, overwriting any existing file. */ +static svn_error_t * +write_min_packed_rev_file(const char *fs_path, + const char *filename, + svn_revnum_t number, + apr_pool_t *scratch_pool) +{ + const char *final_path, *tmp_path; + svn_stream_t *tmp_stream; + + final_path = svn_dirent_join(fs_path, filename, scratch_pool); + SVN_ERR(svn_stream_open_unique(&tmp_stream, &tmp_path, fs_path, + svn_io_file_del_none, + scratch_pool, scratch_pool)); + SVN_ERR(svn_stream_printf(tmp_stream, scratch_pool, "%ld\n", number)); + SVN_ERR(svn_stream_close(tmp_stream)); + SVN_ERR(move_into_place(tmp_path, final_path, final_path, scratch_pool)); + return SVN_NO_ERROR; +} + /* Pack a single shard SHARD in REVS_DIR, using POOL for allocations. CANCEL_FUNC and CANCEL_BATON are what you think they are. @@ -7533,12 +7556,10 @@ pack_shard(const char *revs_dir, void *cancel_baton, apr_pool_t *pool) { - const char *tmp_path, *final_path; const char *pack_file_path, *manifest_file_path, *shard_path; const char *pack_file_dir; svn_stream_t *pack_stream, *manifest_stream; svn_revnum_t start_rev, end_rev, rev; - svn_stream_t *tmp_stream; apr_off_t next_offset; apr_pool_t *iterpool; @@ -7549,8 +7570,8 @@ pack_shard(const char *revs_dir, pack_file_path = svn_dirent_join(pack_file_dir, "pack", pool); manifest_file_path = svn_dirent_join(pack_file_dir, "manifest", pool); shard_path = svn_dirent_join(revs_dir, - apr_psprintf(pool, "%" APR_INT64_T_FMT, shard), - pool); + apr_psprintf(pool, "%" APR_INT64_T_FMT, shard), + pool); /* Notify caller we're starting to pack this shard. */ if (notify_func) @@ -7608,13 +7629,9 @@ pack_shard(const char *revs_dir, /* Update the min-unpacked-rev file to reflect our newly packed shard. * (This doesn't update ffd->min_unpacked_rev. That will be updated by * open_pack_or_rev_file() when necessary.) */ - final_path = svn_dirent_join(fs_path, PATH_MIN_UNPACKED_REV, iterpool); - SVN_ERR(svn_stream_open_unique(&tmp_stream, &tmp_path, fs_path, - svn_io_file_del_none, iterpool, iterpool)); - SVN_ERR(svn_stream_printf(tmp_stream, iterpool, "%ld\n", - (svn_revnum_t) ((shard + 1) * max_files_per_dir))); - SVN_ERR(svn_stream_close(tmp_stream)); - SVN_ERR(move_into_place(tmp_path, final_path, final_path, iterpool)); + SVN_ERR(write_min_packed_rev_file(fs_path, PATH_MIN_UNPACKED_REV, + (svn_revnum_t)((shard + 1) * max_files_per_dir), + iterpool)); svn_pool_destroy(iterpool); /* Finally, remove the existing shard directory. */ @@ -7642,10 +7659,9 @@ pack_revprop_shard(svn_fs_t *fs, apr_pool_t *pool) { fs_fs_data_t *ffd = fs->fsap_data; - const char *shard_path, *final_path, *tmp_path; + const char *shard_path; svn_revnum_t start_rev, end_rev, rev; svn_sqlite__stmt_t *stmt; - svn_stream_t *tmp_stream; apr_pool_t *iterpool; shard_path = svn_dirent_join(revprops_dir, @@ -7676,13 +7692,9 @@ pack_revprop_shard(svn_fs_t *fs, /* Update the min-unpacked-revprop file to reflect our newly packed shard. * (This doesn't update ffd->min_unpacked_revprop.) */ - final_path = svn_dirent_join(fs_path, PATH_MIN_UNPACKED_REVPROP, iterpool); - SVN_ERR(svn_stream_open_unique(&tmp_stream, &tmp_path, fs_path, - svn_io_file_del_none, iterpool, iterpool)); - SVN_ERR(svn_stream_printf(tmp_stream, iterpool, "%ld\n", - (svn_revnum_t) ((shard + 1) * max_files_per_dir))); - SVN_ERR(svn_stream_close(tmp_stream)); - SVN_ERR(move_into_place(tmp_path, final_path, final_path, iterpool)); + SVN_ERR(write_min_packed_rev_file(fs_path, PATH_MIN_UNPACKED_REVPROP, + (svn_revnum_t)((shard + 1) * max_files_per_dir), + iterpool)); svn_pool_destroy(iterpool); /* Finally, remove the existing shard directory. */