berkeley db write ahead logging的代码实现
2016-02-26 14:11
453 查看
下面的代码保证了BDB 的write ahead logging机制. 在写database page之前, 确保此page buffer对应的log lsn已经 sync到 disk上.
思考:
1. 若写buffer page前, 不保证log lsn已经 sync到 disk上. 则可能程序crash时, database page已经修改, 但没有对应的 log. 则db recover时对 db page的修改无法回滚.
2. 若在 log sync和 写buffer page之间, 程序crash, 则db page没有修改, 但对应的log已经在磁盘上. 这没有关系, recover时 此log record的lsn和db page lsn不一致, 表明 此db修改未被写磁盘, 忽略.
//src/mp/mp_bh.c, __memp_pgwrite() /* * If the page is in a file for which we have LSN information, we have * to ensure the appropriate log records are on disk. */ if (LOGGING_ON(env) && mfp->lsn_off != DB_LSN_OFF_NOTSET && !IS_CLIENT_PGRECOVER(env)) { memcpy(&lsn, bhp->buf + mfp->lsn_off, sizeof(DB_LSN)); if (!IS_NOT_LOGGED_LSN(lsn) && (ret = __log_flush(env, &lsn)) != 0) goto err; } // ... /* Write the page. */ if ((ret = __os_io(env, DB_IO_WRITE, dbmfp->fhp, bhp->pgno, mfp->pagesize, 0, mfp->pagesize, buf, &nw)) != 0) { #ifndef HAVE_ATOMICFILEREAD atomic_dec(env, &mfp->writers); #endif __db_errx(env, DB_STR_A("3015", "%s: write failed for page %lu", "%s %lu"), __memp_fn(dbmfp), (u_long)bhp->pgno); goto err; } // ...
思考:
1. 若写buffer page前, 不保证log lsn已经 sync到 disk上. 则可能程序crash时, database page已经修改, 但没有对应的 log. 则db recover时对 db page的修改无法回滚.
2. 若在 log sync和 写buffer page之间, 程序crash, 则db page没有修改, 但对应的log已经在磁盘上. 这没有关系, recover时 此log record的lsn和db page lsn不一致, 表明 此db修改未被写磁盘, 忽略.
相关文章推荐
- Eclipse插件开发之快速向导
- asp.net程序中如何使用皮肤更换的小功能
- JAVA 的 RandomAccessFile类用法
- PHP关于上传的有关配置
- Java语言的基础组成
- 一位阿里技术的总结
- Java反射—结合框架谈注解
- Mac Eclipse的svn连接不上的解决过程
- Masonry代码自动布局的简单使用。
- 1059. Prime Factors (25)
- C语言函数参数的传递详解
- C语言中全局变量、局部变量、静态全局变量、静态局部变量的区别
- Java类加载器
- C# 命名规范
- C#Winform程序如何发布并自动升级(图解)
- C# winform程序怎么打包成安装项目(图解)
- exit()与die()在PHP中的区别
- JAVASE基础 Item -- IO流之字符流
- PHP反射(ReflectionClass、ReflectionMethod)在ThinkPHP框架的控制器调度模块中的应用
- javaWeb项目读取properties配置文件