// TestIDAllocatorNegativeValue creates an ID allocator against an // increment key which is preset to a negative value. We verify that // the id allocator makes a double-alloc to make up the difference // and push the id allocation into positive integers. func TestIDAllocatorNegativeValue(t *testing.T) { defer leaktest.AfterTest(t) store, _, stopper := createTestStore(t) defer stopper.Stop() // Increment our key to a negative value. newValue, err := engine.MVCCIncrement(store.Engine(), nil, keys.RaftIDGenerator, store.ctx.Clock.Now(), nil, -1024) if err != nil { t.Fatal(err) } if newValue != -1024 { t.Errorf("expected new value to be -1024; got %d", newValue) } idAlloc, err := newIDAllocator(keys.RaftIDGenerator, store.ctx.DB, 2, 10, stopper) if err != nil { t.Errorf("failed to create IDAllocator: %v", err) } value, err := idAlloc.Allocate() if err != nil { t.Fatal(err) } if value != 2 { t.Errorf("expected id allocation to have value 2; got %d", value) } }
// Increment increments the value (interpreted as varint64 encoded) and // returns the newly incremented value (encoded as varint64). If no value // exists for the key, zero is incremented. func (r *Range) Increment(batch engine.Engine, ms *engine.MVCCStats, args proto.IncrementRequest) (proto.IncrementResponse, error) { var reply proto.IncrementResponse newVal, err := engine.MVCCIncrement(batch, ms, args.Key, args.Timestamp, args.Txn, args.Increment) reply.NewValue = newVal return reply, err }
// Increment increments the value (interpreted as varint64 encoded) and // returns the newly incremented value (encoded as varint64). If no value // exists for the key, zero is incremented. func (r *Range) Increment(batch engine.Engine, ms *engine.MVCCStats, args *proto.IncrementRequest, reply *proto.IncrementResponse) { val, err := engine.MVCCIncrement(batch, ms, args.Key, args.Timestamp, args.Txn, args.Increment) reply.NewValue = val reply.SetGoError(err) }