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 2016/01/21 17:27:04 UTC
svn commit: r1726004 - in /subversion/trunk/subversion/libsvn_fs_fs:
cached_data.c temp_serializer.c temp_serializer.h
Author: stefan2
Date: Thu Jan 21 16:27:04 2016
New Revision: 1726004
URL: http://svn.apache.org/viewvc?rev=1726004&view=rev
Log:
Fix the OOD check for cached FSFS in-txn directories when looking for a
specific entry.
The problem is that even outdated directory data is reported as "found"
by the lookup code. The callback that will check for out-of-dateness
needs to report back that the data found could not be used.
This was found during testing the parallel-put freature and is part of
the new multi-connection editing support we added in trunk for 1.10.
* subversion/libsvn_fs_fs/temp_serializer.h
(extract_dir_entry_baton_t): Add an OOD indicator field to be filled
by the callback.
* subversion/libsvn_fs_fs/temp_serializer.c
(svn_fs_fs__extract_dir_entry): Set that new field.
* subversion/libsvn_fs_fs/cached_data.c
(svn_fs_fs__rep_contents_dir_entry): Treat OOD data the same as uncached.
Modified:
subversion/trunk/subversion/libsvn_fs_fs/cached_data.c
subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c
subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.h
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=1726004&r1=1726003&r2=1726004&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/cached_data.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/cached_data.c Thu Jan 21 16:27:04 2016
@@ -2744,6 +2744,7 @@ svn_fs_fs__rep_contents_dir_entry(svn_fs
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
+ extract_dir_entry_baton_t baton;
svn_boolean_t found = FALSE;
/* find the cache we may use */
@@ -2753,8 +2754,6 @@ svn_fs_fs__rep_contents_dir_entry(svn_fs
scratch_pool);
if (cache)
{
- extract_dir_entry_baton_t baton;
-
svn_filesize_t filesize;
SVN_ERR(get_txn_dir_info(&filesize, fs, noderev, scratch_pool));
@@ -2771,7 +2770,7 @@ svn_fs_fs__rep_contents_dir_entry(svn_fs
}
/* fetch data from disk if we did not find it in the cache */
- if (! found)
+ if (! found || baton.out_of_date)
{
svn_fs_dirent_t *entry;
svn_fs_dirent_t *entry_copy = NULL;
Modified: subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c?rev=1726004&r1=1726003&r2=1726004&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c Thu Jan 21 16:27:04 2016
@@ -935,7 +935,7 @@ svn_fs_fs__extract_dir_entry(void **out,
apr_pool_t *pool)
{
const dir_data_t *dir_data = data;
- const extract_dir_entry_baton_t *entry_baton = baton;
+ extract_dir_entry_baton_t *entry_baton = baton;
svn_boolean_t found;
/* resolve the reference to the entries array */
@@ -954,8 +954,11 @@ svn_fs_fs__extract_dir_entry(void **out,
/* de-serialize that entry or return NULL, if no match has been found.
* Be sure to check that the directory contents is still up-to-date. */
+ entry_baton->out_of_date
+ = dir_data->txn_filesize == entry_baton->txn_filesize;
+
*out = NULL;
- if (found && dir_data->txn_filesize == entry_baton->txn_filesize)
+ if (found && !entry_baton->out_of_date)
{
const svn_fs_dirent_t *source =
svn_temp_deserializer__ptr(entries, (const void *const *)&entries[pos]);
Modified: subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.h?rev=1726004&r1=1726003&r2=1726004&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.h (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.h Thu Jan 21 16:27:04 2016
@@ -274,6 +274,12 @@ typedef struct extract_dir_entry_baton_t
/** Current length of the in-txn in-disk representation of the directory.
* SVN_INVALID_FILESIZE if unknown. */
svn_filesize_t txn_filesize;
+
+ /** Will be set by the callback. If FALSE, the cached data is out of date.
+ * We need this indicator because the svn_cache__t interface will always
+ * report the lookup as a success (FOUND==TRUE) if the generic lookup was
+ * successful -- regardless of what the entry extraction callback does. */
+ svn_boolean_t out_of_date;
} extract_dir_entry_baton_t;