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  }