From a2e5bae951f904f6a51464fc569ef64e8b05d8b0 Mon Sep 17 00:00:00 2001 From: rwindelz Date: Sun, 19 Jan 2014 21:45:53 -0800 Subject: [PATCH] fix(store): TTL should range 1..n rather than 1..n+1 was experiencing intermittent functional test fails where TTL was eg 101 when 100 was expected informal testing on a windows platform shows Go times resolving to the nanosecond but with an accuracy of approximately 1 millisecond I believe some of the functional test steps would run in under a millisecond and cause the TTL to be recomputed with the same time.Now() value resulting in a TTL that was +1 from the expected --- store/node.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/store/node.go b/store/node.go index e17fcf204..0b950b07d 100644 --- a/store/node.go +++ b/store/node.go @@ -113,7 +113,19 @@ func (n *node) Write(value string, index uint64) *etcdErr.Error { func (n *node) ExpirationAndTTL() (*time.Time, int64) { if !n.IsPermanent() { - return &n.ExpireTime, int64(n.ExpireTime.Sub(time.Now())/time.Second) + 1 + /* compute ttl as: + ceiling( (expireTime - timeNow) / nanosecondsPerSecond ) + which ranges from 1..n + rather than as: + ( (expireTime - timeNow) / nanosecondsPerSecond ) + 1 + which ranges 1..n+1 + */ + ttlN := n.ExpireTime.Sub(time.Now()) + ttl := ttlN / time.Second + if (ttlN % time.Second) > 0 { + ttl++ + } + return &n.ExpireTime, int64(ttl) } return nil, 0 }