非易失存储中Undo_Log的逻辑和代码范例

Undo_Log 逻辑是在修改数据之前,先将待修改的数据做Log,并将Log的数据写到非易失性存储器中,然后再来修改原数据,并将原数据写到 非易失性存储器中(这个 认为是in_place的update)。

以修改数组中数据为例,代码实例:

// TODO Undo logging
memcpy(&UNDO_LOG[log_index],&mem[off],sizeof(block_t));
_mm_sfence();

clwb(&UNDO_LOG[log_index]); //TODO consider BLOCK_SIZE
logged =1;
clwb(&logged);
_mm_sfence();
mem[off].values[4] = 'R';

clwb(&num);
clwb(&mem[off].values[4]); //TODO consider BLOCK_SIZE
 
//TODO //clwb one blocks after all writes in this block have been finished.
_mm_sfence();

logged = 0; //TODO consider merge log_tag and log_index to one cache line
log_index++;
if(log_index==log_size)
{
log_index=0;
}
clwb(&log_index);
clwb(&logged);
_mm_sfence();
 
过程中注意,Log的数据包括了两个部分,第一个是描述Log数据部分的metadata,另一个是Log的具体数据。
posted @ 2019-04-03 09:40  拖地基  阅读(174)  评论(0)    收藏  举报