mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-10-10 21:07:53 +00:00
fix ID allocation API after disco
The ID allocation API was broken because the operations were removed from the list allowed in the NORMAL cluster state. Additionally the operations were set to only run on non-primaries (where they were actually only supposed to run on the primary).
This commit is contained in:
parent
ec899bcc64
commit
2f4a2bf98f
2 changed files with 52 additions and 6 deletions
15
api.go
15
api.go
|
|
@ -2174,10 +2174,10 @@ func (api *API) ReserveIDs(key IDAllocKey, session [32]byte, offset uint64, coun
|
|||
snap := topology.NewClusterSnapshot(api.cluster.noder, api.cluster.Hasher, api.cluster.ReplicaN)
|
||||
|
||||
if !snap.IsPrimaryFieldTranslationNode(api.NodeID()) {
|
||||
return api.holder.ida.reserve(key, session, offset, count)
|
||||
return nil, errors.New("cannot reserve IDs on a non-primary node")
|
||||
}
|
||||
|
||||
return nil, errors.New("cannot reserve IDs on a non-primary node")
|
||||
return api.holder.ida.reserve(key, session, offset, count)
|
||||
}
|
||||
|
||||
func (api *API) CommitIDs(key IDAllocKey, session [32]byte, count uint64) error {
|
||||
|
|
@ -2189,10 +2189,10 @@ func (api *API) CommitIDs(key IDAllocKey, session [32]byte, count uint64) error
|
|||
snap := topology.NewClusterSnapshot(api.cluster.noder, api.cluster.Hasher, api.cluster.ReplicaN)
|
||||
|
||||
if !snap.IsPrimaryFieldTranslationNode(api.NodeID()) {
|
||||
return api.holder.ida.commit(key, session, count)
|
||||
return errors.New("cannot commit IDs on a non-primary node")
|
||||
}
|
||||
|
||||
return errors.New("cannot commit IDs on a non-primary node")
|
||||
return api.holder.ida.commit(key, session, count)
|
||||
}
|
||||
|
||||
func (api *API) ResetIDAlloc(index string) error {
|
||||
|
|
@ -2204,10 +2204,10 @@ func (api *API) ResetIDAlloc(index string) error {
|
|||
snap := topology.NewClusterSnapshot(api.cluster.noder, api.cluster.Hasher, api.cluster.ReplicaN)
|
||||
|
||||
if !snap.IsPrimaryFieldTranslationNode(api.NodeID()) {
|
||||
return api.holder.ida.reset(index)
|
||||
return errors.New("cannot reset IDs on a non-primary node")
|
||||
}
|
||||
|
||||
return errors.New("cannot reset IDs on a non-primary node")
|
||||
return api.holder.ida.reset(index)
|
||||
}
|
||||
|
||||
// TranslateIndexDB is an internal function to load the index keys database
|
||||
|
|
@ -2351,4 +2351,7 @@ var methodsNormal = map[apiMethod]struct{}{
|
|||
apiGetTransaction: {},
|
||||
apiActiveQueries: {},
|
||||
apiPastQueries: {},
|
||||
apiIDReserve: {},
|
||||
apiIDCommit: {},
|
||||
apiIDReset: {},
|
||||
}
|
||||
|
|
|
|||
43
api_test.go
43
api_test.go
|
|
@ -16,6 +16,7 @@ package pilosa_test
|
|||
|
||||
import (
|
||||
"context"
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
"math"
|
||||
"reflect"
|
||||
|
|
@ -626,3 +627,45 @@ func TestAPI_ClearFlagForImportAndImportValues(t *testing.T) {
|
|||
panic(fmt.Sprintf("expected %v, observed %v starting acct0 balance", acct0bal, 0))
|
||||
}
|
||||
}
|
||||
|
||||
func TestAPI_IDAlloc(t *testing.T) {
|
||||
c := test.MustRunCluster(t, 3)
|
||||
defer c.Close()
|
||||
|
||||
primary := c.GetPrimary().API
|
||||
|
||||
key := pilosa.IDAllocKey{
|
||||
Index: "index",
|
||||
Key: "key",
|
||||
}
|
||||
var session [32]byte
|
||||
_, err := rand.Read(session[:])
|
||||
if err != nil {
|
||||
t.Fatalf("obtaining random bytes: %v", err)
|
||||
}
|
||||
|
||||
const toReserve = 2
|
||||
|
||||
ids, err := primary.ReserveIDs(key, session, ^uint64(0), toReserve)
|
||||
if err != nil {
|
||||
t.Fatalf("reserving IDs: %v", err)
|
||||
}
|
||||
|
||||
var numIds uint64
|
||||
for _, idr := range ids {
|
||||
numIds += (idr.Last - idr.First) + 1
|
||||
}
|
||||
if numIds != toReserve {
|
||||
t.Errorf("expected %d ids but got %d: %v", toReserve, numIds, ids)
|
||||
}
|
||||
|
||||
err = primary.CommitIDs(key, session, numIds)
|
||||
if err != nil {
|
||||
t.Fatalf("committing IDs: %v", err)
|
||||
}
|
||||
|
||||
err = primary.ResetIDAlloc(key.Index)
|
||||
if err != nil {
|
||||
t.Fatalf("resetting ID alloc: %v", err)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue