错误: RepairDB 将具有空最小/最大内部键的表推送到 Encode,导致断言失败
□ 总结
Repairer:ScanTable ' 跟踪是否通过 " 空 " 旗找到任何有效的密钥,但在将桌子推入 " tables -- -- " 之前只检查其位置。 当一个被腐蚀的SST以“确定状态”打开,但每个键都失败了“Parse InternalKey”时,该表被按下默认构造的“最小的”/“最大的”“内部Key's;“Writ Descriptionor”后来称为“InternalKey:Encode()”,它声称!rep .empty()'和流产。
□ 版本( O)
$ git 描述 -- tags
1.23-91-g7ee830d (韩语).□ 说明
db/reair.cc ' 中的扫描表 ' 扫描每个表格取出最小'/最大':
翻译: //db/修复.cc:249-290(节选) 布尔空 = 真; 已解析的 InternalKey; 用于( iter- > SeekToFirst (); iter- > Valid (; iter- > Next ()) { 剪切键 = 长- > 键 (); 如果(!Parse InternalKey( 键, & parsed)) { 继续; // 已损坏的密钥跳过; 空保留为正 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? c. 反++; 如果(空) { 空 = 虚假; t.meta.est.DecodeFrom(钥匙); {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? t.meta.most.DecodeFrom(钥匙); {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 如果 (!iter- > status (.ok ()) { 状态 = iter- > status (); {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? //. (状态.ok()){ 表格 .push back(t); // BUG:即使空出正则也按 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
当 SST 的数据块被损坏但索引块和页脚完好无损时, `Table: Open' 成功, 执行器会以“ 确定” 状态输出条目 。 每个键的字节都是垃圾,因此"Parse InternalKey"('db/dbformat.h:171')为每个字节返回错误——或者键短于8字节,或者字节类型超过"kTypeValue". 循环从未进入身体,`对接 ' 保持0,`空'保持真实,`t.meta. smallest'/`mallest'从未有人居住。 然而,由于`状况 ' 并无问题,该表被推入`表'(空的-`rep `')`InternalKey's。
后来,“写下描述器”按顺序排列每个表格:
翻译:
//db/修理.cc:368-372
用于(大小 t i = 0;i < table . six (;i++) {
const表Info & t =表 [i];
编辑 . AddFile (0, t.meta. number, t.meta.file size, t.meta. smallest, ), (中文(简体) ).
t.meta.最大;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?Version Edit:Encode To ' calls f. smallest. ' (中文(简体) ). Encode () , 点击 :
翻译: //db/dbformat.h:149-151 (中文(简体) ). 切片编码 () const { profile (!rep .repty ()); // CRASH 语言 返回重写 ; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
这是库错误, 不是 API 滥用 :
- `RepairDB'是一个公开的`LEVELDB-EXPORT' API(`Including/leveldb/db.h:157-163')作为无法打开的数据库的恢复工具——“尽可能重新公布内容”。 腐败是预期的投入,而不是被禁止的投入。
- " Scantable " 已保留 " 空 " 旗跟踪是否找到任何有效钥匙,但仅 " 状态.ok() " 上第288行警卫的推力却忽略了 " 空 " 。
- `InternalKey'本身的构建者评论(`db/dbformat.h:139')说,空的`rep'表示`无效'-然而,图书馆将一个无效的`InternalKey'推入`表',后来通过`Encode()'无条件将其序列化,该表声称图书馆本身所违反的极不稳定。
- 断言检查** 内部状态** (`rep `-不空'),不是
. . . . . . .内容来源: google/leveldb