Author: stsp
Date: Thu May 7 09:22:50 2015
New Revision: 1678149
URL: http://svn.apache.org/r1678149
Log:
Provide more detailed error messages when FSFS fails to parse a hash.
These error conditions used to return generic hash parsing failure
messages which makes it hard to see what's going on.
* subversion/libsvn_fs_fs/cached_data.c
(svn_fs_fs__get_proplist): Wrap errors returned by svn_hash_read2().
Show parsed file name and/or node-revision id if applicable.
* subversion/libsvn_fs_fs/fs_fs.c
(get_node_origins_from_file): Likewise.
* subversion/libsvn_fs_fs/recovery.c
(recover_find_max_ids): Likewise.
* subversion/libsvn_fs_fs/transaction.c
(get_txn_proplist): Likewise.
Modified:
subversion/trunk/subversion/libsvn_fs_fs/cached_data.c
subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
subversion/trunk/subversion/libsvn_fs_fs/recovery.c
subversion/trunk/subversion/libsvn_fs_fs/transaction.c
Modified: subversion/trunk/subversion/libsvn_fs_fs/cached_data.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/cached_data.c?rev=1678149&r1=1678148&r2=1678149&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/cached_data.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/cached_data.c Thu May 7 09:22:50
2015
@@ -2724,16 +2724,27 @@ svn_fs_fs__get_proplist(apr_hash_t **pro
if (noderev->prop_rep && svn_fs_fs__id_txn_used(&noderev->prop_rep->txn_id))
{
+ svn_error_t *err;
const char *filename
= svn_fs_fs__path_txn_node_props(fs, noderev->id, pool);
proplist = apr_hash_make(pool);
SVN_ERR(svn_stream_open_readonly(&stream, filename, pool, pool));
- SVN_ERR(svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool));
+ err = svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool);
+ if (err)
+ {
+ svn_string_t *id_str = svn_fs_fs__id_unparse(noderev->id, pool);
+
+ svn_error_clear(svn_stream_close(stream));
+ return svn_error_quick_wrapf(err,
+ _("malformed property list for node-revision '%s' in '%s'"),
+ id_str->data, filename);
+ }
SVN_ERR(svn_stream_close(stream));
}
else if (noderev->prop_rep)
{
+ svn_error_t *err;
fs_fs_data_t *ffd = fs->fsap_data;
representation_t *rep = noderev->prop_rep;
pair_cache_key_t key = { 0 };
@@ -2752,7 +2763,16 @@ svn_fs_fs__get_proplist(apr_hash_t **pro
proplist = apr_hash_make(pool);
SVN_ERR(svn_fs_fs__get_contents(&stream, fs, noderev->prop_rep, FALSE,
pool));
- SVN_ERR(svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool));
+ err = svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool);
+ if (err)
+ {
+ svn_string_t *id_str = svn_fs_fs__id_unparse(noderev->id, pool);
+
+ svn_error_clear(svn_stream_close(stream));
+ return svn_error_quick_wrapf(err,
+ _("malformed property list for node-revision '%s'"),
+ id_str->data);
+ }
SVN_ERR(svn_stream_close(stream));
if (ffd->properties_cache && SVN_IS_VALID_REVNUM(rep->revision))
Modified: subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c?rev=1678149&r1=1678148&r2=1678149&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/fs_fs.c Thu May 7 09:22:50 2015
@@ -1915,7 +1915,10 @@ get_node_origins_from_file(svn_fs_t *fs,
stream = svn_stream_from_aprfile2(fd, FALSE, pool);
*node_origins = apr_hash_make(pool);
- SVN_ERR(svn_hash_read2(*node_origins, stream, SVN_HASH_TERMINATOR, pool));
+ err = svn_hash_read2(*node_origins, stream, SVN_HASH_TERMINATOR, pool);
+ if (err)
+ return svn_error_quick_wrapf(err, _("malformed node origin data in '%s'"),
+ node_origins_file);
return svn_stream_close(stream);
}
Modified: subversion/trunk/subversion/libsvn_fs_fs/recovery.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/recovery.c?rev=1678149&r1=1678148&r2=1678149&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/recovery.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/recovery.c Thu May 7 09:22:50 2015
@@ -160,6 +160,7 @@ recover_find_max_ids(svn_fs_t *fs,
apr_hash_index_t *hi;
apr_pool_t *iterpool;
node_revision_t *noderev;
+ svn_error_t *err;
baton.stream = rev_file->stream;
SVN_ERR(svn_io_file_seek(rev_file->file, APR_SET, &offset, pool));
@@ -203,7 +204,16 @@ recover_find_max_ids(svn_fs_t *fs,
/* Now read the entries from that stream. */
entries = apr_hash_make(pool);
- SVN_ERR(svn_hash_read2(entries, stream, SVN_HASH_TERMINATOR, pool));
+ err = svn_hash_read2(entries, stream, SVN_HASH_TERMINATOR, pool);
+ if (err)
+ {
+ svn_string_t *id_str = svn_fs_fs__id_unparse(noderev->id, pool);
+
+ svn_error_clear(svn_stream_close(stream));
+ return svn_error_quick_wrapf(err,
+ _("malformed representation for node-revision '%s'"),
+ id_str->data);
+ }
SVN_ERR(svn_stream_close(stream));
/* Now check each of the entries in our directory to find new node and
Modified: subversion/trunk/subversion/libsvn_fs_fs/transaction.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/transaction.c?rev=1678149&r1=1678148&r2=1678149&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/transaction.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/transaction.c Thu May 7 09:22:50
2015
@@ -1128,6 +1128,7 @@ get_txn_proplist(apr_hash_t *proplist,
apr_pool_t *pool)
{
svn_stream_t *stream;
+ svn_error_t *err;
/* Check for issue #3696. (When we find and fix the cause, we can change
* this to an assertion.) */
@@ -1141,7 +1142,14 @@ get_txn_proplist(apr_hash_t *proplist,
pool, pool));
/* Read in the property list. */
- SVN_ERR(svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool));
+ err = svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool);
+ if (err)
+ {
+ svn_error_clear(svn_stream_close(stream));
+ return svn_error_quick_wrapf(err,
+ _("malformed property list in transaction '%s'"),
+ path_txn_props(fs, txn_id, pool));
+ }
return svn_stream_close(stream);
}