[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: r1397773 - rep sharing in a txn - /subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c

From: Julian Foad <julianfoad_at_btopenworld.com>
Date: Sat, 13 Oct 2012 15:17:43 +0100 (BST)

> Author: stefan2

> Date: Sat Oct 13 05:49:50 2012
> New Revision: 1397773
>
> URL: http://svn.apache.org/viewvc?rev=1397773&view=rev
> Log:
> Due to public request: apply rep-sharing to equal data reps within
> the same transaction.
>
> The idea is simple. When writing a noderev to the txn folder,
> write another file named by the rep's SHA1 and store the rep
> struct in there. Lookup is then straight-forward.

Hi Stefan. What's the scalability? I'm wondering about the big-O performance of storing 10000 or 100000 files in the dir.

- Julian

> * subversion/libsvn_fs_fs/fs_fs.c
> (svn_fs_fs__put_node_revision): also look for SHA1-named files
> (get_shared_rep): write SHA1-named files
>
> Modified:
> subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
>
> Modified: subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
> URL:
> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c?rev=1397773&r1=1397772&r2=1397773&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c (original)
> +++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c Sat Oct 13 05:49:50 2012
> @@ -2585,6 +2585,10 @@ svn_fs_fs__put_node_revision(svn_fs_t *f
> fs_fs_data_t *ffd = fs->fsap_data;
> apr_file_t *noderev_file;
> const char *txn_id = svn_fs_fs__id_txn_id(id);
> + const char *sha1 = ffd->rep_sharing_allowed &&
> noderev->data_rep
> + ?
> svn_checksum_to_cstring(noderev->data_rep->sha1_checksum,
> + pool)
> + : NULL;
>
> noderev->is_fresh_txn_root = fresh_txn_root;
>
> @@ -2603,7 +2607,32 @@ svn_fs_fs__put_node_revision(svn_fs_t *f
> svn_fs_fs__fs_supports_mergeinfo(fs),
> pool));
>
> - return svn_io_file_close(noderev_file, pool);
> + SVN_ERR(svn_io_file_close(noderev_file, pool));
> +
> + /* if rep sharing has been enabled and the noderev has a data rep and
> + * its SHA-1 is known, store the rep struct under its SHA1. */
> + if (sha1)
> + {
> + apr_file_t *rep_file;
> + const char *file_name = svn_dirent_join(path_txn_dir(fs, txn_id, pool),
> + sha1, pool);
> + const char *rep_string = representation_string(noderev->data_rep,
> + ffd->format,
> + (noderev->kind
> + == svn_node_dir),
> + FALSE,
> + pool);
> + SVN_ERR(svn_io_file_open(&rep_file, file_name,
> + APR_WRITE | APR_CREATE | APR_TRUNCATE
> + | APR_BUFFERED, APR_OS_DEFAULT, pool));
> +
> + SVN_ERR(svn_io_file_write_full(rep_file, rep_string,
> + strlen(rep_string), NULL, pool));
> +
> + SVN_ERR(svn_io_file_close(rep_file, pool));
> + }
> +
> + return SVN_NO_ERROR;
> }
>
>
> @@ -7083,6 +7112,30 @@ get_shared_rep(representation_t **old_re
> }
> }
>
> + /* look for intra-revision matches (usually data reps but not limited
> + to them in case props happen to look like some data rep)
> + */
> + if (*old_rep == NULL && rep->txn_id)
> + {
> + svn_node_kind_t kind;
> + const char *file_name
> + = svn_dirent_join(path_txn_dir(fs, rep->txn_id, pool),
> + svn_checksum_to_cstring(rep->sha1_checksum, pool),
> + pool);
> +
> + /* in our txn, is there a rep file named with the wanted SHA1?
> + If so, read it and use that rep.
> + */
> + SVN_ERR(svn_io_check_path(file_name, &kind, pool));
> + if (kind == svn_node_file)
> + {
> + svn_stringbuf_t *rep_string;
> + SVN_ERR(svn_stringbuf_from_file2(&rep_string, file_name, pool));
> + SVN_ERR(read_rep_offsets_body(old_rep, rep_string->data,
> + rep->txn_id, FALSE, pool));
> + }
> + }
> +
> /* Add information that is missing in the cached data. */
> if (*old_rep)
> {
>
Received on 2012-10-13 16:18:21 CEST

This is an archived mail posted to the Subversion Dev mailing list.