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)
     {