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 2015/10/11 16:02:34 UTC

svn commit: r1707986 - in /subversion/trunk/subversion: libsvn_fs/ libsvn_fs_base/ libsvn_fs_fs/ libsvn_fs_x/

Author: stefan2
Date: Sun Oct 11 14:02:34 2015
New Revision: 1707986

URL: http://svn.apache.org/viewvc?rev=1707986&view=rev
Log:
Bump the FS vtable declarations for revprop access but keep the current
general behavior.

This is the first in a series of patches that will allow FS API users
to efficiently access multiple revprops during the same report.  Implement
the new functionality as no-op and ignore, respectively.

* subversion/libsvn_fs/fs-loader.h
  (fs_vtable_t): Anticipate the upcoming FS API change. Introduce the
                 new refresh_revprops method and bump revision_prop
                 as well as revision_proplist.  Those use the 2-pool
                 paradigm now and add a REFRESH option.

* subversion/libsvn_fs/fs-loader.c
  (svn_fs_revision_prop,
   svn_fs_revision_proplist): Adapt the old API to the new vtable.
                              refresh_revprops is not being used atm. 

* subversion/libsvn_fs_base/fs.c
  (base_bdb_refresh_revision): New no-op API implementation.
  (fs_vtable): Update vtable.

* subversion/libsvn_fs_base/revs-txns.h
  (svn_fs_base__revision_proplist,
   svn_fs_base__revision_prop): Follow vtable change.

* subversion/libsvn_fs_base/revs-txns.c
  (svn_fs_base__revision_proplist,
   svn_fs_base__revision_prop): Ditto. Always implicitly "refresh".

* subversion/libsvn_fs_x/fs.c
  (x_refresh_revprops): New no-op API implementation.
  (x_revision_prop,
   x_revision_proplist): Follow vtable change. Always implicitly "refresh".
                         We no longer need to create a local SCRATCH_POOL.
  (fs_vtable): Update vtable.

* subversion/libsvn_fs_fs/fs.c
  (fs_refresh_revprops): New no-op API implementation.
  (fs_vtable): Update vtable.

* subversion/libsvn_fs_fs/revprops.h
  (svn_fs_fs__get_revision_proplist): Follow vtable change.

* subversion/libsvn_fs_fs/revprops.c
  (svn_fs_fs__get_revision_proplist): Same. Always implicitly "refresh".
                                      Use the pools appropriately.

* subversion/libsvn_fs_fs/fs_fs.h
  (svn_fs_fs__revision_prop): Follow vtable change.

* subversion/libsvn_fs_fs/fs_fs.c
  (svn_fs_fs__revision_prop): Same. Only allocate the result in the
                              RESULT_POOL.
  (change_rev_prop_body): Update caller to always "refresh".

* subversion/libsvn_fs_fs/verify.c
  (verify_revprops): Same.

Modified:
    subversion/trunk/subversion/libsvn_fs/fs-loader.c
    subversion/trunk/subversion/libsvn_fs/fs-loader.h
    subversion/trunk/subversion/libsvn_fs_base/fs.c
    subversion/trunk/subversion/libsvn_fs_base/revs-txns.c
    subversion/trunk/subversion/libsvn_fs_base/revs-txns.h
    subversion/trunk/subversion/libsvn_fs_fs/fs.c
    subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
    subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h
    subversion/trunk/subversion/libsvn_fs_fs/revprops.c
    subversion/trunk/subversion/libsvn_fs_fs/revprops.h
    subversion/trunk/subversion/libsvn_fs_fs/verify.c
    subversion/trunk/subversion/libsvn_fs_x/fs.c

Modified: subversion/trunk/subversion/libsvn_fs/fs-loader.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs/fs-loader.c?rev=1707986&r1=1707985&r2=1707986&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs/fs-loader.c (original)
+++ subversion/trunk/subversion/libsvn_fs/fs-loader.c Sun Oct 11 14:02:34 2015
@@ -1557,7 +1557,8 @@ svn_fs_revision_prop(svn_string_t **valu
                      const char *propname, apr_pool_t *pool)
 {
   return svn_error_trace(fs->vtable->revision_prop(value_p, fs, rev,
-                                                   propname, pool));
+                                                   propname, TRUE,
+                                                   pool, pool));
 }
 
 svn_error_t *
