From eb232d99a74126502628244fab64045b3d2323bc Mon Sep 17 00:00:00 2001 From: berkgokden Date: Mon, 15 Jul 2019 15:22:05 +0200 Subject: [PATCH] Added rw mutex to the in imemory token store --- client/tokenstore.go | 21 ++++++++++++++++++++- cmd/root.go | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/client/tokenstore.go b/client/tokenstore.go index fbc538a..6bb2ad5 100644 --- a/client/tokenstore.go +++ b/client/tokenstore.go @@ -16,6 +16,7 @@ package client import ( "io/ioutil" + "sync" "time" "github.com/magneticio/vampkubistcli/logging" @@ -138,32 +139,47 @@ func (ts *FileBackedTokenStore) Tokens() map[string]int64 { type InMemoryTokenStore struct { tokenMap map[string]int64 + rwlock sync.RWMutex } func (ts *InMemoryTokenStore) Store(token string, timeout int64) error { + ts.rwlock.Lock() if ts.tokenMap == nil { ts.tokenMap = make(map[string]int64) } ts.tokenMap[token] = timeout + ts.rwlock.Unlock() return nil } func (ts *InMemoryTokenStore) Get(token string) (int64, bool) { + ts.rwlock.RLock() if ts.tokenMap == nil { + ts.rwlock.RUnlock() return 0, false } if timeout, ok := ts.tokenMap[token]; ok { + ts.rwlock.RUnlock() return timeout, true } + ts.rwlock.RUnlock() return 0, false } func (ts *InMemoryTokenStore) Tokens() map[string]int64 { - return ts.tokenMap + ts.rwlock.RLock() + tokenMapCopy := make(map[string]int64) + for key, value := range ts.tokenMap { + tokenMapCopy[key] = value + } + ts.rwlock.RUnlock() + return tokenMapCopy } func (ts *InMemoryTokenStore) RemoveExpired() error { + ts.rwlock.Lock() if ts.tokenMap == nil { + ts.rwlock.Unlock() return nil } for token, timeout := range ts.tokenMap { @@ -171,10 +187,13 @@ func (ts *InMemoryTokenStore) RemoveExpired() error { delete(ts.tokenMap, token) } } + ts.rwlock.Unlock() return nil } func (ts *InMemoryTokenStore) Clean() error { + ts.rwlock.Lock() ts.tokenMap = make(map[string]int64) + ts.rwlock.Unlock() return nil } diff --git a/cmd/root.go b/cmd/root.go index 84e100d..6772f11 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -64,7 +64,7 @@ var kubeConfigPath string var TokenStore client.TokenStore // version should be in format d.d.d where d is a decimal number -const Version string = "v0.0.41" +const Version string = "v0.0.42" var AppName string = InitAppName()