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 2016/01/18 09:03:36 UTC

svn commit: r1725179 - in /subversion/trunk/subversion/libsvn_fs_fs: caching.c temp_serializer.c temp_serializer.h

Author: stefan2
Date: Mon Jan 18 08:03:36 2016
New Revision: 1725179

URL: http://svn.apache.org/viewvc?rev=1725179&view=rev
Log:
Reduce memory footprint of cached directories in FSFS revisions.

For efficient modification within a transaction, we over-provide cache
memory.  So, we can add entries in constant time instead of running a
complete de-serialization / modification / serialization cycle.  This
space overhead is not useful for immutable, committed data.  Therefore,
make it txn-only.  The serialization format etc. does not change.

* subversion/libsvn_fs_fs/temp_serializer.h
  (svn_fs_fs__serialize_txndir_entries): Declare specific serializer
                                         for in-txn directories.

* subversion/libsvn_fs_fs/temp_serializer.c
  (return_serialized_dir_context): Make over-provisioning optional.
  (svn_fs_fs__serialize_dir_entries): Don't over-provide anymore.
  (svn_fs_fs__serialize_txndir_entries): Implement using over-provision.
  (svn_fs_fs__replace_dir_entry): Always over-provide b/c this is in-txn
                                  data.

* subversion/libsvn_fs_fs/caching.c
  (svn_fs_fs__initialize_txn_caches): Use the specific dir serializers.

Modified:
    subversion/trunk/subversion/libsvn_fs_fs/caching.c
    subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c
    subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.h

Modified: subversion/trunk/subversion/libsvn_fs_fs/caching.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/caching.c?rev=1725179&r1=1725178&r2=1725179&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/caching.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/caching.c Mon Jan 18 08:03:36 2016
@@ -875,7 +875,7 @@ svn_fs_fs__initialize_txn_caches(svn_fs_
                        NULL,
                        svn_cache__get_global_membuffer_cache(),
                        1024, 8,
-                       svn_fs_fs__serialize_dir_entries,
+                       svn_fs_fs__serialize_txndir_entries,
                        svn_fs_fs__deserialize_dir_entries,
                        APR_HASH_KEY_STRING,
                        prefix,

Modified: subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c?rev=1725179&r1=1725178&r2=1725179&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c Mon Jan 18 08:03:36 2016
@@ -788,16 +788,18 @@ svn_fs_fs__deserialize_node_revision(voi
 }
 
 /* Utility function that returns the directory serialized inside CONTEXT
- * to DATA and DATA_LEN. */
+ * to DATA and DATA_LEN.  If OVERPROVISION is set, allocate some extra
+ * room for future in-place changes by svn_fs_fs__replace_dir_entry. */
 static svn_error_t *
 return_serialized_dir_context(svn_temp_serializer__context_t *context,
                               void **data,
-                              apr_size_t *data_len)
+                              apr_size_t *data_len,
+                              svn_boolean_t overprovision)
 {
   svn_stringbuf_t *serialized = svn_temp_serializer__get(context);
 
   *data = serialized->data;
-  *data_len = serialized->blocksize;
+  *data_len = overprovision ? serialized->blocksize : serialized->len;
   ((dir_data_t *)serialized->data)->len = serialized->len;
 
   return SVN_NO_ERROR;
@@ -815,7 +817,24 @@ svn_fs_fs__serialize_dir_entries(void **
    * and return the serialized data */
   return return_serialized_dir_context(serialize_dir(dir, pool),
                                        data,
-                                       data_len);
+                                       data_len,
+                                       FALSE);
+}
+
+svn_error_t *
+svn_fs_fs__serialize_txndir_entries(void **data,
+                                    apr_size_t *data_len,
+                                    void *in,
+                                    apr_pool_t *pool)
+{
+  svn_fs_fs__dir_data_t *dir = in;
+
+  /* serialize the dir content into a new serialization context
+   * and return the serialized data */
+  return return_serialized_dir_context(serialize_dir(dir, pool),
+                                       data,
+                                       data_len,
+                                       TRUE);
 }
 
 svn_error_t *
@@ -1097,9 +1116,7 @@ svn_fs_fs__replace_dir_entry(void **data
   serialize_dir_entry(context, &entries[pos], &length);
 
   /* return the updated serialized data */
-  SVN_ERR (return_serialized_dir_context(context,
-                                         data,
-                                         data_len));
+  SVN_ERR(return_serialized_dir_context(context, data, data_len, TRUE));
 
   /* since the previous call may have re-allocated the buffer, the lengths
    * pointer may no longer point to the entry in that buffer. Therefore,

Modified: subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.h?rev=1725179&r1=1725178&r2=1725179&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.h (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.h Mon Jan 18 08:03:36 2016
@@ -221,6 +221,16 @@ svn_fs_fs__serialize_dir_entries(void **
                                  apr_pool_t *pool);
 
 /**
+ * Same as svn_fs_fs__serialize_dir_entries but allocates extra room for
+ * in-place modification.
+ */
+svn_error_t *
+svn_fs_fs__serialize_txndir_entries(void **data,
+                                    apr_size_t *data_len,
+                                    void *in,
+                                    apr_pool_t *pool);
+
+/**
  * Implements #svn_cache__deserialize_func_t for a #svn_fs_fs__dir_data_t
  */
 svn_error_t *