@@ -1565,7 +1566,7 @@ svn_fs_revision_proplist(apr_hash_t **ta
                          apr_pool_t *pool)
 {
   return svn_error_trace(fs->vtable->revision_proplist(table_p, fs, rev,
-                                                       pool));
+                                                       TRUE, pool, pool));
 }
 
 svn_error_t *

Modified: subversion/trunk/subversion/libsvn_fs/fs-loader.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs/fs-loader.h?rev=1707986&r1=1707985&r2=1707986&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs/fs-loader.h (original)
+++ subversion/trunk/subversion/libsvn_fs/fs-loader.h Sun Oct 11 14:02:34 2015
@@ -196,11 +196,17 @@ typedef struct fs_vtable_t
 {
   svn_error_t *(*youngest_rev)(svn_revnum_t *youngest_p, svn_fs_t *fs,
                                apr_pool_t *pool);
+  svn_error_t *(*refresh_revprops)(svn_fs_t *fs, apr_pool_t *scratch_pool);
   svn_error_t *(*revision_prop)(svn_string_t **value_p, svn_fs_t *fs,
                                 svn_revnum_t rev, const char *propname,
-                                apr_pool_t *pool);
+                                svn_boolean_t refresh,
+                                apr_pool_t *result_pool, 
+                                apr_pool_t *scratch_pool);
   svn_error_t *(*revision_proplist)(apr_hash_t **table_p, svn_fs_t *fs,
-                                    svn_revnum_t rev, apr_pool_t *pool);
+                                    svn_revnum_t rev,
+                                    svn_boolean_t refresh,
+                                    apr_pool_t *result_pool, 
+                                    apr_pool_t *scratch_pool);
   svn_error_t *(*change_rev_prop)(svn_fs_t *fs, svn_revnum_t rev,
                                   const char *name,
                                   const svn_string_t *const *old_value_p,

Modified: subversion/trunk/subversion/libsvn_fs_base/fs.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/fs.c?rev=1707986&r1=1707985&r2=1707986&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_base/fs.c Sun Oct 11 14:02:34 2015
@@ -471,6 +471,13 @@ bdb_write_config(svn_fs_t *fs)
 }
 
 static svn_error_t *
