Skip to content

Commit

Permalink
Fixes a bug calculating remaining validity ticks (Stopwatch ticks are…
Browse files Browse the repository at this point in the history
… not the same as TimeSpan ticks) - thanks to @tukaef for spotting this.
  • Loading branch information
samcook committed Jan 13, 2018
1 parent dc864d4 commit 633757b
Showing 1 changed file with 8 additions and 8 deletions.
16 changes: 8 additions & 8 deletions RedLockNet.SERedis.Shared/RedLock.cs
Expand Up @@ -206,11 +206,11 @@ private bool Acquire()
var iteration = i + 1;
logger.LogDebug($"Lock attempt {iteration}/{quorumRetryCount}: {Resource} ({LockId}), expiry: {expiryTime}");

var startTick = Stopwatch.GetTimestamp();
var stopwatch = Stopwatch.StartNew();

var locksAcquired = Lock();

var validityTicks = GetRemainingValidityTicks(startTick);
var validityTicks = GetRemainingValidityTicks(stopwatch);

logger.LogDebug($"Acquired locks for {Resource} ({LockId}) in {locksAcquired}/{redisCaches.Count} instances, quorum: {quorum}, validityTicks: {validityTicks}");

Expand Down Expand Up @@ -248,11 +248,11 @@ private async Task<bool> AcquireAsync()
var iteration = i + 1;
logger.LogDebug($"Lock attempt {iteration}/{quorumRetryCount}: {Resource} ({LockId}), expiry: {expiryTime}");

var startTick = Stopwatch.GetTimestamp();
var stopwatch = Stopwatch.StartNew();

var locksAcquired = await LockAsync().ConfigureAwait(false);

var validityTicks = GetRemainingValidityTicks(startTick);
var validityTicks = GetRemainingValidityTicks(stopwatch);

logger.LogDebug($"Acquired locks for {Resource} ({LockId}) in {locksAcquired}/{redisCaches.Count} instances, quorum: {quorum}, validityTicks: {validityTicks}");

Expand Down Expand Up @@ -294,11 +294,11 @@ private void StartAutoExtendTimer()
{
logger.LogTrace($"Lock renewal timer fired: {Resource} ({LockId})");
var startTick = Stopwatch.GetTimestamp();
var stopwatch = Stopwatch.StartNew();
var locksExtended = Extend();
var validityTicks = GetRemainingValidityTicks(startTick);
var validityTicks = GetRemainingValidityTicks(stopwatch);
if (locksExtended >= quorum && validityTicks > 0)
{
Expand Down Expand Up @@ -326,12 +326,12 @@ private void StartAutoExtendTimer()
(int) interval);
}

private long GetRemainingValidityTicks(long startTick)
private long GetRemainingValidityTicks(Stopwatch sw)
{
// Add 2 milliseconds to the drift to account for Redis expires precision,
// which is 1 milliescond, plus 1 millisecond min drift for small TTLs.
var driftTicks = (long) (expiryTime.Ticks * clockDriftFactor) + TimeSpan.FromMilliseconds(2).Ticks;
var validityTicks = expiryTime.Ticks - (Stopwatch.GetTimestamp() - startTick) - driftTicks;
var validityTicks = expiryTime.Ticks - sw.Elapsed.Ticks - driftTicks;
return validityTicks;
}

Expand Down

0 comments on commit 633757b

Please sign in to comment.