diff --git a/pool.go b/pool.go index f8afb35..fb79e1c 100644 --- a/pool.go +++ b/pool.go @@ -84,9 +84,9 @@ func (res *Resource) CreationTime() time.Time { return res.creationTime } -// LastUsedNanotime returns when Release was last called on the resource measured in nanoseconds from an arbitrary -// time (a monotonic time). Returns 0 is Release as never been called. This is only useful to compare with other -// calls to LastUsedNanotime. In almost all cases, IdleDuration should be used instead. +// LastUsedNanotime returns when Release was last called on the resource measured in nanoseconds from an arbitrary time +// (a monotonic time). Returns creation time if Release has never been called. This is only useful to compare with +// other calls to LastUsedNanotime. In almost all cases, IdleDuration should be used instead. func (res *Resource) LastUsedNanotime() int64 { if !(res.status == resourceStatusAcquired || res.status == resourceStatusHijacked) { panic("tried to access resource that is not acquired or hijacked") @@ -95,17 +95,13 @@ func (res *Resource) LastUsedNanotime() int64 { return res.lastUsedNano } -// IdleDuration returns the duration since Release was last called on the resource. If Release has never been called -// a zero duration will be returned. This is equivalent to subtracting LastUsedNanotime to the current nanotime. +// IdleDuration returns the duration since Release was last called on the resource. This is equivalent to subtracting +// LastUsedNanotime to the current nanotime. func (res *Resource) IdleDuration() time.Duration { if !(res.status == resourceStatusAcquired || res.status == resourceStatusHijacked) { 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) } @@ -294,7 +290,7 @@ func (p *Pool) Acquire(ctx context.Context) (*Resource, error) { // If there is room to create a resource do so 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.destructWG.Add(1) p.cond.L.Unlock() diff --git a/pool_test.go b/pool_test.go index 69c3646..3d50612 100644 --- a/pool_test.go +++ b/pool_test.go @@ -523,13 +523,9 @@ func TestResourceLastUsageTimeTracking(t *testing.T) { constructor, _ := createConstructor() pool := puddle.NewPool(constructor, stubDestructor, 1) - // 0 before initial usage res, err := pool.Acquire(context.Background()) require.NoError(t, err) t1 := res.LastUsedNanotime() - d1 := res.IdleDuration() - assert.EqualValues(t, 0, t1) - assert.EqualValues(t, 0, d1) res.Release() // Greater than zero after initial usage @@ -537,15 +533,16 @@ func TestResourceLastUsageTimeTracking(t *testing.T) { require.NoError(t, err) t2 := res.LastUsedNanotime() d2 := res.IdleDuration() - assert.True(t, t2 > 0) - assert.True(t, d2 > 0) + assert.True(t, t2 > t1) res.ReleaseUnused() // ReleaseUnused does not update usage tracking res, err = pool.Acquire(context.Background()) require.NoError(t, err) t3 := res.LastUsedNanotime() + d3 := res.IdleDuration() assert.EqualValues(t, t2, t3) + assert.True(t, d3 > d2) res.Release() // Release does update usage tracking