AssignUid creates new or looks up existing XID to UID mappings. It also returns if UID was created.
(xid string)
| 250 | // AssignUid creates new or looks up existing XID to UID mappings. It also returns if |
| 251 | // UID was created. |
| 252 | func (m *XidMap) AssignUid(xid string) (uint64, bool) { |
| 253 | sh := m.shardFor(xid) |
| 254 | sh.RLock() |
| 255 | |
| 256 | uid := sh.tree.Get(farm.Fingerprint64([]byte(xid))) |
| 257 | sh.RUnlock() |
| 258 | if uid > 0 { |
| 259 | return uid, false |
| 260 | } |
| 261 | |
| 262 | sh.Lock() |
| 263 | defer sh.Unlock() |
| 264 | |
| 265 | uid = sh.tree.Get(farm.Fingerprint64([]byte(xid))) |
| 266 | if uid > 0 { |
| 267 | return uid, false |
| 268 | } |
| 269 | |
| 270 | newUid := sh.assign(m.newRanges) |
| 271 | sh.tree.Set(farm.Fingerprint64([]byte(xid)), newUid) |
| 272 | |
| 273 | if m.writer != nil { |
| 274 | var uidBuf [8]byte |
| 275 | binary.BigEndian.PutUint64(uidBuf[:], newUid) |
| 276 | m.kvBuf = append(m.kvBuf, kv{key: []byte(xid), value: uidBuf[:]}) |
| 277 | |
| 278 | if len(m.kvBuf) == 64 { |
| 279 | m.kvChan <- m.kvBuf |
| 280 | m.kvBuf = make([]kv, 0, 64) |
| 281 | } |
| 282 | } |
| 283 | |
| 284 | return newUid, true |
| 285 | } |
| 286 | |
| 287 | func (sh *shard) Current() uint64 { |
| 288 | sh.RLock() |