从零开始使用 ToplingDB
示例代码(省略了错误处理,完整版在这里)
从 RocksDB 迁移到 ToplingDB,只需要修改 Open/Close 相关的代码,其它代码不用任何改动。
1 |
|
1. Open
SidePluginRepo
是 ToplingDB SidePlugin 的核心 class,所有组件都被包含在其中,要使用 SidePlugin,就要先定一个 SidePluginRepo
对象:
1 | SidePluginRepo repo; |
有了 SidePluginRepo
对象,接下来就是导入配置参数,最便捷的方式是调用 ImportAutoFile
,该函数根据文件后缀名自动识别 json 和 yaml 文件:
1 | repo.ImportAutoFile(argv[1]); // argv[1] is json/yaml conf file |
现在,我们可以打开 DB 了:
1 | DB* db = nullptr; |
在 RocksDB 中,我们一般使用 DB::Open
,少数情况下使用其它 Open 函数,但是在 SidePlugin 中,我们统一用 OpenDB
,具体使用的是哪个 Open 函数,是在 json/yaml 中进行配置的:例如 Todis从结点。
在这个例子中我们使用的是默认的,只有一个 ColumnFamily 的 DB,但其实 OpenDB
是个重载的函数,也可以用来 Open 有多个 ColumnFamily 的 DB(后面修改的 db_bench 就是这样的例子):
1 | DB_MultiCF* dbmcf = nullptr; |
2. 启动内嵌的 Http Web Server
理论上,内嵌的 Http Web Server 可以在 Open 中自动启动,但是,我们仍然决定让用户来显式启动:
1 | repo.StartHttpServer(); |
主要有三个原因:
- 用户可以显式打开同一个 json/yaml 中定义的多个 DB,但内嵌的 Http 只有一个
- 以 RocksDB 的接口风格,错误处理使用返回值
Status
,难以使用同一个Status
来区分,DB Open 与 Http 的错误信息 - 即使 json/yaml 中定义了 http,用户也可能并不想启用内嵌的 Http Web Server
3. Close
需要显式 Close,就一行代码:
1 | repo.CloseAllDB(); |
进一步参考:在 ToplingDB 中使用 CompactionFilter
复杂一点的:db_bench 针对 ToplingDB 的修改
db_bench_tool.cc
是一个 8000 多行的文件,我们让它支持 ToplingDB,只新增了 47 行代码,
无任何其它修改,就拥有了 ToplingDB 的全部能力!以下是 diff 内容:
1 | diff --git a/tools/db_bench_tool.cc b/tools/db_bench_tool.cc |