Store resource creation time
This commit is contained in:
@@ -21,9 +21,10 @@ type Constructor func(ctx context.Context) (res interface{}, err error)
|
|||||||
type Destructor func(res interface{})
|
type Destructor func(res interface{})
|
||||||
|
|
||||||
type Resource struct {
|
type Resource struct {
|
||||||
value interface{}
|
value interface{}
|
||||||
pool *Pool
|
pool *Pool
|
||||||
status byte
|
creationTime time.Time
|
||||||
|
status byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func (res *Resource) Value() interface{} {
|
func (res *Resource) Value() interface{} {
|
||||||
@@ -53,6 +54,14 @@ func (res *Resource) Hijack() {
|
|||||||
res.pool.hijackAcquiredResource(res)
|
res.pool.hijackAcquiredResource(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreationTime returns when the resource was created by the pool.
|
||||||
|
func (res *Resource) CreationTime() time.Time {
|
||||||
|
if res.status != resourceStatusAcquired {
|
||||||
|
panic("tried to use resource that is not acquired")
|
||||||
|
}
|
||||||
|
return res.creationTime
|
||||||
|
}
|
||||||
|
|
||||||
// Pool is a thread-safe resource pool.
|
// Pool is a thread-safe resource pool.
|
||||||
type Pool struct {
|
type Pool struct {
|
||||||
cond *sync.Cond
|
cond *sync.Cond
|
||||||
@@ -232,7 +241,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) < p.maxSize {
|
if len(p.allResources) < p.maxSize {
|
||||||
res := &Resource{pool: p, status: resourceStatusConstructing}
|
res := &Resource{pool: p, creationTime: startTime, 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()
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ func TestPoolAcquireCreatesResourceWhenNoneIdle(t *testing.T) {
|
|||||||
res, err := pool.Acquire(context.Background())
|
res, err := pool.Acquire(context.Background())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, 1, res.Value())
|
assert.Equal(t, 1, res.Value())
|
||||||
|
assert.WithinDuration(t, time.Now(), res.CreationTime(), time.Second)
|
||||||
res.Release()
|
res.Release()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user