随笔分类 -  berkeley db代码阅读

摘要:postgres 同理的code: backend/cdb/cdblogsync.c, createZeroFilledNewFile() 看代码随手记:log_put.c, __log_write() 我的理解:在flush log时使用fdatasync, 若log文件长度发生变化, 则仍需要写 阅读全文
posted @ 2017-01-05 23:41 brayden 阅读(224) 评论(0) 推荐(0)
摘要:tail queue是bdb中用的最多的数据结构. 定义在 src/dbinc/queue.h: 注: TRACEBUF,QMD_TRACE_HEAD等是为了 queue代码的debug, 这里移除出去. 数据结构 ======== ``` // type 即为 用户定义的 类型. 比如 db.h, // struct __db_txn { // * TAILQ_HEAD(__... 阅读全文
posted @ 2016-08-25 09:45 brayden 阅读(769) 评论(0) 推荐(0)
摘要:对bdb log来说, 在共享内存中 有一块 buffer, 同时每一个 log cursor 都自带一个 malloc的buf. why? 我认为: region buffer存的是log最末尾, 主要用来写. 毕竟 log 是 顺序写的, 最末尾的 log rec当然最热. 同时 多个 log 阅读全文
posted @ 2016-08-19 15:51 brayden 阅读(244) 评论(0) 推荐(0)
摘要:# txn.h struct __db_txnregion SH_TAILQ_HEAD(__active) active_txn; SH_TAILQ_HEAD(__mvcc) mvcc_txn; # txn.c, __txn_begin_int(), txn 加入的 buffer version 不可以被看见. MAX_LSN(td->visibl... 阅读全文
posted @ 2016-08-19 15:49 brayden 阅读(247) 评论(0) 推荐(0)
摘要:http://www.cnblogs.com/promise6522/archive/2012/05/09/2493542.html 阅读全文
posted @ 2016-08-17 16:20 brayden 阅读(154) 评论(0) 推荐(0)
摘要:dirty reader怎样 不被writor block住? 如数据库支持dirty read, 则 所有打开的dbhandle都配置 DB_READ_UNCOMMITTED; 在线程拿到 write锁并做完处理后(比如splite one page), 降为 was_write锁. WWRITE 阅读全文
posted @ 2016-08-17 13:16 brayden 阅读(573) 评论(0) 推荐(0)
摘要:__memp_alloc() 注: MPOOL_ALLOC_SEARCH_DYN 没有 出现在 bdb document上, 也没出现在 除了mp_alloc外的代码里. 先删了 以便代码清楚. 按 mpool初始化代码来看, 一个hash bucket上 假定为 2.5个buffer. 查找有 三 阅读全文
posted @ 2016-08-17 13:15 brayden 阅读(787) 评论(0) 推荐(0)
摘要:priority based lru in src/mp/mp_fget.c, __memp_fget(), 初始化 一个page buffer时, 设置其 priority: in src/mp/mp_fget.c, __memp_fput(), 对一个page buffer做put, 使其ref 阅读全文
posted @ 2016-08-17 13:15 brayden 阅读(437) 评论(0) 推荐(0)
摘要:repmgr_method.c, __repmgr_start_int()repmgr_method.c, __repmgr_start_msg_threads()repmgr_msg.c, __repmgr_msg_thread()message_loop() while ((ret = __re 阅读全文
posted @ 2016-08-17 13:14 brayden 阅读(197) 评论(0) 推荐(0)
摘要:repmgr/repmgr_net.c, __repmgr_send(): 做send_broadcast, 然后根据policy 对DB_REP_PERMANENT的处理 __repmgr_send_broadcast(): 对每个site, send_connection(). MASTER 发 阅读全文
posted @ 2016-08-17 13:13 brayden 阅读(555) 评论(0) 推荐(0)
摘要:repmgr_method.c, __repmgr_start_int() 初始2个elect线程. repmgr_elect.c, __repmgr_init_election() __repmgr_elect_thread() __repmgr_elect_main() lease, prefe 阅读全文
posted @ 2016-08-17 13:13 brayden 阅读(170) 评论(0) 推荐(0)
摘要:txn/txn.c, __txn_prepare(), 对比 __txn_commit(). 基本只差了 写一个 commit log rec; 释放写锁; 释放内存数据结构等. td->status = TXN_PREPARED; __txn_abort(), 对 已经TXN_PREPARED 的 阅读全文
posted @ 2016-03-23 14:46 brayden 阅读(197) 评论(0) 推荐(0)
摘要:mux_win32.c 和mut_tas.c的实现类似: 在mut_pthread.c 中, 不去spin: SELF_BLOCK语义: 初始化mtx后, 马上lock一次. 再一次 lock则当前线程(可以不是第一次lock的线程)被锁住. 通过tas 标志位. 因为mtx标志位已经设置, 再次l 阅读全文
posted @ 2016-03-03 12:28 brayden 阅读(303) 评论(0) 推荐(0)
摘要:原文链接: http://www.cnblogs.com/promise6522/archive/2012/05/27/2520028.html 写的很棒也很详细. 摘要: fsync需要sync文件修改和 metadata; fdatasync则只在必要的时候才sync metadata, 可以节 阅读全文
posted @ 2016-02-29 11:35 brayden 阅读(623) 评论(0) 推荐(0)
摘要:想了解 berkeley db的底层实现, Margo Seltzer 和 Keith Bostic的这篇文章是必须要看的: http://www.aosabook.org/en/bdb.html 一直想翻译过来, 不过太懒了. 今天在网上看到已经有人做过翻译的工作了, 链接: http://www 阅读全文
posted @ 2016-02-29 10:38 brayden 阅读(181) 评论(0) 推荐(0)
摘要:berkeley db的组提交机制 见 src/log/log_put.c, __log_flush_int(). 一个 事务 是否已经提交, 关键看其在log里是否有 commit log 记录, 并且此log记录已经sync到磁盘上了. 所以transaction commit, flush l 阅读全文
posted @ 2016-02-28 23:13 brayden 阅读(487) 评论(0) 推荐(0)
摘要:BDB中 内存池是用一个 hash table来管理 buffers. 这个hash table的大小首先是和 内存池的大小成正比. 其次, bdb code会经常遍历hash chain, 它的长度 不能太大. 计算公式为: cache 大小/region数目 = 每个region的大小 buck 阅读全文
posted @ 2016-02-26 22:43 brayden 阅读(490) 评论(0) 推荐(0)
摘要:一个典型的 buddy system. 代码在env/env_alloc.c 数据结构: ALLOC_LAYOUT: 管理整块内存(即bdb的某个region)的 数据结构. 放于此内存 开头位置. SH_TAILQ_HEAD(__addrq) addrq; // address queue. 按地 阅读全文
posted @ 2016-02-26 17:44 brayden 阅读(742) 评论(0) 推荐(0)
摘要:下面的代码保证了BDB 的write ahead logging机制. 在写database page之前, 确保此page buffer对应的log lsn已经 sync到 disk上. //src/mp/mp_bh.c, __memp_pgwrite() /* * If the page is 阅读全文
posted @ 2016-02-26 14:11 brayden 阅读(385) 评论(0) 推荐(0)