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/02/11 08:30:19 UTC
svn commit: r1444669 -
/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/index.c
Author: stefan2
Date: Mon Feb 11 07:30:19 2013
New Revision: 1444669
URL: http://svn.apache.org/r1444669
Log:
On the fsfs-format7 branch: access index files in FFD->BLOCK_SIZE.
* subversion/libsvn_fs_fs/index.c
(packed_number_stream_t): store block size as needed for aligned seeks
(packed_stream_read): update; improve error message
(packed_stream_open): add block size parameter
(get_l2p_header,
get_l2p_page,
get_p2l_header,
get_p2l_page): update callers
Modified:
subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/index.c
Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/index.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/index.c?rev=1444669&r1=1444668&r2=1444669&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/index.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/index.c Mon Feb 11 07:30:19 2013
@@ -160,6 +160,9 @@ typedef struct packed_number_stream_t
/* offset in FILE from which the next number has to be read */
apr_off_t next_offset;
+ /* read the file in chunks of this size */
+ apr_size_t block_size;
+
/* pool to be used for file ops etc. */
apr_pool_t *pool;
@@ -190,8 +193,8 @@ packed_stream_read(packed_number_stream_
* i.e. the last number has been incomplete (and not buffered in stream)
* and need to be re-read. Therefore, always correct the file pointer.
*/
- SVN_ERR(svn_io_file_seek(stream->file, SEEK_SET, &stream->next_offset,
- stream->pool));
+ SVN_ERR(svn_io_file_aligned_seek(stream->file, stream->block_size, NULL,
+ stream->next_offset, stream->pool));
SVN_ERR(svn_io_file_read_full2(stream->file, buffer, sizeof(buffer),
&read, &eof, stream->pool));
@@ -204,11 +207,13 @@ packed_stream_read(packed_number_stream_
if SVN__PREDICT_FALSE(read == 0)
{
const char *file_name;
+ apr_off_t offset = 0;
SVN_ERR(svn_io_file_name_get(&file_name, stream->file,
stream->pool));
+ SVN_ERR(svn_io_file_seek(stream->file, SEEK_CUR, &offset, stream->pool));
return svn_error_createf(SVN_ERR_FS_ITEM_INDEX_CORRUPTION, NULL,
- _("Unexpected end of index file %s"),
- file_name);
+ _("Unexpected end of index file %s at offset %lx"),
+ file_name, offset);
}
/* parse file buffer and expand into stream buffer */
@@ -257,11 +262,13 @@ packed_stream_read(packed_number_stream_
};
/* Create and open a packed number stream reading from FILE_NAME and
- * return it in *STREAM. Use POOL for allocations.
+ * return it in *STREAM. Access the file in chunks of BLOCK_SIZE bytes.
+ * Use POOL for allocations.
*/
static svn_error_t *
packed_stream_open(packed_number_stream_t **stream,
const char *file_name,
+ apr_size_t block_size,
apr_pool_t *pool)
{
packed_number_stream_t *result = apr_palloc(pool, sizeof(*result));
@@ -270,11 +277,13 @@ packed_stream_open(packed_number_stream_
SVN_ERR(svn_io_file_open(&result->file, file_name,
APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
result->pool));
+ SVN_ERR(svn_io_file_aligned_seek(result->file, block_size, NULL, 0, pool));
result->used = 0;
result->current = 0;
result->start_offset = 0;
result->next_offset = 0;
+ result->block_size = block_size;
*stream = result;
@@ -606,6 +615,7 @@ get_l2p_header(l2p_header_t **header,
svn_revnum_t revision,
apr_pool_t *pool)
{
+ fs_fs_data_t *ffd = fs->fsap_data;
apr_uint64_t value;
int i;
apr_size_t page, page_count;
@@ -615,7 +625,7 @@ get_l2p_header(l2p_header_t **header,
if (*stream == NULL)
SVN_ERR(packed_stream_open(stream, path_l2p_index(fs, revision, pool),
- pool));
+ ffd->block_size, pool));
/* read the table sizes */
SVN_ERR(packed_stream_get(&value, *stream));
@@ -679,6 +689,7 @@ get_l2p_page(l2p_page_t **page,
l2p_page_table_entry_t *table_entry,
apr_pool_t *pool)
{
+ fs_fs_data_t *ffd = fs->fsap_data;
apr_uint64_t value;
apr_uint32_t i;
l2p_page_t *result = apr_pcalloc(pool, sizeof(*result));
@@ -687,6 +698,7 @@ get_l2p_page(l2p_page_t **page,
if (*stream == NULL)
SVN_ERR(packed_stream_open(stream,
path_l2p_index(fs, start_revision, pool),
+ ffd->block_size,
pool));
packed_stream_seek(*stream, table_entry->offset);
@@ -1061,6 +1073,7 @@ get_p2l_header(p2l_header_t **header,
svn_revnum_t revision,
apr_pool_t *pool)
{
+ fs_fs_data_t *ffd = fs->fsap_data;
apr_uint64_t value;
apr_size_t i;
apr_off_t offset;
@@ -1069,7 +1082,7 @@ get_p2l_header(p2l_header_t **header,
/* open index file */
if (*stream == NULL)
SVN_ERR(packed_stream_open(stream, path_p2l_index(fs, revision, pool),
- pool));
+ ffd->block_size, pool));
/* read table sizes and allocate page array */
SVN_ERR(packed_stream_get(&value, *stream));
@@ -1147,6 +1160,7 @@ get_p2l_page(apr_array_header_t **entrie
apr_uint64_t page_size,
apr_pool_t *pool)
{
+ fs_fs_data_t *ffd = fs->fsap_data;
apr_uint64_t value;
apr_array_header_t *result
= apr_array_make(pool, 16, sizeof(svn_fs_fs__p2l_entry_t));
@@ -1157,7 +1171,7 @@ get_p2l_page(apr_array_header_t **entrie
if (*stream == NULL)
SVN_ERR(packed_stream_open(stream,
path_p2l_index(fs, start_revision, pool),
- pool));
+ ffd->block_size, pool));
packed_stream_seek(*stream, start_offset);
/* read rev file offset of the first page entry (all page entries will