[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.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.