Skip to content

Commit cea18ad

Browse files
committed
Set expiration for keys in deviceInUse cache. Add unit test.
1 parent 834b272 commit cea18ad

File tree

13 files changed

+390
-950
lines changed

13 files changed

+390
-950
lines changed

pkg/gce-pd-csi-driver/device_error_map.go

+3-7
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,10 @@ limitations under the License.
1515
package gceGCEDriver
1616

1717
import (
18-
"fmt"
1918
"sync"
2019
"time"
2120

22-
lru "github.com/hashicorp/golang-lru/v2"
21+
"github.com/hashicorp/golang-lru/v2/expirable"
2322
"k8s.io/klog/v2"
2423
)
2524

@@ -34,14 +33,11 @@ var currentTime = time.Now
3433
type deviceErrMap struct {
3534
timeout time.Duration
3635
mux sync.Mutex
37-
cache *lru.Cache[string, time.Time]
36+
cache *expirable.LRU[string, time.Time]
3837
}
3938

4039
func newDeviceErrMap(timeout time.Duration) *deviceErrMap {
41-
c, err := lru.New[string, time.Time](maxDeviceCacheSize)
42-
if err != nil {
43-
panic(fmt.Sprintf("Could not initialize deviceInUse LRU cache: %s", err))
44-
}
40+
c := expirable.NewLRU[string, time.Time](maxDeviceCacheSize, nil, timeout*2)
4541

4642
return &deviceErrMap{
4743
cache: c,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
Copyright 2018 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
http://www.apache.org/licenses/LICENSE-2.0
8+
Unless required by applicable law or agreed to in writing, software
9+
distributed under the License is distributed on an "AS IS" BASIS,
10+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
See the License for the specific language governing permissions and
12+
limitations under the License.
13+
*/
14+
15+
package gceGCEDriver
16+
17+
import (
18+
"testing"
19+
"time"
20+
)
21+
22+
func TestDeviceErrorMap(t *testing.T) {
23+
timeout := time.Second * 10
24+
dName := "fake-device"
25+
eMap := newDeviceErrMap(timeout)
26+
defer func() { currentTime = time.Now }()
27+
28+
// Register an error. Checking the timeout right after should return false
29+
stubCurrentTime(0)
30+
eMap.markDeviceError(dName)
31+
isTimedOut := eMap.checkDeviceErrorTimeout(dName)
32+
if isTimedOut {
33+
t.Errorf("checkDeviceErrorTimeout expected to be false if called immediately after marking an error")
34+
}
35+
36+
// Advance time. Checking the timeout should now return true
37+
stubCurrentTime(int64(timeout.Seconds()) + 1)
38+
isTimedOut = eMap.checkDeviceErrorTimeout(dName)
39+
if !isTimedOut {
40+
t.Errorf("checkDeviceErrorTimeout expected to be true after waiting for timeout")
41+
}
42+
}
43+
44+
func stubCurrentTime(unixTime int64) {
45+
currentTime = func() time.Time {
46+
return time.Unix(unixTime, 0)
47+
}
48+
}

vendor/github.com/hashicorp/golang-lru/v2/.gitignore

-23
This file was deleted.

vendor/github.com/hashicorp/golang-lru/v2/.golangci.yml

-46
This file was deleted.

0 commit comments

Comments
 (0)