func (*testSuite) TestT(c *C) { driver := localstore.Driver{Driver: goleveldb.MemoryDriver{}} store, err := driver.Open("memory") c.Assert(err, IsNil) defer store.Close() // For GenID txn, err := store.Begin() c.Assert(err, IsNil) key := []byte(meta.AutoIDKey(1)) id, err := meta.GenID(txn, key, 1) c.Assert(id, Equals, int64(1)) id, err = meta.GenID(txn, key, 2) c.Assert(id, Equals, int64(3)) id, err = meta.GenID(txn, []byte{}, 1) c.Assert(err, NotNil) // For DBMetaKey mkey := meta.DBMetaKey(1) c.Assert(mkey, Equals, "mDB::1") //For AutoIDKey mkey = meta.AutoIDKey(1) c.Assert(mkey, Equals, "mTable::1_autoID") mkey = meta.AutoIDKey(0) c.Assert(mkey, Equals, "mTable::0_autoID") // For GenGlobalID id, err = meta.GenGlobalID(store) c.Assert(err, IsNil) c.Assert(id, Equals, int64(1)) id, err = meta.GenGlobalID(store) c.Assert(err, IsNil) c.Assert(id, Equals, int64(2)) }
// Alloc allocs the next autoID for table with tableID. // It gets a batch of autoIDs at a time. So it does not need to access storage for each call. func (alloc *allocator) Alloc(tableID int64) (int64, error) { if tableID == 0 { return 0, errors.New("Invalid tableID") } metaKey := meta.AutoIDKey(tableID) alloc.mu.Lock() defer alloc.mu.Unlock() if alloc.base == alloc.end { // step err := kv.RunInNewTxn(alloc.store, true, func(txn kv.Transaction) error { end, err := meta.GenID(txn, []byte(metaKey), step) if err != nil { return errors.Trace(err) } alloc.end = end alloc.base = alloc.end - step return nil }) if err != nil { return 0, errors.Trace(err) } } alloc.base++ log.Infof("Alloc id %d, table ID:%d, from %p, store ID:%s", alloc.base, tableID, alloc, alloc.store.UUID()) return alloc.base, nil }