Proj THUDBFuzz Paper Reading: PMFuzz: Test Case Generation for Persistent Memory Programs

github: https://github.com/Systems-ShiftLab/PMFuzz

2. Background and Motivation

2.1 Programming for PM Systems & 2.2 Nontrivial Bugs in PM Programming

P1: PM(Persistent Memory)介绍,举例Intel-Optane
强调特性:直接通过Memory总线来读写数据,无需软件中间层
强调应用场景:数据库,kvstores
对PM要求:数据能够在发生故障之后仍能恢复

P2: PM编程难点:需要仔细管理读写来保证crash consistency
难点例子:
在presistent链表中添加一个新节点就需要该新节点是尾端指针的persistent prior
难点在编程上带来的变化:

  1. 为了描述写入顺序(write order),硬件通常会提供writeback和fence 指令,例如CLWB和SFENCE
    此外,还有Intel's PMDK这种支持failure-atomic transaction的PM libraries
  2. coder必须明白自己调用的指令的crash consistency guarantees,并且需要据此设计failure-recovery mechanism。
    该难点带来的bug:
  3. crash consistency bug: 违反了crash consistency guarantee
  • 例如: 错误使用了PM原语或者库函数,该用CLWB或者SFENCE的地方没用,没有及时备份数据
  1. performance bug:
  • 在不必要的地方使用了PM crash consistency相关的功能,或者不必要的backups

P3: 目前的工具:
一般方法:跟踪low-level PM operations,检查是否违反了persistence和ordering guarantees
局限:只能检查执行后的trace,不能检查没触发的
例如:

TX_ADD_FIELD() 宏将句柄 o 引用的对象的给定 FIELD 的当前值保存在撤消日志中。 然后应用程序可以自由地直接修改指定的 FIELD。 如果发生故障或中止,将恢复保存的值。
https://www.mankier.com/3/pmemobj_tx_add_range

在这个例子中,TX_ADD_FIELD让items[p]可变,但是实际上变的却是items[p-1],形成crash consistency。
此外,两个函数中各log一次,形成performance bug
此外,作者还认为条件语句if(!parent && node->n< BTREE_MIN)和 if(lsb && lsb->n > BTREE_MIN)都会导致这个trace不一定被触发

本文的方式是优化test case generator

2.3 Requirements for Fuzzing PM Programs

P1: 介绍fuzzing基本原理

P2: 例2

例2是一个简化版的基于PMDK会话而构建的数据库逻辑流程。
在这个例子中,如果在已经设置TX_ADD_FIELD(line 28)之后,执行D_RW(pm)->ptable[index]->tail->en=newEntry(val))(line 32)时出现故障,那么对应的位已经被标注,但是该数据域本身可能没有成功update,那么就会造成inconsistent。

PM相关程序对test case提出的额外要求:

  1. PM Image as Input
  • 考虑到PM程序结束后,Persistent状态还会继续存在(一般是通过维护一个PM image),测试用例应当把PM state也考虑进去
  • 加载PM image这一行为本身也会导致crash consistency bugs
  • 挑战(传统fuzzers应对不了的)
    • PM image比较大,一般至少也有十几MB,传统fuzzer没法探索这么大的输入空间
    • 需要符合PM data layout
  1. Crash Image as Input
  • 本文认为PM programs应当能够从crash images中恢复
  1. Targeting PM Operations
  • test case需要集中测试与PM相关的机制

3. High-level Design of PMFuzz

  1. 为了生成valid PM images,利用程序本身(不同的input commands会生成不同的PM images)生成PM images并记录下来
  2. 考虑到bug触发一般只因为几个key blocks,只生成会影响failure-recovery的控制流的crash images
  • 例如,在undo-logging行为中,程序一般要先备份旧数据,设置undo log位,进行in-placesupdate,然后取消undo log位,在故障发生后,程序一般会先检查the valid bit of undo log来确定是否consistent,对这一逻辑,我们只需要为undo log设为true和false就能测到全部逻辑路径
  1. 对接触PM的程序路径做targeted fuzzing,具体来说,监视PM相关path的统计信息,优先变异能够覆盖更多PM paths的test cases
posted @ 2021-07-29 19:17  雪溯  阅读(89)  评论(0编辑  收藏  举报