深入浅出 jackrabbit 十 redolog 和 recovery.docx
2009-09-17 00:00:00 来源:WEB开发网从上面的代码中,我们得到了一个重要的信息,redolog有append和flush的功能,没啥好说的,其实就是一个文件操作。
关键的在于什么时候把数据写到磁盘上,这个才是重点。从上面的代码中看到,只有是事务提交Action.TYPE_COMMIT或者添加一个索引目录Action.TYPE_ADD_INDEX的时候才会把redolog中的数据刷到磁盘上。
这里面有两个原因,第一个原因是缓存的问题,由于VolatileIndex的存在,导致很多新的document对应的索引数据其实是放在内存中的,这一点在前面的文章中有详细的描述,那么一旦crash,内存中的数据毫无疑问会消失,索引线程成功的将document的索引数据生成在内存中,该索引线程成功返回,这个时候当机,那么这条索引线程之前所做的操作就白费了,所以就需要在索引线程返回之前,将内存中的对应记录放在文件中。这样即使当机,重启之后依然能否通过redolog恢复之前因为当机而消失的索引数据(如果索引线程在做索引的过程中当机,比如说代码还没有运行到redolog的时候当机,这种case神仙也救不了,认了吧)。
第二个原因是因为indexes文件,在前面的索引合并逻辑中,我们详细的讲过,每次合并都会产生新的目录,那么考虑下面这个场景:
1 VolatileIndex中index数据对应的document超过100个
2创建一个PersistentIndex(同时也创建了一个目录),并将这个新建的目录情况加入到redolog,但是并不将其刷到磁盘
3将VolatileIndex中的数据拷贝到PersistentIndex
4 将这个新的PersistentIndex加入到indexes文件中(该目录保存着所有有效索引目录的列表,一旦机器crash,那么就可以根据这个文件中包含的目录来打开indexreader),虽然说加进去,但是这个时候还没有刷到磁盘上,也只是加在内存中。
Tags:深入浅出 jackrabbit redolog
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接