Skip to content

Commit

Permalink
Merge the 1.8.x-r1581305 branch:
Browse files Browse the repository at this point in the history
 * r1581305, r1581315
   Increase timestamp sleep from 1ms to 10ms for hi-res filesystems.
   Justification:
     Missed text changes on some Linux systems.
   Branch:
     ^/subversion/branches/1.8.x-r1581305
   Votes:
     +1: philip, rhuijben, ivan


git-svn-id: https://svn.apache.org/repos/asf/subversion/branches/1.8.x@1582588 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
svn-role committed Mar 28, 2014
2 parents ae6bbda + 95aff55 commit ab6c6e5
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 22 deletions.
9 changes: 0 additions & 9 deletions STATUS
Expand Up @@ -323,15 +323,6 @@ Veto-blocked changes:
Approved changes:
=================

* r1581305, r1581315
Increase timestamp sleep from 1ms to 10ms for hi-res filesystems.
Justification:
Missed text changes on some Linux systems.
Branch:
^/subversion/branches/1.8.x-r1581305
Votes:
+1: philip, rhuijben, ivan

* r1555403
Update copyright years in NOTICE and subversion/libsvn_subr/version.c.
Justification:
Expand Down
6 changes: 6 additions & 0 deletions subversion/include/private/svn_dep_compat.h
Expand Up @@ -114,6 +114,12 @@ typedef apr_uint32_t apr_uintptr_t;
#define SVN_LOCK_IS_BUSY(x) APR_STATUS_IS_EBUSY(x)
#endif

#if !APR_VERSION_AT_LEAST(1,4,0)
#ifndef apr_time_from_msec
#define apr_time_from_msec(msec) ((apr_time_t)(msec) * 1000)
#endif
#endif

/**
* Check at compile time if the Serf version is at least a certain
* level.
Expand Down
38 changes: 25 additions & 13 deletions subversion/libsvn_subr/io.c
Expand Up @@ -1243,32 +1243,44 @@ svn_io_sleep_for_timestamps(const char *path, apr_pool_t *pool)
{
/* Very simplistic but safe approach:
If the filesystem has < sec mtime we can be reasonably sure
that the filesystem has <= millisecond precision.
that the filesystem has some sub-second resolution. On Windows
it is likely to be sub-millisecond; on Linux systems it depends
on the filesystem, ext4 is typically 1ms, 4ms or 10ms resolution.
## Perhaps find a better algorithm here. This will fail once
in every 1000 cases on a millisecond precision filesystem.
in every 1000 cases on a millisecond precision filesystem
if the mtime happens to be an exact second.
But better to fail once in every thousand cases than every
time, like we did before.
(All tested filesystems I know have at least microsecond precision.)
Note for further research on algorithm:
FAT32 has < 1 sec precision on ctime, but 2 sec on mtime */
FAT32 has < 1 sec precision on ctime, but 2 sec on mtime.
/* Sleep for at least 1 millisecond.
(t < 1000 will be round to 0 in apr) */
apr_sleep(1000);
Linux/ext4 with CONFIG_HZ=250 has high resolution
apr_time_now and although the filesystem timestamps
have similar high precision they are only updated with
a coarser 4ms resolution. */

return;
/* 10 milliseconds after now. */
#ifndef SVN_HI_RES_SLEEP_MS
#define SVN_HI_RES_SLEEP_MS 10
#endif
then = now + apr_time_from_msec(SVN_HI_RES_SLEEP_MS);
}

now = apr_time_now(); /* Extract the time used for the path stat */

if (now >= then)
return; /* Passing negative values may suspend indefinitely (Windows) */
/* Remove time taken to do stat() from sleep. */
now = apr_time_now();
}

apr_sleep(then - now);
if (now >= then)
return; /* Passing negative values may suspend indefinitely (Windows) */

/* (t < 1000 will be round to 0 in apr) */
if (then - now < 1000)
apr_sleep(1000);
else
apr_sleep(then - now);
}


Expand Down

0 comments on commit ab6c6e5

Please sign in to comment.