Atlas › Test

TestPutOrDo

Exact test identity: go.temporal.io/server/common/collection/TestConcurrentTxMapSuite/TestPutOrDo

Package
go.temporal.io/server/common/collection
Suite / test hierarchy
TestConcurrentTxMapSuite/TestPutOrDo
Test
TestPutOrDo
Introduced at
TestPutOrDo Frontier kind: Test frontier
Covered ranges
10
Covered lines
36
Covered files
2

Covered source

Expand a file to inspect source; the > gutter marks covered lines.

go.temporal.io/server/common/collection/concurrent_tx_map.go 29 covered LOC · 6 ranges

Open complete file

55 //
56 // The hash function to use for sharding
57 > func NewShardedConcurrentTxMap(initialCap int, hashfn HashFunc) ConcurrentTxMap { concurrent_tx_map.go
58 > cmap := new(ShardedConcurrentTxMap)
59 > cmap.hashfn = hashfn
60 > cmap.initialCap = max(nShards, initialCap/nShards)
61 > return cmap
62 > }
63
64 // Get returns the value corresponding to the key, if it exist
143 // PutOrDo put the key value in the map, if key does not exists, otherwise, call fn with existing key and value
144 // return (value, fn evaluated or not, error when evaluation fn)
145 > func (cmap *ShardedConcurrentTxMap) PutOrDo(key any, value any, fn ActionFunc) (any, bool, error) { concurrent_tx_map.go
146 > shard := cmap.getShard(key)
147 > var err error
148 > shard.Lock()
149 > cmap.lazyInitShard(shard)
150 > v, ok := shard.items[key]
151 > if !ok {
152 > shard.items[key] = value
153 > v = value
154 > atomic.AddInt32(&cmap.size, 1)
155 > } else {
156 > err = fn(key, v) concurrent_tx_map.go
157 > }
158 > shard.Unlock() concurrent_tx_map.go
159 > return v, ok, err
160 }
161
222 }
223
224 > func (cmap *ShardedConcurrentTxMap) getShard(key any) *mapShard { concurrent_tx_map.go
225 > shardIdx := cmap.hashfn(key) % nShards
226 > return &cmap.shards[shardIdx]
227 > }
228
229 > func (cmap *ShardedConcurrentTxMap) lazyInitShard(shard *mapShard) { concurrent_tx_map.go
230 > if shard.items == nil {
231 > shard.items = make(map[any]any, cmap.initialCap)
232 > }
233 }
go.temporal.io/server/common/collection/util.go 7 covered LOC · 4 ranges

Open complete file

9 // if the uuid is malformed, then the hash function always
10 // returns 0 as the hash value
11 > func UUIDHashCode(input any) uint32 { util.go
12 > key, ok := input.(string)
13 > if !ok {
14 return 0
15 }
16 > if len(key) != UUIDStringLength { util.go
17 return 0
18 }
19 // Use the first 4 bytes of the uuid as the hash
20 > b, err := hex.DecodeString(key[:8]) util.go
21 > if err != nil {
22 return 0
23 }
24 > return binary.BigEndian.Uint32(b) util.go
25 }