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 2013/07/19 13:47:06 UTC
svn commit: r1504849 -
/subversion/branches/fsfs-improvements/subversion/libsvn_fs_fs/cached_data.c
Author: stefan2
Date: Fri Jul 19 11:47:06 2013
New Revision: 1504849
URL: http://svn.apache.org/r1504849
Log:
On the fsfs-improvements branch: Align rev / pack file read access to
4k offset boundaries (APR file buffer size default). This will speed
up the common scenario where we navigate "backwards" through a rev file.
* subversion/libsvn_fs_fs/cached_data.c
(aligned_seek): new utility function
(open_and_seek_revision,
open_and_seek_transaction,
get_fs_id_at_offset,
get_root_changes_offset,
create_rep_state_body,
auto_read_diff_version,
read_delta_window,
read_plain_window,
get_contents,
svn_fs_fs__get_changes): use aligned seek when accessing rev files
Modified:
subversion/branches/fsfs-improvements/subversion/libsvn_fs_fs/cached_data.c
Modified: subversion/branches/fsfs-improvements/subversion/libsvn_fs_fs/cached_data.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-improvements/subversion/libsvn_fs_fs/cached_data.c?rev=1504849&r1=1504848&r2=1504849&view=diff
==============================================================================
--- subversion/branches/fsfs-improvements/subversion/libsvn_fs_fs/cached_data.c (original)
+++ subversion/branches/fsfs-improvements/subversion/libsvn_fs_fs/cached_data.c Fri Jul 19 11:47:06 2013
@@ -39,6 +39,16 @@
#include "svn_private_config.h"
+/* Convenience wrapper around svn_io_file_aligned_seek. */
+static svn_error_t *
+aligned_seek(apr_file_t *file,
+ apr_off_t offset,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(svn_io_file_aligned_seek(file, 0, NULL, offset,
+ pool));
+}
+
/* Open the revision file for revision REV in filesystem FS and store
the newly opened file in FILE. Seek to location OFFSET before
returning. Perform temporary allocations in POOL. */
@@ -63,7 +73,7 @@ open_and_seek_revision(apr_file_t **file
offset += rev_offset;
}
- SVN_ERR(svn_io_file_seek(rev_file, APR_SET, &offset, pool));
+ SVN_ERR(aligned_seek(rev_file, offset, pool));
*file = rev_file;
@@ -83,14 +93,12 @@ open_and_seek_transaction(apr_file_t **f
apr_pool_t *pool)
{
apr_file_t *rev_file;
- apr_off_t offset;
SVN_ERR(svn_io_file_open(&rev_file,
svn_fs_fs__path_txn_proto_rev(fs, txn_id, pool),
APR_READ | APR_BUFFERED, APR_OS_DEFAULT, pool));
- offset = rep->offset;
- SVN_ERR(svn_io_file_seek(rev_file, APR_SET, &offset, pool));
+ SVN_ERR(aligned_seek(rev_file, rep->offset, pool));
*file = rev_file;
@@ -273,7 +281,7 @@ get_fs_id_at_offset(svn_fs_id_t **id_p,
{
node_revision_t *noderev;
- SVN_ERR(svn_io_file_seek(rev_file, APR_SET, &offset, pool));
+ SVN_ERR(aligned_seek(rev_file, offset, pool));
SVN_ERR(svn_fs_fs__read_noderev(&noderev,
svn_stream_from_aprfile2(rev_file, TRUE,
pool),
@@ -353,8 +361,7 @@ get_root_changes_offset(apr_off_t *root_
SVN_ERR(svn_io_file_seek(rev_file, seek_relative, &offset, pool));
trailer->len = trailer->blocksize-1;
- offset -= trailer->len;
- SVN_ERR(svn_io_file_seek(rev_file, APR_SET, &offset, pool));
+ SVN_ERR(aligned_seek(rev_file, offset - trailer->len, pool));
/* Read in this last block, from which we will identify the last line. */
SVN_ERR(svn_io_file_read(rev_file, trailer->data, &trailer->len, pool));
@@ -495,7 +502,7 @@ create_rep_state_body(rep_state_t **rep_
SVN_ERR(svn_fs_fs__get_packed_offset(&offset, fs, rep->revision, pool));
offset += rep->offset;
- SVN_ERR(svn_io_file_seek((*shared_file)->file, APR_SET, &offset, pool));
+ SVN_ERR(aligned_seek((*shared_file)->file, offset, pool));
rs->file = *shared_file;
}
else
@@ -1009,7 +1016,7 @@ auto_read_diff_version(rep_state_t *rs,
if (rs->ver == -1)
{
char buf[4];
- SVN_ERR(svn_io_file_seek(rs->file->file, APR_SET, &rs->start, pool));
+ SVN_ERR(aligned_seek(rs->file->file, rs->start, pool));
SVN_ERR(svn_io_file_read_full2(rs->file->file, buf, sizeof(buf),
NULL, NULL, pool));
@@ -1044,7 +1051,7 @@ read_delta_window(svn_txdelta_window_t *
/* RS->FILE may be shared between RS instances -> make sure we point
* to the right data. */
start_offset = rs->start + rs->current;
- SVN_ERR(svn_io_file_seek(rs->file->file, APR_SET, &start_offset, pool));
+ SVN_ERR(aligned_seek(rs->file->file, start_offset, pool));
/* Skip windows to reach the current chunk if we aren't there yet. */
while (rs->chunk_index < this_chunk)
@@ -1091,7 +1098,7 @@ read_plain_window(svn_stringbuf_t **nwin
apr_off_t offset;
offset = rs->start + rs->current;
- SVN_ERR(svn_io_file_seek(rs->file->file, SEEK_SET, &offset, pool));
+ SVN_ERR(aligned_seek(rs->file->file, offset, pool));
/* Read the plain data. */
*nwin = svn_stringbuf_create_ensure(size, pool);
@@ -1246,8 +1253,7 @@ get_contents(struct rep_read_baton *rb,
copy_len = (apr_size_t) (rs->size - rs->current);
offset = rs->start + rs->current;
- SVN_ERR(svn_io_file_seek(rs->file->file, SEEK_SET, &offset,
- rb->pool));
+ SVN_ERR(aligned_seek(rs->file->file, offset, rb->pool));
SVN_ERR(svn_io_file_read_full2(rs->file->file, cur, copy_len,
NULL, NULL, rb->pool));
}
@@ -1863,7 +1869,7 @@ svn_fs_fs__get_changes(apr_array_header_
SVN_ERR(get_root_changes_offset(NULL, &changes_offset, revision_file, fs,
rev, pool));
- SVN_ERR(svn_io_file_seek(revision_file, APR_SET, &changes_offset, pool));
+ SVN_ERR(aligned_seek(revision_file, changes_offset, pool));
SVN_ERR(svn_fs_fs__read_changes(changes,
svn_stream_from_aprfile2(revision_file, TRUE, pool),
pool));