+base_bdb_refresh_revision(svn_fs_t *fs,
+                          apr_pool_t *scratch_pool)
+{
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
 base_bdb_info_format(int *fs_format,
                      svn_version_t **supports_version,
                      svn_fs_t *fs,
@@ -545,6 +552,7 @@ base_bdb_freeze(svn_fs_t *fs,
 
 static fs_vtable_t fs_vtable = {
   svn_fs_base__youngest_rev,
+  base_bdb_refresh_revision,
   svn_fs_base__revision_prop,
   svn_fs_base__revision_proplist,
   svn_fs_base__change_rev_prop,

Modified: subversion/trunk/subversion/libsvn_fs_base/revs-txns.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/revs-txns.c?rev=1707986&r1=1707985&r2=1707986&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/revs-txns.c (original)
+++ subversion/trunk/subversion/libsvn_fs_base/revs-txns.c Sun Oct 11 14:02:34 2015
@@ -194,7 +194,9 @@ svn_error_t *
 svn_fs_base__revision_proplist(apr_hash_t **table_p,
                                svn_fs_t *fs,
                                svn_revnum_t rev,
-                               apr_pool_t *pool)
+                               svn_boolean_t refresh,
+                               apr_pool_t *result_pool,
+                               apr_pool_t *scratch_pool)
 {
   struct revision_proplist_args args;
   apr_hash_t *table;
@@ -204,9 +206,9 @@ svn_fs_base__revision_proplist(apr_hash_
   args.table_p = &table;
   args.rev = rev;
   SVN_ERR(svn_fs_base__retry_txn(fs, txn_body_revision_proplist, &args,
-                                 FALSE, pool));
+                                 FALSE, result_pool));
 
-  *table_p = table ? table : apr_hash_make(pool);
+  *table_p = table ? table : apr_hash_make(result_pool);
   return SVN_NO_ERROR;
 }
 
@@ -216,7 +218,9 @@ svn_fs_base__revision_prop(svn_string_t
                            svn_fs_t *fs,
                            svn_revnum_t rev,
                            const char *propname,
-                           apr_pool_t *pool)
+                           svn_boolean_t refresh,
+                           apr_pool_t *result_pool,
+                           apr_pool_t *scratch_pool)
 {
   struct revision_proplist_args args;
   apr_hash_t *table;
@@ -227,7 +231,7 @@ svn_fs_base__revision_prop(svn_string_t
   args.table_p = &table;
   args.rev = rev;
   SVN_ERR(svn_fs_base__retry_txn(fs, txn_body_revision_proplist, &args,
-                                 FALSE, pool));
+                                 FALSE, result_pool));
 
   /* And then the prop from that list (if there was a list). */
   *value_p = svn_hash_gets(table, propname);

Modified: subversion/trunk/subversion/libsvn_fs_base/revs-txns.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/revs-txns.h?rev=1707986&r1=1707985&r2=1707986&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/revs-txns.h (original)
+++ subversion/trunk/subversion/libsvn_fs_base/revs-txns.h Sun Oct 11 14:02:34 2015
@@ -172,12 +172,16 @@ svn_error_t *svn_fs_base__youngest_rev(s
 svn_error_t *svn_fs_base__revision_prop(svn_string_t **value_p, svn_fs_t *fs,
                                         svn_revnum_t rev,
                                         const char *propname,
-                                        apr_pool_t *pool);
+                                        svn_boolean_t refresh,
+                                        apr_pool_t *result_pool,
+                                        apr_pool_t *scratch_pool);
 
 svn_error_t *svn_fs_base__revision_proplist(apr_hash_t **table_p,
                                             svn_fs_t *fs,
                                             svn_revnum_t rev,
-                                            apr_pool_t *pool);
+                                            svn_boolean_t refresh,
+                                            apr_pool_t *result_pool,
+                                            apr_pool_t *scratch_pool);
 
 svn_error_t *svn_fs_base__change_rev_prop(svn_fs_t *fs, svn_revnum_t rev,
                                           const char *name,

Modified: subversion/trunk/subversion/libsvn_fs_fs/fs.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs.c?rev=1707986&r1=1707985&r2=1707986&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs.c Sun Oct 11 14:02:34 2015
@@ -148,6 +148,13 @@ svn_fs_fs__initialize_shared_data(svn_fs
 
 
 
+static svn_error_t *
+fs_refresh_revprops(svn_fs_t *fs,
+                    apr_pool_t *scratch_pool)
+{
+  return SVN_NO_ERROR;
+}
+
 /* This function is provided for Subversion 1.0.x compatibility.  It
    has no effect for fsfs backed Subversion filesystems.  It conforms
    to the fs_library_vtable_t.bdb_set_errcall() API. */
@@ -249,6 +256,7 @@ fs_set_uuid(svn_fs_t *fs,
 /* The vtable associated with a specific open filesystem. */
 static fs_vtable_t fs_vtable = {
   svn_fs_fs__youngest_rev,
+  fs_refresh_revprops,
   svn_fs_fs__revision_prop,
   svn_fs_fs__get_revision_proplist,
   svn_fs_fs__change_rev_prop,

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=1707986&r1=1707985&r2=1707986&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c Sun Oct 11 14:02:34 2015
@@ -2058,14 +2058,17 @@ svn_fs_fs__revision_prop(svn_string_t **
                          svn_fs_t *fs,
                          svn_revnum_t rev,
                          const char *propname,
-                         apr_pool_t *pool)
+                         svn_boolean_t refresh,
+                         apr_pool_t *result_pool,
+                         apr_pool_t *scratch_pool)
 {
   apr_hash_t *table;
 
   SVN_ERR(svn_fs__check_fs(fs, TRUE));
-  SVN_ERR(svn_fs_fs__get_revision_proplist(&table, fs, rev, pool));
+  SVN_ERR(svn_fs_fs__get_revision_proplist(&table, fs, rev, refresh,
+                                           scratch_pool, scratch_pool));
 
-  *value_p = svn_hash_gets(table, propname);
+  *value_p = svn_string_dup(svn_hash_gets(table, propname), result_pool);
 
   return SVN_NO_ERROR;
 }
@@ -2090,7 +2093,8 @@ change_rev_prop_body(void *baton, apr_po
   apr_hash_t *table;
   const svn_string_t *present_value;
 
-  SVN_ERR(svn_fs_fs__get_revision_proplist(&table, cb->fs, cb->rev, pool));
+  SVN_ERR(svn_fs_fs__get_revision_proplist(&table, cb->fs, cb->rev, TRUE,
+                                           pool, pool));
   present_value = svn_hash_gets(table, cb->name);
 
   if (cb->old_value_p)

Modified: subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h?rev=1707986&r1=1707985&r2=1707986&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.h Sun Oct 11 14:02:34 2015
@@ -224,13 +224,16 @@ svn_fs_fs__with_all_locks(svn_fs_t *fs,
                           void *baton,
                           apr_pool_t *pool);
 
-/* Find the value of the property named PROPNAME in transaction TXN.
+/* Find the value of the property named PROPNAME in revision REV.
    Return the contents in *VALUE_P.  The contents will be allocated
-   from POOL. */
+   from RESULT_POOL and SCRATCH_POOL is used for temporaries.
+   Invalidate any revprop cache is REFRESH is set. */
 svn_error_t *svn_fs_fs__revision_prop(svn_string_t **value_p, svn_fs_t *fs,
                                       svn_revnum_t rev,
                                       const char *propname,
-                                      apr_pool_t *pool);
+                                      svn_boolean_t refresh,
+                                      apr_pool_t *result_pool,
+                                      apr_pool_t *scratch_pool);
 
 /* Change, add, or delete a property on a revision REV in filesystem
    FS.  NAME gives the name of the property, and value, if non-NULL,

Modified: subversion/trunk/subversion/libsvn_fs_fs/revprops.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/revprops.c?rev=1707986&r1=1707985&r2=1707986&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/revprops.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/revprops.c Sun Oct 11 14:02:34 2015
@@ -587,7 +587,9 @@ svn_error_t *
 svn_fs_fs__get_revision_proplist(apr_hash_t **proplist_p,
                                  svn_fs_t *fs,
                                  svn_revnum_t rev,
-                                 apr_pool_t *pool)
+                                 svn_boolean_t refresh,
+                                 apr_pool_t *result_pool,
+                                 apr_pool_t *scratch_pool)
 {
   fs_fs_data_t *ffd = fs->fsap_data;
 
@@ -595,7 +597,7 @@ svn_fs_fs__get_revision_proplist(apr_has
   *proplist_p = NULL;
 
   /* should they be available at all? */
-  SVN_ERR(svn_fs_fs__ensure_revision_exists(rev, fs, pool));
+  SVN_ERR(svn_fs_fs__ensure_revision_exists(rev, fs, scratch_pool));
 
   /* if REV had not been packed when we began, try reading it from the
    * non-packed shard.  If that fails, we will fall through to packed
@@ -603,7 +605,7 @@ svn_fs_fs__get_revision_proplist(apr_has
   if (!svn_fs_fs__is_packed_revprop(fs, rev))
     {
       svn_error_t *err = read_non_packed_revprop(proplist_p, fs, rev,
-                                                 pool);
+                                                 result_pool);
       if (err)
         {
           if (!APR_STATUS_IS_ENOENT(err->apr_err)
@@ -621,7 +623,8 @@ svn_fs_fs__get_revision_proplist(apr_has
   if (ffd->format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT && !*proplist_p)
     {
       packed_revprops_t *revprops;
-      SVN_ERR(read_pack_revprop(&revprops, fs, rev, FALSE, pool));
+      SVN_ERR(read_pack_revprop(&revprops, fs, rev, FALSE,
+                                result_pool));
       *proplist_p = revprops->properties;
     }
 

Modified: subversion/trunk/subversion/libsvn_fs_fs/revprops.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/revprops.h?rev=1707986&r1=1707985&r2=1707986&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/revprops.h (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/revprops.h Sun Oct 11 14:02:34 2015
@@ -59,14 +59,18 @@ svn_fs_fs__upgrade_cleanup_pack_revprops
                                          apr_pool_t *scratch_pool);
 
 /* Read the revprops for revision REV in FS and return them in *PROPERTIES_P.
+ * If REFRESH is set, clear the revprop cache before accessing the data.
  *
- * Allocations will be done in POOL.
+ * The result will be allocated in RESULT_POOL; SCRATCH_POOL is used for
+ * temporaries.
  */
 svn_error_t *
 svn_fs_fs__get_revision_proplist(apr_hash_t **proplist_p,
                                  svn_fs_t *fs,
                                  svn_revnum_t rev,
-                                 apr_pool_t *pool);
+                                 svn_boolean_t refresh,
+                                 apr_pool_t *result_pool,
+                                 apr_pool_t *scratch_pool);
 
 /* Set the revision property list of revision REV in filesystem FS to
    PROPLIST.  Use POOL for temporary allocations. */

Modified: subversion/trunk/subversion/libsvn_fs_fs/verify.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/verify.c?rev=1707986&r1=1707985&r2=1707986&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/verify.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/verify.c Sun Oct 11 14:02:34 2015
@@ -731,7 +731,8 @@ verify_revprops(svn_fs_t *fs,
       /* Access the svn:date revprop.
        * This implies parsing all revprops for that revision. */
       SVN_ERR(svn_fs_fs__revision_prop(&date, fs, revision,
-                                       SVN_PROP_REVISION_DATE, iterpool));
+                                       SVN_PROP_REVISION_DATE, TRUE,
+                                       iterpool, iterpool));
 
       /* The time stamp is the only revprop that, if given, needs to
        * have a valid content. */

Modified: subversion/trunk/subversion/libsvn_fs_x/fs.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/fs.c?rev=1707986&r1=1707985&r2=1707986&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_x/fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_x/fs.c Sun Oct 11 14:02:34 2015
@@ -218,6 +218,13 @@ x_info(const void **fsx_info,
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+x_refresh_revprops(svn_fs_t *fs,
+                   apr_pool_t *scratch_pool)
+{
+  return SVN_NO_ERROR;
+}
+
 /* Wrapper around svn_fs_x__revision_prop() adapting between function
    signatures. */
 static svn_error_t *
@@ -225,12 +232,12 @@ x_revision_prop(svn_string_t **value_p,
                 svn_fs_t *fs,
                 svn_revnum_t rev,
                 const char *propname,
-                apr_pool_t *pool)
+                svn_boolean_t refresh,
+                apr_pool_t *result_pool,
+                apr_pool_t *scratch_pool)
 {
-  apr_pool_t *scratch_pool = svn_pool_create(pool);
-  SVN_ERR(svn_fs_x__revision_prop(value_p, fs, rev, propname, pool,
+  SVN_ERR(svn_fs_x__revision_prop(value_p, fs, rev, propname, result_pool,
                                   scratch_pool));
-  svn_pool_destroy(scratch_pool);
 
   return SVN_NO_ERROR;
 }
@@ -241,14 +248,13 @@ static svn_error_t *
 x_revision_proplist(apr_hash_t **proplist_p,
                     svn_fs_t *fs,
                     svn_revnum_t rev,
-                    apr_pool_t *pool)
+                    svn_boolean_t refresh,
+                    apr_pool_t *result_pool,
+                    apr_pool_t *scratch_pool)
 {
-  apr_pool_t *scratch_pool = svn_pool_create(pool);
-
   /* No need to bypass the caches for r/o access to revprops. */
   SVN_ERR(svn_fs_x__get_revision_proplist(proplist_p, fs, rev, FALSE,
-                                          pool, scratch_pool));
-  svn_pool_destroy(scratch_pool);
+                                          result_pool, scratch_pool));
 
   return SVN_NO_ERROR;
 }
@@ -285,6 +291,7 @@ x_begin_txn(svn_fs_txn_t **txn_p,
 /* The vtable associated with a specific open filesystem. */
 static fs_vtable_t fs_vtable = {
   svn_fs_x__youngest_rev,
+  x_refresh_revprops,
   x_revision_prop,
   x_revision_proplist,
   svn_fs_x__change_rev_prop,