You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ph...@apache.org on 2012/07/20 12:06:41 UTC
svn commit: r1363705 - /subversion/trunk/subversion/libsvn_fs_base/lock.c
Author: philip
Date: Fri Jul 20 10:06:41 2012
New Revision: 1363705
URL: http://svn.apache.org/viewvc?rev=1363705&view=rev
Log:
Use a spillbuf stream in BDB get_locks so that a temporary spool
file is only opened if there are lots of locks.
* subversion/libsvn_fs_base/lock.c
(spool_locks_info): Write to a stream instead of a file.
(struct locks_get_args): Change file to stream.
(txn_body_get_locks): Pass stream.
(svn_fs_base__get_locks): Create a spillbuf stream instead of opening
a file.
Modified:
subversion/trunk/subversion/libsvn_fs_base/lock.c
Modified: subversion/trunk/subversion/libsvn_fs_base/lock.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_base/lock.c?rev=1363705&r1=1363704&r2=1363705&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_base/lock.c (original)
+++ subversion/trunk/subversion/libsvn_fs_base/lock.c Fri Jul 20 10:06:41 2012
@@ -36,6 +36,7 @@
#include "util/fs_skels.h"
#include "../libsvn_fs/fs-loader.h"
#include "private/svn_fs_util.h"
+#include "private/svn_subr_private.h"
/* Add LOCK and its associated LOCK_TOKEN (associated with PATH) as
@@ -394,9 +395,9 @@ svn_fs_base__get_lock(svn_lock_t **lock,
}
/* Implements `svn_fs_get_locks_callback_t', spooling lock information
- to disk as the filesystem provides it. BATON is an 'apr_file_t *'
- object pointing to open, writable spool file. We'll write the
- spool file with a format like so:
+ to a stream as the filesystem provides it. BATON is an 'svn_stream_t *'
+ object pointing to the stream. We'll write the spool stream with a
+ format like so:
SKEL1_LEN "\n" SKEL1 "\n" SKEL2_LEN "\n" SKEL2 "\n" ...
@@ -408,18 +409,20 @@ spool_locks_info(void *baton,
apr_pool_t *pool)
{
svn_skel_t *lock_skel;
- apr_file_t *spool_file = (apr_file_t *)baton;
+ svn_stream_t *stream = baton;
const char *skel_len;
svn_stringbuf_t *skel_buf;
+ apr_size_t len;
SVN_ERR(svn_fs_base__unparse_lock_skel(&lock_skel, lock, pool));
skel_buf = svn_skel__unparse(lock_skel, pool);
skel_len = apr_psprintf(pool, "%" APR_SIZE_T_FMT "\n", skel_buf->len);
- SVN_ERR(svn_io_file_write_full(spool_file, skel_len, strlen(skel_len),
- NULL, pool));
- SVN_ERR(svn_io_file_write_full(spool_file, skel_buf->data,
- skel_buf->len, NULL, pool));
- return svn_io_file_write_full(spool_file, "\n", 1, NULL, pool);
+ len = strlen(skel_len);
+ SVN_ERR(svn_stream_write(stream, skel_len, &len));
+ len = skel_buf->len;
+ SVN_ERR(svn_stream_write(stream, skel_buf->data, &len));
+ len = 1;
+ return svn_stream_write(stream, "\n", &len);
}
@@ -427,7 +430,7 @@ struct locks_get_args
{
const char *path;
svn_depth_t depth;
- apr_file_t *spool_file;
+ svn_stream_t *stream;
};
@@ -436,7 +439,7 @@ txn_body_get_locks(void *baton, trail_t
{
struct locks_get_args *args = baton;
return svn_fs_bdb__locks_get(trail->fs, args->path, args->depth,
- spool_locks_info, args->spool_file,
+ spool_locks_info, args->stream,
trail, trail->pool);
}
@@ -450,7 +453,6 @@ svn_fs_base__get_locks(svn_fs_t *fs,
apr_pool_t *pool)
{
struct locks_get_args args;
- apr_off_t offset = 0;
svn_stream_t *stream;
svn_stringbuf_t *buf;
svn_boolean_t eof;
@@ -460,14 +462,14 @@ svn_fs_base__get_locks(svn_fs_t *fs,
args.path = svn_fs__canonicalize_abspath(path, pool);
args.depth = depth;
- SVN_ERR(svn_io_open_unique_file3(&(args.spool_file), NULL, NULL,
- svn_io_file_del_on_close,
- pool, iterpool));
+ /* Enough for 100+ locks if the comments are small. */
+ args.stream = svn_stream__from_spillbuf(4 * 1024 /* blocksize */,
+ 64 * 1024 /* maxsize */,
+ pool);
SVN_ERR(svn_fs_base__retry_txn(fs, txn_body_get_locks, &args, FALSE, pool));
- /* Rewind the spool file, then re-read it, calling GET_LOCKS_FUNC(). */
- SVN_ERR(svn_io_file_seek(args.spool_file, APR_SET, &offset, pool));
- stream = svn_stream_from_aprfile2(args.spool_file, FALSE, pool);
+ /* Read the stream calling GET_LOCKS_FUNC(). */
+ stream = args.stream;
while (1)
{