欢迎来到天天文库
浏览记录
ID:33520587
大小:63.50 KB
页数:6页
时间:2019-02-26
《device mapper中的例外结构》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、DeviceMapper中的例外结构LVM快照实现采用的是copyonfirstwrite机制,其中一个重要的概念是例外。例外即快照映射关系,表明快照源上的数据在快照创建之后进行过修改,改变之前的数据从快照源设备的某一个chunk已经拷贝到或正在拷贝到快照上另一个chunk。为了体现这种映射关系,例外(exception)结构体含有两个相当直观但是却很重要的chunk域:structexception{structlist_headhash_list;//链入已完成例外哈希表或待处理例外哈希表中。chunk_told_chunk;//快照源设备上的chunk,称为“旧chu
2、nk”chunk_tnew_chunk;//快照设备上的chunk,称为“新chunk”};一个快照含有多个这样的例外信息,这些信息构成例外表。我们可以采用哈希表的方式来组织例外表。例外结构体的hash_list域用于将其链接到哈希表中。哈希值的计算方法为例外结构体的old_chunk和哈希表的哈希掩码(hash_mask)执行“与”操作。structexception_table{uint32_thash_mask;structlist_head*table;};在快照(dm_snapshot)中,有两种形式的例外表:已经完成的例外表(structexception_ta
3、blecomplete)和正在处理的例外表(structexception_tablepending)。已经完成的例外使用的就是上面的exception结构体,表明我们已经将快照源设备(origin)在old_chunk位置处的数据拷贝到快照设备(cow)的new_chunk位置处。上层应用请求的数据块可以通过这个映射关系取得。而等待处理的例外表映射关系虽然已经生成,但是还没有将快照源设备上的数据拷贝到快照设备上。这时上层应用的I/O请求无法即刻响应,必须将请求缓冲起来,等待数据迁移结束后进行,因此,待处理结构体pending_exception需要存储更多的信息。快照的已
4、完成例外哈希表和待处理例外哈希表分别对应exception_table结构体类型的pending和complete域。这里采用了一种类似面向对象编程中的“多态性”技术。虽然pending_exception结构体内容更丰富,但是只要将exception结构体最为它的一个域,我们就可以同一套哈希表处理模式。structdm_snapshot{……structdm_dev*origin;structdm_dev*cow;……structexception_tablepending;structexception_tablecomplete;……};structpending_e
5、xception{structexceptione;//将例外结构体作为其中一个域……//其它域};(I)将例外或待处理例外插入哈希表中。staticvoidinsert_exception(structexception_table*eh,structexception*e);Ø对于已完成例外,其调用方式如下:structdm_snapshot*s;structexception*e;insert_exception(&s->complete,e);Ø对于待处理例外,其调用方式如下:structdm_snapshot*s;structpending_exception*p
6、e;insert_exception(&s->pending,&pe->e);(II)从哈希表中删除例外或待处理例外。staticinlinevoidremove_exception(structexception*e);Ø对于待处理例外,其调用方式如下:structpending_exception*pe;remove_exception(&pe->e);(III)在例外哈希表中查找和指定chunk(快照源设备上的chunk号)对应的例外。staticstructexception*lookup_exception(structexception_table*et,chu
7、nk_tchunk);Ø对于已完成例外,使用方式如下:structdm_snapshot*s;structexception*e;e=lookup_exception(&s->pending,chunk);if(e){……}Ø对于待处理例外,使用方式如下:structdm_snapshot*s;structexception*e;structpending_exception*pe;e=lookup_exception(&s->pending,chunk);if(e){/*将例外显式转换为待处理例外*/pe=lis
此文档下载收益归作者所有