github.com/unigraph-dev/dgraph@v1.1.1-0.20200923154953-8b52b426f765/dgraph/cmd/bulk/shard_map.go (about) 1 /* 2 * Copyright 2017-2018 Dgraph Labs, Inc. and Contributors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package bulk 18 19 import "sync" 20 21 type shardMap struct { 22 sync.RWMutex 23 numShards int 24 predToShard map[string]int 25 nextShard int 26 } 27 28 func newShardMap(numShards int) *shardMap { 29 return &shardMap{ 30 numShards: numShards, 31 predToShard: make(map[string]int), 32 } 33 } 34 35 func (m *shardMap) shardFor(pred string) int { 36 m.RLock() 37 shard, ok := m.predToShard[pred] 38 m.RUnlock() 39 if ok { 40 return shard 41 } 42 43 m.Lock() 44 defer m.Unlock() 45 shard, ok = m.predToShard[pred] 46 if ok { 47 return shard 48 } 49 50 shard = m.nextShard 51 m.predToShard[pred] = shard 52 m.nextShard = (m.nextShard + 1) % m.numShards 53 return shard 54 }