mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-29 06:27:05 +00:00
commit
df8706e60b
@ -331,7 +331,6 @@ staging/src/k8s.io/apimachinery/pkg/runtime/testing
|
|||||||
staging/src/k8s.io/apimachinery/pkg/selection
|
staging/src/k8s.io/apimachinery/pkg/selection
|
||||||
staging/src/k8s.io/apimachinery/pkg/test
|
staging/src/k8s.io/apimachinery/pkg/test
|
||||||
staging/src/k8s.io/apimachinery/pkg/types
|
staging/src/k8s.io/apimachinery/pkg/types
|
||||||
staging/src/k8s.io/apimachinery/pkg/util/cache
|
|
||||||
staging/src/k8s.io/apimachinery/pkg/util/clock
|
staging/src/k8s.io/apimachinery/pkg/util/clock
|
||||||
staging/src/k8s.io/apimachinery/pkg/util/errors
|
staging/src/k8s.io/apimachinery/pkg/util/errors
|
||||||
staging/src/k8s.io/apimachinery/pkg/util/framer
|
staging/src/k8s.io/apimachinery/pkg/util/framer
|
||||||
|
@ -8,10 +8,7 @@ load(
|
|||||||
|
|
||||||
go_test(
|
go_test(
|
||||||
name = "go_default_test",
|
name = "go_default_test",
|
||||||
srcs = [
|
srcs = ["lruexpirecache_test.go"],
|
||||||
"cache_test.go",
|
|
||||||
"lruexpirecache_test.go",
|
|
||||||
],
|
|
||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = [
|
deps = [
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library",
|
||||||
@ -21,10 +18,7 @@ go_test(
|
|||||||
|
|
||||||
go_library(
|
go_library(
|
||||||
name = "go_default_library",
|
name = "go_default_library",
|
||||||
srcs = [
|
srcs = ["lruexpirecache.go"],
|
||||||
"cache.go",
|
|
||||||
"lruexpirecache.go",
|
|
||||||
],
|
|
||||||
importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/cache",
|
importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/cache",
|
||||||
importpath = "k8s.io/apimachinery/pkg/util/cache",
|
importpath = "k8s.io/apimachinery/pkg/util/cache",
|
||||||
deps = ["//vendor/github.com/hashicorp/golang-lru:go_default_library"],
|
deps = ["//vendor/github.com/hashicorp/golang-lru:go_default_library"],
|
||||||
|
@ -1,83 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2014 The Kubernetes Authors.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package cache
|
|
||||||
|
|
||||||
import (
|
|
||||||
"sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
shardsCount int = 32
|
|
||||||
)
|
|
||||||
|
|
||||||
type Cache []*cacheShard
|
|
||||||
|
|
||||||
func NewCache(maxSize int) Cache {
|
|
||||||
if maxSize < shardsCount {
|
|
||||||
maxSize = shardsCount
|
|
||||||
}
|
|
||||||
cache := make(Cache, shardsCount)
|
|
||||||
for i := 0; i < shardsCount; i++ {
|
|
||||||
cache[i] = &cacheShard{
|
|
||||||
items: make(map[uint64]interface{}),
|
|
||||||
maxSize: maxSize / shardsCount,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cache
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c Cache) getShard(index uint64) *cacheShard {
|
|
||||||
return c[index%uint64(shardsCount)]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns true if object already existed, false otherwise.
|
|
||||||
func (c *Cache) Add(index uint64, obj interface{}) bool {
|
|
||||||
return c.getShard(index).add(index, obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Cache) Get(index uint64) (obj interface{}, found bool) {
|
|
||||||
return c.getShard(index).get(index)
|
|
||||||
}
|
|
||||||
|
|
||||||
type cacheShard struct {
|
|
||||||
items map[uint64]interface{}
|
|
||||||
sync.RWMutex
|
|
||||||
maxSize int
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns true if object already existed, false otherwise.
|
|
||||||
func (s *cacheShard) add(index uint64, obj interface{}) bool {
|
|
||||||
s.Lock()
|
|
||||||
defer s.Unlock()
|
|
||||||
_, isOverwrite := s.items[index]
|
|
||||||
if !isOverwrite && len(s.items) >= s.maxSize {
|
|
||||||
var randomKey uint64
|
|
||||||
for randomKey = range s.items {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
delete(s.items, randomKey)
|
|
||||||
}
|
|
||||||
s.items[index] = obj
|
|
||||||
return isOverwrite
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *cacheShard) get(index uint64) (obj interface{}, found bool) {
|
|
||||||
s.RLock()
|
|
||||||
defer s.RUnlock()
|
|
||||||
obj, found = s.items[index]
|
|
||||||
return
|
|
||||||
}
|
|
@ -1,90 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2014 The Kubernetes Authors.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package cache
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
maxTestCacheSize int = shardsCount * 2
|
|
||||||
)
|
|
||||||
|
|
||||||
func ExpectEntry(t *testing.T, cache Cache, index uint64, expectedValue interface{}) bool {
|
|
||||||
elem, found := cache.Get(index)
|
|
||||||
if !found {
|
|
||||||
t.Errorf("Expected to find entry with key %d", index)
|
|
||||||
return false
|
|
||||||
} else if elem != expectedValue {
|
|
||||||
t.Errorf("Expected to find %v, got %v", expectedValue, elem)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestBasic(t *testing.T) {
|
|
||||||
cache := NewCache(maxTestCacheSize)
|
|
||||||
cache.Add(1, "xxx")
|
|
||||||
ExpectEntry(t, cache, 1, "xxx")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestOverflow(t *testing.T) {
|
|
||||||
cache := NewCache(maxTestCacheSize)
|
|
||||||
for i := 0; i < maxTestCacheSize+1; i++ {
|
|
||||||
cache.Add(uint64(i), "xxx")
|
|
||||||
}
|
|
||||||
foundIndexes := make([]uint64, 0)
|
|
||||||
for i := 0; i < maxTestCacheSize+1; i++ {
|
|
||||||
_, found := cache.Get(uint64(i))
|
|
||||||
if found {
|
|
||||||
foundIndexes = append(foundIndexes, uint64(i))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(foundIndexes) != maxTestCacheSize {
|
|
||||||
t.Errorf("Expect to find %d elements, got %d %v", maxTestCacheSize, len(foundIndexes), foundIndexes)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestOverwrite(t *testing.T) {
|
|
||||||
cache := NewCache(maxTestCacheSize)
|
|
||||||
cache.Add(1, "xxx")
|
|
||||||
ExpectEntry(t, cache, 1, "xxx")
|
|
||||||
cache.Add(1, "yyy")
|
|
||||||
ExpectEntry(t, cache, 1, "yyy")
|
|
||||||
}
|
|
||||||
|
|
||||||
// TestEvict this test will fail sporatically depending on what add()
|
|
||||||
// selects for the randomKey to be evicted. Ensure that randomKey
|
|
||||||
// is never the key we most recently added. Since the chance of failure
|
|
||||||
// on each evict is 50%, if we do it 7 times, it should catch the problem
|
|
||||||
// if it exists >99% of the time.
|
|
||||||
func TestEvict(t *testing.T) {
|
|
||||||
cache := NewCache(shardsCount)
|
|
||||||
var found bool
|
|
||||||
for retry := 0; retry < 7; retry++ {
|
|
||||||
cache.Add(uint64(shardsCount), "xxx")
|
|
||||||
found = ExpectEntry(t, cache, uint64(shardsCount), "xxx")
|
|
||||||
if !found {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
cache.Add(0, "xxx")
|
|
||||||
found = ExpectEntry(t, cache, 0, "xxx")
|
|
||||||
if !found {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user