You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2012/11/19 15:42:10 UTC
svn commit: r1411209 - /subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
Author: stefan2
Date: Mon Nov 19 14:42:09 2012
New Revision: 1411209
URL: http://svn.apache.org/viewvc?rev=1411209&view=rev
Log:
Refactor / cleanup the in-transaction rep sharing code.
* subversion/libsvn_fs_fs/fs_fs.c
(path_txn_sha1): new utility function
(svn_fs_fs__put_node_revision): remove sha1->rep mapping code here ...
(store_sha1_rep_mapping): ... and put it in this new function
(get_shared_rep): use new utility
(rep_write_contents_close): store sha1->rep mapping only if new
Suggested by: julianfoad
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=1411209&r1=1411208&r2=1411209&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c Mon Nov 19 14:42:09 2012
@@ -360,6 +360,18 @@ path_txn_dir(svn_fs_t *fs, const char *t
NULL);
}
+/* Return the name of the sha1->rep mapping file in transaction TXN_ID
+ * within FS for the given SHA1 checksum. Use POOL for allocations.
+ */
+static APR_INLINE const char *
+path_txn_sha1(svn_fs_t *fs, const char *txn_id, svn_checksum_t *sha1,
+ apr_pool_t *pool)
+{
+ return svn_dirent_join(path_txn_dir(fs, txn_id, pool),
+ svn_checksum_to_cstring(sha1, pool),
+ pool);
+}
+
static APR_INLINE const char *
path_txn_changes(svn_fs_t *fs, const char *txn_id, apr_pool_t *pool)
{
@@ -2613,10 +2625,6 @@ 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;
@@ -2637,13 +2645,31 @@ svn_fs_fs__put_node_revision(svn_fs_t *f
SVN_ERR(svn_io_file_close(noderev_file, pool));
+ return SVN_NO_ERROR;
+}
+
+/* For the in-transaction NODEREV within FS, write the sha1->rep mapping
+ * file in the respective transaction, if rep sharing has been enabled etc.
+ * Use POOL for temporary allocations.
+ */
+static svn_error_t *
+store_sha1_rep_mapping(svn_fs_t *fs,
+ node_revision_t *noderev,
+ apr_pool_t *pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+
/* 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)
+ if ( ffd->rep_sharing_allowed
+ && noderev->data_rep
+ && noderev->data_rep->sha1_checksum)
{
apr_file_t *rep_file;
- const char *file_name = svn_dirent_join(path_txn_dir(fs, txn_id, pool),
- sha1, pool);
+ const char *file_name = path_txn_sha1(fs,
+ svn_fs_fs__id_txn_id(noderev->id),
+ noderev->data_rep->sha1_checksum,
+ pool);
const char *rep_string = representation_string(noderev->data_rep,
ffd->format,
(noderev->kind
@@ -7301,9 +7327,7 @@ get_shared_rep(representation_t **old_re
{
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);
+ = path_txn_sha1(fs, rep->txn_id, rep->sha1_checksum, pool);
/* in our txn, is there a rep file named with the wanted SHA1?
If so, read it and use that rep.
@@ -7393,6 +7417,8 @@ rep_write_contents_close(void *baton)
/* Write out the new node-rev information. */
SVN_ERR(svn_fs_fs__put_node_revision(b->fs, b->noderev->id, b->noderev, FALSE,
b->pool));
+ if (!old_rep)
+ SVN_ERR(store_sha1_rep_mapping(b->fs, b->noderev, b->pool));
SVN_ERR(svn_io_file_close(b->file, b->pool));
SVN_ERR(unlock_proto_rev(b->fs, rep->txn_id, b->lockcookie, b->pool));