[tinykv]: Project1 关于 TestRawDelete1 断言的疑问

先上官方提供的测试用例程序:

func TestRawDelete1(t *testing.T) {
	conf := config.NewTestConfig()
	s := standalone_storage.NewStandAloneStorage(conf)
	s.Start()
	server := NewServer(s)
	defer cleanUpTestData(conf)
	defer s.Stop()

	cf := engine_util.CfDefault
	assert.Nil(t, Set(s, cf, []byte{99}, []byte{42}))

	req := &kvrpcpb.RawDeleteRequest{
		Key: []byte{99},
		Cf:  cf,
	}

	_, err := server.RawDelete(nil, req)
	assert.Nil(t, err)

	val, err := Get(s, cf, []byte{99})
	assert.Equal(t, nil, err)
	assert.Equal(t, []byte(nil), val)
}

我的疑问是:

func TestRawDelete1(t *testing.T) {
	// ...
	cf := engine_util.CfDefault
	assert.Nil(t, Set(s, cf, []byte{99}, []byte{42}))

	req := &kvrpcpb.RawDeleteRequest{
		Key: []byte{99},
		Cf:  cf,
	}

	_, err := server.RawDelete(nil, req)
	assert.Nil(t, err)
       // 键 []byte{99} 经过删除后,再次进行读取
       // 为什么 `err` 应该满足 `assert.Equal(t, nil, err)` ?
       // 这里的断言是否有错误?
	val, err := Get(s, cf, []byte{99})
	assert.Equal(t, nil, err)
	assert.Equal(t, []byte(nil), val)
}

我的执行结果是:

=== RUN   TestRawDelete1
    server_test.go:199: 
        	Error Trace:	server_test.go:199
        	Error:      	Not equal: 
        	            	expected: <nil>(<nil>)
        	            	actual  : *errors.fundamental(Key not found)
        	Test:       	TestRawDelete1

如果可以的话,谢谢大家的帮助和回复!

1赞

应该key不存在,不应该返回error, 应该返回err == nil,value == nil

2赞

key不存在,不应该返回error吧,关于value返回“”或者nil 其实都行吧

2赞

这个异常是在 badger 内抛出的,我的实现中把它放到了 raw_api.go 层去处理。

按照上述信息推断的话,正确的做法可能是在 storage 实现层将 “Key not found” 异常处理掉,返回数据值以 nil 作为 raw_api.go 层 RawGetResponse#NotFound 的依据。

/cc HhhuYu

1赞

空字符串可能会混淆一些 Value == "" 的情况,不建议那么做。

1赞

对于这种情况 数据库就不应该存这个值,在redis中 就是采用这种方法的

2赞

我看了一下badger中的源码,好像是直接将KeyNot Found 的err包装进结构体

然后engine_util下也是直接返回, 导致执行逻辑的时候拿到的err不是nil值

所以需要自己再包装一层比较好

2赞

在实现StorageReader的GetCF方法时,需要对key不存在的情况进行判断,返回的value,error均为nil

2赞