Skip to content

Commit

Permalink
Add best effort mechanism to return non-expired randomkey in 128 tries
Browse files Browse the repository at this point in the history
  • Loading branch information
xanish committed Oct 16, 2024
1 parent b08ff9d commit 0960371
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 8 deletions.
24 changes: 18 additions & 6 deletions internal/eval/eval.go
Original file line number Diff line number Diff line change
Expand Up @@ -5147,13 +5147,25 @@ func evalRANDOMKEY(args []string, store *dstore.Store) *EvalResponse {
}

if len(availKeys) > 0 {
randKeyIdx, err := rand.Int(rand.Reader, big.NewInt(int64(len(availKeys))))
if err != nil {
return &EvalResponse{Result: nil,
Error: errors.New(string(diceerrors.NewErrWithMessage("could not generate a random key seed")))}
}
maxIters := 128
for range maxIters {
randKeyIdx, err := rand.Int(rand.Reader, big.NewInt(int64(len(availKeys))))
if err != nil {
continue
}

return &EvalResponse{Result: availKeys[randKeyIdx.Uint64()], Error: nil}
randKey := availKeys[randKeyIdx.Uint64()]
keyObj := store.Get(randKey)
if keyObj == nil {
continue
}

currTimeMs := uint64(utils.GetCurrentTime().UnixMilli())
expireTimeMs, isExpirySet := dstore.GetExpiry(keyObj, store)
if (isExpirySet && expireTimeMs > currTimeMs) || !isExpirySet {
return &EvalResponse{Result: clientio.Encode(randKey, false), Error: nil}
}
}
}

return &EvalResponse{Result: clientio.RespNIL, Error: nil}
Expand Down
7 changes: 5 additions & 2 deletions internal/eval/eval_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1166,11 +1166,14 @@ func testEvalRANDOMKEY(t *testing.T, store *dstore.Store) {
results := make(map[string]int)
for i := 0; i < 10000; i++ {
result := evalRANDOMKEY([]string{}, store)
results[result.Result.(string)]++
if res, ok := result.Result.([]byte); ok {
results[string(res)]++
}
}

for key, _ := range data {
if results[key] == 0 {
returnedKey := clientio.Encode(key, false)
if results[string(returnedKey)] == 0 {
t.Errorf("key %s was never returned", key)
}
}
Expand Down

0 comments on commit 0960371

Please sign in to comment.