-
Archives
- January 2012
- December 2011
- August 2011
- July 2011
- June 2011
- April 2011
- March 2011
- February 2011
- January 2011
- December 2010
- November 2010
- October 2010
- September 2010
- August 2010
- July 2010
- June 2010
- May 2010
- April 2010
- March 2010
- February 2010
- January 2010
- December 2009
- November 2009
- October 2009
- September 2009
- August 2009
- July 2009
- June 2009
- May 2009
- April 2009
- March 2009
- February 2009
- January 2009
- December 2008
- November 2008
- October 2008
- September 2008
- August 2008
- July 2008
- June 2008
-
Meta
Monthly Archives: September 2008
Berkeley DB 恢复与 ARIES 算法
恢复函数总的入口:__db_apprec。 恢复过程分为几个阶段: 0、首先确定要打开哪些文件以及打开位置。 1、找到需要处理的事务列表。如果某个日志记录的 prev_lsn 是 [0][0],说明这是该事务的第一条日志记录。如此一来便知道哪些事务开始了。 2、从日志结尾往前读取,将最近检查点之后开始的事务撤消。 3、将最近检查点之后崩溃之前提交的事务重做。这也是数据库恢复的一般理论的应用。
Berkeley DB 中的部分 LOG类型
__dbreg_register __dbreg_register_log DB___dbreg_register=2 用于记录数据库文件的打开关闭。 opcode说明参见:log.h中的 /* File open/close register log record opcodes. */ #define DBREG_CHKPNT 1 /* Checkpoint: file name/id dump. */ #define DBREG_CLOSE 2 /* File close. */ #define DBREG_OPEN 3 /* File open. */ #define DBREG_PREOPEN 4 /* … Continue reading
关于 mprotect
以下例子在 Linux 上编译通过。 $ ./a.out Start of region: 0x804c000 Got SIGSEGV at address: 0x804e000
Posted in 系统编程
Leave a comment
Berkeley DB 日志系统
事务和LOG,LOCK是紧密联系在一起的。 日志记录函数、打印函数和恢复函数: 恢复函数: 参考db_auto.c中 __db_init_recover添加的一批recover函数。除了这里以外,在其它的几个地方也有: 比如txn_auto.c、qam_auto.c、hash_auto.c、fileops_auto.c、btree_auto.c等文件中,这些文件似乎都是日志函数,他们记录了相关操作的日志行为。每个恢复函数和一个日志记录函数、一个打印函数相对应。
Berkeley DB Replication中的选举
在Replication Manager中使用DB_REP_ELECTION启动时,它只要求一个所参与环境中的简单大多数选举出一个master。计算这个简单大多数的方法基于DB_ENV->rep_set_nsites()。 Replication Manager同时提供了一些启动标志来让你对选举进行控制:
Berkeley DB 中的锁子系统(LOCK)
对于一个游标,它的lock_dbt和lock是2个和锁有关的字段: DBT lock_dbt; DB_LOCK_ILOCK lock; 前一个字段用一个DBT结构表示一个锁; 后一个字段表示要上锁的对象。这个对象由3个字段组成:页号(pgno),文件ID(fileid),锁类型组成。 前一个字段的data字段正好指向后一个字段。 在游标初始化过程中(__db_cursor_int函数),页号并没有指定。在具体调用时才赋值,比如在__db_lget中。 由于数据库的修改操作基本都是通过游标完成(包括直接的DB->put),所以上锁解锁都是借由游标完成。 对于新产生的锁持有者均通过__lock_getlocker_int函数加入到DB_LOCKREGION的lockers中和DB_LOCKTAB的locker_tab中。 锁持有者和 被锁的对象 被分布在 2个Hash表中。可以参考lock目录中的Design。这种锁结构设计也是教科书上提到过的。 对于每个锁持有者__db_locker,2个字段用来标识它和锁的关系: heldby字段是它所持有的锁(__db_lock)的列表; links字段是锁持有者Hash列表中下一个持有者。 对于每个锁(__db_lock),它有3个字段用来表示和锁持有者和 被锁住对象的 关系: holder:标识持有这个锁的持有者; links:标识这个锁是在被锁住对象的持有者 列表 还是等待者列表上; locker_links:标识对应锁持有者持有的下一个锁。 对于每个被上锁的对象(__db_lockobj),它有几个字段标识锁和被锁的关系: links:对象Hash列表中的下一个对象; waiters:等待持有这个对象的锁列表; holders:持有这个对象的锁列表; __db_lockobj中的__db_ilock保存的是对象的描述(包括页号pgno,文件ID fileid,和类型)。还用SH_DBT表示这个对象在共享区域(region)的大小和偏移。 未完。