Skip to content

Commit

Permalink
Check data type before metadata decode to avoid confusing error messa…
Browse files Browse the repository at this point in the history
…ge (#2015)
  • Loading branch information
jihuayu authored Jan 17, 2024
1 parent 69b054e commit 0723ae1
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 7 deletions.
5 changes: 4 additions & 1 deletion src/storage/redis_db.cc
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ rocksdb::Status Database::ParseMetadata(RedisTypes types, Slice *bytes, Metadata
});

auto s = metadata->Decode(bytes);
if (!s.ok()) return s;
// delay InvalidArgument error check after type match check
if (!s.ok() && !s.IsInvalidArgument()) return s;

if (metadata->Expired()) {
// error discarded here since it already failed
Expand All @@ -69,6 +70,8 @@ rocksdb::Status Database::ParseMetadata(RedisTypes types, Slice *bytes, Metadata
auto _ [[maybe_unused]] = metadata->Decode(old_metadata);
return rocksdb::Status::InvalidArgument(kErrMsgWrongType);
}
if (s.IsInvalidArgument()) return s;

if (metadata->size == 0 && !metadata->IsEmptyableType()) {
// error discarded here since it already failed
auto _ [[maybe_unused]] = metadata->Decode(old_metadata);
Expand Down
12 changes: 6 additions & 6 deletions src/storage/redis_metadata.cc
Original file line number Diff line number Diff line change
Expand Up @@ -335,13 +335,13 @@ rocksdb::Status ListMetadata::Decode(Slice *input) {
if (auto s = Metadata::Decode(input); !s.ok()) {
return s;
}
if (Type() == kRedisList) {
if (input->size() < 8 + 8) {
return rocksdb::Status::InvalidArgument(kErrMetadataTooShort);
}
GetFixed64(input, &head);
GetFixed64(input, &tail);

if (input->size() < 8 + 8) {
return rocksdb::Status::InvalidArgument(kErrMetadataTooShort);
}
GetFixed64(input, &head);
GetFixed64(input, &tail);

return rocksdb::Status::OK();
}

Expand Down
54 changes: 54 additions & 0 deletions tests/gocase/unit/type/types_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

package types

import (
"context"
"testing"

"github.com/apache/kvrocks/tests/gocase/util"
"github.com/stretchr/testify/require"
)

func TestTypesError(t *testing.T) {
srv := util.StartServer(t, map[string]string{})
defer srv.Close()
ctx := context.Background()
rdb := srv.NewClient()
defer func() { require.NoError(t, rdb.Close()) }()

t.Run("Operate with wrong type", func(t *testing.T) {
message := "ERR Invalid argument: WRONGTYPE Operation against a key holding the wrong kind of value"
require.NoError(t, rdb.Set(ctx, "a", "hello", 0).Err())
require.EqualError(t, rdb.Do(ctx, "XADD", "a", "*", "a", "test").Err(), message)
require.EqualError(t, rdb.Do(ctx, "LPUSH", "a", 1).Err(), message)
require.EqualError(t, rdb.Do(ctx, "HSET", "a", "1", "2").Err(), message)
require.EqualError(t, rdb.Do(ctx, "SADD", "a", "1", "2").Err(), message)
require.EqualError(t, rdb.Do(ctx, "ZADD", "a", "1", "2").Err(), message)
require.EqualError(t, rdb.Do(ctx, "JSON.SET", "a", "$", "{}").Err(), message)
require.EqualError(t, rdb.Do(ctx, "BF.ADD", "a", "test").Err(), message)
require.EqualError(t, rdb.Do(ctx, "SADD", "a", 100).Err(), message)

require.NoError(t, rdb.LPush(ctx, "a1", "hello", 0).Err())
require.EqualError(t, rdb.Do(ctx, "SETBIT", "a1", 1, 1).Err(), message)
require.EqualError(t, rdb.Do(ctx, "GET", "a1").Err(), message)

})
}

0 comments on commit 0723ae1

Please sign in to comment.