Skip to content

Commit cdc49c3

Browse files
authored
Merge pull request #106 from kubescape/refactor-in-memory-fh
refactor inmemory file handler
2 parents 7835118 + d10aa9a commit cdc49c3

File tree

1 file changed

+26
-37
lines changed

1 file changed

+26
-37
lines changed

pkg/filehandler/v1/inmemory.go

Lines changed: 26 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -9,52 +9,49 @@ import (
99

1010
const initFileListLength = 5000
1111

12+
type filesBucket struct {
13+
lock *sync.RWMutex
14+
files map[string]bool
15+
}
16+
1217
type InMemoryFileHandler struct {
13-
mutex sync.RWMutex
14-
m map[string]*sync.RWMutex
15-
files map[string]map[string]bool
18+
mutex sync.RWMutex
19+
buckets map[string]*filesBucket
1620
}
1721

1822
var _ filehandler.FileHandler = (*InMemoryFileHandler)(nil)
1923

2024
func CreateInMemoryFileHandler() (*InMemoryFileHandler, error) {
2125
return &InMemoryFileHandler{
22-
m: make(map[string]*sync.RWMutex),
23-
files: make(map[string]map[string]bool, 20),
26+
buckets: make(map[string]*filesBucket, 20),
2427
}, nil
2528
}
2629

2730
func (s *InMemoryFileHandler) AddFile(ctx context.Context, bucket, file string) error {
28-
2931
// Acquire a read lock first
3032
s.mutex.RLock()
31-
bucketLock, ok := s.m[bucket]
32-
bucketFiles, okF := s.files[bucket]
33+
bucketFiles, ok := s.buckets[bucket]
3334
s.mutex.RUnlock()
3435

3536
// If the bucket doesn't exist, acquire a write lock to create the new bucket
36-
if !ok || !okF {
37+
if !ok {
3738
s.mutex.Lock()
3839
// Double-check the bucket's existence to ensure another goroutine didn't already create it
39-
bucketLock, ok = s.m[bucket]
40+
bucketFiles, ok = s.buckets[bucket]
4041
if !ok {
41-
bucketLock = &sync.RWMutex{}
42-
s.m[bucket] = bucketLock
43-
}
44-
45-
bucketFiles, okF = s.files[bucket]
46-
if !okF {
47-
bucketFiles = make(map[string]bool, initFileListLength)
48-
s.files[bucket] = bucketFiles
42+
bucketFiles = &filesBucket{
43+
lock: &sync.RWMutex{},
44+
files: make(map[string]bool, initFileListLength),
45+
}
46+
s.buckets[bucket] = bucketFiles
4947
}
5048
s.mutex.Unlock()
5149
}
5250

5351
// Acquire a write lock if the bucket already exists
54-
bucketLock.Lock()
55-
defer bucketLock.Unlock()
56-
57-
bucketFiles[file] = true
52+
bucketFiles.lock.Lock()
53+
bucketFiles.files[file] = true
54+
bucketFiles.lock.Unlock()
5855

5956
return nil
6057
}
@@ -76,30 +73,22 @@ func shallowCopyMapStringBool(m map[string]bool) map[string]bool {
7673

7774
func (s *InMemoryFileHandler) GetFiles(ctx context.Context, bucket string) (map[string]bool, error) {
7875
s.mutex.RLock()
79-
bucketLock, ok := s.m[bucket]
80-
bucketFiles, okFiles := s.files[bucket]
76+
bucketFiles, ok := s.buckets[bucket]
8177
s.mutex.RUnlock()
8278

83-
if !ok || !okFiles {
79+
if !ok {
8480
return map[string]bool{}, fmt.Errorf("bucket does not exist for container %s", bucket)
8581
}
8682

87-
bucketLock.RLock()
88-
defer bucketLock.RUnlock()
83+
bucketFiles.lock.RLock()
84+
copy := shallowCopyMapStringBool(bucketFiles.files)
85+
bucketFiles.lock.RUnlock()
8986

90-
return shallowCopyMapStringBool(bucketFiles), nil
87+
return copy, nil
9188
}
9289
func (s *InMemoryFileHandler) RemoveBucket(ctx context.Context, bucket string) error {
93-
9490
s.mutex.Lock()
95-
bucketLock, ok := s.m[bucket]
96-
if ok {
97-
bucketLock.Lock()
98-
defer bucketLock.Unlock()
99-
}
100-
101-
delete(s.m, bucket)
102-
delete(s.files, bucket)
91+
delete(s.buckets, bucket)
10392
s.mutex.Unlock()
10493

10594
return nil

0 commit comments

Comments
 (0)