MD中的bitmap(5) - Bitmap的清除

 

在前面描述的设置流程中,涵盖了全部的bitmap用户能够看到的流程,这些流程中只有bit的设置,但没有bit的清除。对于可以清除的bit,最多只是设置了所在的filemapCLEAN属性,没有实际的清除filemap中的bit和写入磁盘。

Bitmapbit清除工作是在bitmap_daemon_work函数中进行的,这个函数又在md_check_recovery中被调用,而md_check_recovery是在磁阵的守护进程中首先被调用的,所以实际上守护进程每次运行时,都要调用到bitmap_daemon_work

这个函数完成这样一些工作:

1.      如果bitmap_daemon_work没有睡够,则直接返回。这个睡眠是为了将一定时间内的写盘操作集中批量处理。

2.      对于每个bit,取出其对应的filemap页:

                     i.            如果该页没有设置CLEANBITMAP_PAGE_NEEDWRITE(下文简写为NEEDWRITE)属性,则跳过该bit。如果没有设置CLEAN,而设置了NEEDWRITE,则将该filemap页写入磁盘,清除该页的NEEDWRITE标志,结束本bit的处理。

                   ii.            如果该页设置了CLEAN标记,则清除该页的CLEAN标记。本次bitmap_daemon_work执行中,清除该页的CLEAN标记只有这一次的机会,如果在iv中又一次设置了该页的CLEAN标志,则只能等到下一次函数调用才会再清除它了。

                  iii.            如果页中的所有bit都处理结束后,如果该页的CLEAN标记被清除过(如果没有清除过则不会记入oldpage中的),判断页的NEEDWRITE被设置,则清除该标志,将该页写入磁盘;否则设置NEEDWRITE标志,结束该页的处理。

                  iv.            获取该bit的内存结构,(如果NEEDRESYNC都没有设置,)COUNT2,表明该bit对应的磁阵数据段已经没有写访问,设COUNT等于1,设置该bit对应的filemapCLEAN属性;如果COUNT1,设置COUNT等于0,清除filemap中对应bit。继续下一bit的处理。

 

这个函数的逻辑比较绕,但我们可以看到真正执行filemapbit清除的工作是在该bit对应的内存结构的COUNT1后进行的,而写盘操作是在filemap页的状态为NEEDWRITE后进行的。所以要理清逻辑关系,还需要对bitCOUNTfilemap的状态变化以及相互的关系做一个详细的了解:

1.               COUNTbit对应的磁阵数据段上正在进行的写操作的计数器,但012三个值比较特殊,这三个值都说明该数据段上没有写操作进行,真正的写操作数是从2开始累加的(bitmap_startwrite)。但0表示bit没有设置,1表示bit已经设置,2表示所有写操作刚刚结束。在清除阶段,COUNT2,则设置所在filemap页的CLEAN属性,表示该页有bit需要清除。

2.               filemap页的属性,CLEAN表示该页有bit需要清除;程序逻辑里,在CLEAN清除后,会设置页的NEEDWRITE标志。在NEEDWRITE标志设置后的下一次调用,则会把bitmap写入磁盘。

3.               为简化分析,可以以一个bit,一个页来进行分析:

a)       在磁阵对应内存段上写操作全部结束,bit对应的内存结构的COUNT2时,此时设置filemapCLEAN属性。

b)       bitmap_daemon_work启动后,发现该页属性为CLEAN,则清除CLEAN标记。清除后,看到COUNT2,又再次设置这个CLEAN标志,COUNT等于1。由于已经清除过一次CLEAN,所以filemap的页的NEEDWRITE标志被设置。对于这个bit和页来说,本次bitmap_daemon_work调用结束。

c)       下一次再次调用到bitmap_daemon_work后,由于CLEAN标记被设置,所以这次再被清除。由于COUNT1,所以设置COUNT等于0,清除filemapbit位,并且filemap也的NEEDWRITE属性被设置,所以进行了写盘。

4.               从流程分析看,这个逻辑存在一些缺陷,还是以一个bit的变化为例,如果在步骤bc之间,该bit对应的数据段又发生了写操作,则c将不会清除bit位,此时的写盘也就没有必要。

5.               再者,CLEAN标记被清除一次后,就会设置NEEDWRITE标志,filemap中其他bit也存在再次设置CLEAN的可能。而这个再次设置显得混乱了,感觉应该在该页的所有bit处理完成后,再对页的CLEAN标记进行清除。

6.               另外,在bitmap_endwrite函数中,如果所有写请求完成后,COUNT已经为2bitmap_endwrite函数也设置了filemapCLEAN属性,和bitmap_daemon_work判断COUNT2时再次设置CLEAN存在重复。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值