2
0

Initialize LastUsedNanotime on creation

This commit is contained in:
Jack Christensen
2020-02-03 08:25:42 -06:00
parent 576940c285
commit cde4bcb7af
2 changed files with 9 additions and 16 deletions
+6 -10
View File
@@ -84,9 +84,9 @@ func (res *Resource) CreationTime() time.Time {
return res.creationTime return res.creationTime
} }
// LastUsedNanotime returns when Release was last called on the resource measured in nanoseconds from an arbitrary // LastUsedNanotime returns when Release was last called on the resource measured in nanoseconds from an arbitrary time
// time (a monotonic time). Returns 0 is Release as never been called. This is only useful to compare with other // (a monotonic time). Returns creation time if Release has never been called. This is only useful to compare with
// calls to LastUsedNanotime. In almost all cases, IdleDuration should be used instead. // other calls to LastUsedNanotime. In almost all cases, IdleDuration should be used instead.
func (res *Resource) LastUsedNanotime() int64 { func (res *Resource) LastUsedNanotime() int64 {
if !(res.status == resourceStatusAcquired || res.status == resourceStatusHijacked) { if !(res.status == resourceStatusAcquired || res.status == resourceStatusHijacked) {
panic("tried to access resource that is not acquired or hijacked") panic("tried to access resource that is not acquired or hijacked")
@@ -95,17 +95,13 @@ func (res *Resource) LastUsedNanotime() int64 {
return res.lastUsedNano return res.lastUsedNano
} }
// IdleDuration returns the duration since Release was last called on the resource. If Release has never been called // IdleDuration returns the duration since Release was last called on the resource. This is equivalent to subtracting
// a zero duration will be returned. This is equivalent to subtracting LastUsedNanotime to the current nanotime. // LastUsedNanotime to the current nanotime.
func (res *Resource) IdleDuration() time.Duration { func (res *Resource) IdleDuration() time.Duration {
if !(res.status == resourceStatusAcquired || res.status == resourceStatusHijacked) { if !(res.status == resourceStatusAcquired || res.status == resourceStatusHijacked) {
panic("tried to access resource that is not acquired or hijacked") panic("tried to access resource that is not acquired or hijacked")
} }
if res.lastUsedNano == 0 {
return time.Duration(0)
}
return time.Duration(nanotime() - res.lastUsedNano) return time.Duration(nanotime() - res.lastUsedNano)
} }
@@ -294,7 +290,7 @@ func (p *Pool) Acquire(ctx context.Context) (*Resource, error) {
// If there is room to create a resource do so // If there is room to create a resource do so
if len(p.allResources) < int(p.maxSize) { if len(p.allResources) < int(p.maxSize) {
res := &Resource{pool: p, creationTime: time.Now(), status: resourceStatusConstructing} res := &Resource{pool: p, creationTime: time.Now(), lastUsedNano: nanotime(), status: resourceStatusConstructing}
p.allResources = append(p.allResources, res) p.allResources = append(p.allResources, res)
p.destructWG.Add(1) p.destructWG.Add(1)
p.cond.L.Unlock() p.cond.L.Unlock()
+3 -6
View File
@@ -523,13 +523,9 @@ func TestResourceLastUsageTimeTracking(t *testing.T) {
constructor, _ := createConstructor() constructor, _ := createConstructor()
pool := puddle.NewPool(constructor, stubDestructor, 1) pool := puddle.NewPool(constructor, stubDestructor, 1)
// 0 before initial usage
res, err := pool.Acquire(context.Background()) res, err := pool.Acquire(context.Background())
require.NoError(t, err) require.NoError(t, err)
t1 := res.LastUsedNanotime() t1 := res.LastUsedNanotime()
d1 := res.IdleDuration()
assert.EqualValues(t, 0, t1)
assert.EqualValues(t, 0, d1)
res.Release() res.Release()
// Greater than zero after initial usage // Greater than zero after initial usage
@@ -537,15 +533,16 @@ func TestResourceLastUsageTimeTracking(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
t2 := res.LastUsedNanotime() t2 := res.LastUsedNanotime()
d2 := res.IdleDuration() d2 := res.IdleDuration()
assert.True(t, t2 > 0) assert.True(t, t2 > t1)
assert.True(t, d2 > 0)
res.ReleaseUnused() res.ReleaseUnused()
// ReleaseUnused does not update usage tracking // ReleaseUnused does not update usage tracking
res, err = pool.Acquire(context.Background()) res, err = pool.Acquire(context.Background())
require.NoError(t, err) require.NoError(t, err)
t3 := res.LastUsedNanotime() t3 := res.LastUsedNanotime()
d3 := res.IdleDuration()
assert.EqualValues(t, t2, t3) assert.EqualValues(t, t2, t3)
assert.True(t, d3 > d2)
res.Release() res.Release()
// Release does update usage tracking // Release does update usage tracking