https://tanxinyu.work/tinykv/#%E6%96%87%E6%A1%A3
Part 1 : Implement a standalone storage engine
本部分是对底层 badger api 的包装,主要涉及修改的代码文件是 standalone_storage.go, 需要实现 Storage 接口的 Write 和 Reader 方法,来实现对底层 badger 数据库的读写。
1.Write 部分实现思路
Write 部分涉及到 Put 和 Delete 两种操作。
因为 write_batch.go 中已经实现了对 badger 中 entry 的 put 和 delete 操作,我们只需要判断 batch 中的每一个 Modify 的操作类型,然后直接调用 write_batch.go 中相对应的方法即可。
2.Reader 部分实现思路
Reader 部分会涉及到 point read 和 scan read 两种不同读方式。
因为提示到应该使用 badger.Txn 来实现 Reader 函数,所以我们声明了一个 badgerReader 结构体来实现 StorageReader 接口,badgerReader 结构体内部包含对 badger.Txn 的引用。
针对 point read,
我们直接调用 util.go 中的 GetCF 等函数,对 cf 中指定 key 进行读取。
针对 scan read,
直接调用 cf_iterator.go 中的 NewCFIterator 函数,返回一个迭代器,供 part2 中调用。
Part 2 : Implement raw key/value service handlers
本部分需要实现 RawGet/ RawScan/ RawPut/ RawDelete 四个 handlers,主要涉及修改的代码文件是 raw_api.go
针对 RawGet,
我们调用 storage 的 Reader 函数返回一个 Reader,然后调用其 GetCF 函数进行点读取即可,读取之后需要判断对应 key 是否存在。
针对 RawScan,
同样地调用 storage 的 Reader 函数返回一个 Reader,然后调用其 IterCF 函数返回一个迭代器,然后使用迭代器读取即可。
针对 RawPut 和 RawDelete,
声明对应的 Modify 后,调用 storage.Write 函数即可。
make project1 > lab1.txt
实际执行指令
GO111MODULE=on go test -v —count=1 —parallel=1 -p=1 ./kv/server -run 1
通过全部的测试
//lab1.txt
GO111MODULE=on go test -v --count=1 --parallel=1 -p=1 ./kv/server -run 1
=== RUN TestRawGet1
--- PASS: TestRawGet1 (0.03s)
=== RUN TestRawGetNotFound1
--- PASS: TestRawGetNotFound1 (0.02s)
=== RUN TestRawPut1
--- PASS: TestRawPut1 (0.02s)
=== RUN TestRawGetAfterRawPut1
--- PASS: TestRawGetAfterRawPut1 (0.05s)
=== RUN TestRawGetAfterRawDelete1
--- PASS: TestRawGetAfterRawDelete1 (0.02s)
=== RUN TestRawDelete1
--- PASS: TestRawDelete1 (0.02s)
=== RUN TestRawScan1
--- PASS: TestRawScan1 (0.02s)
=== RUN TestRawScanAfterRawPut1
--- PASS: TestRawScanAfterRawPut1 (0.24s)
=== RUN TestRawScanAfterRawDelete1
--- PASS: TestRawScanAfterRawDelete1 (0.21s)
=== RUN TestIterWithRawDelete1
--- PASS: TestIterWithRawDelete1 (0.20s)
PASS
ok github.com/pingcap-incubator/tinykv/kv/server 0.857s