github.com/0chain/gosdk@v1.17.11/core/node/cache.go (about) 1 package node 2 3 import ( 4 "sync" 5 ) 6 7 var Cache *NonceCache 8 var once sync.Once 9 10 type NonceCache struct { 11 cache map[string]int64 12 guard sync.Mutex 13 sharders *NodeHolder 14 } 15 16 func InitCache(sharders *NodeHolder) { 17 Cache.sharders = sharders 18 } 19 20 func init() { 21 once.Do(func() { 22 Cache = &NonceCache{ 23 cache: make(map[string]int64), 24 } 25 }) 26 } 27 28 func (nc *NonceCache) GetNextNonce(clientId string) int64 { 29 nc.guard.Lock() 30 defer nc.guard.Unlock() 31 if _, ok := nc.cache[clientId]; !ok { 32 nonce, _, err := nc.sharders.GetNonceFromSharders(clientId) 33 if err != nil { 34 nonce = 0 35 } 36 nc.cache[clientId] = nonce 37 } 38 39 nc.cache[clientId] += 1 40 return nc.cache[clientId] 41 } 42 43 func (nc *NonceCache) Set(clientId string, nonce int64) { 44 nc.guard.Lock() 45 defer nc.guard.Unlock() 46 nc.cache[clientId] = nonce 47 } 48 49 func (nc *NonceCache) Evict(clientId string) { 50 nc.guard.Lock() 51 defer nc.guard.Unlock() 52 delete(nc.cache, clientId) 53 }