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 *