设为首页 加入收藏

TOP

MongoDB源码概述――日志(二)
2014-11-24 03:13:36 来源: 作者: 【 】 浏览:7
Tags:MongoDB 源码 概述 ―日志
len);

其实调用上两个函数的潜台词就是,我现在干了什么事,你给我把他完整的记录下来,如果我这件事没有最终被保存到磁盘的话,我就需要你这个负责记录的模块拿出原来所做的记录,我来进行恢复操作,以确保数据万无一失!

二.如何记录用户操作
在这个模块,用户的操作类型实际上可以归类为两种,一种是基本写操作,一种是非基本写操作。对数据的新增和修改等都可以认为是写操作,而类似与创建文件(FileCreatedOp),删除数据库(DropDbOp)操作都是非基本写操作,这类操作建模为DurOp.最终这两种操作都会在CommitJob:: note()与CommitJob::noteOp()进行内存存储。
基本写操作会被D结构体封装,我们来看下他的结构:
  
struct D {

void *p;//用户更改的数据源首地址

unsigned len;//用户更改的数据长度

static void go(const D& d);

};


基本写记录会被存储到Writes类在CommitJob类的实例_wi,继而存储到TaskQueue在Writes类的实例_deferred.
非基本写记录会被存储到Writes类的vector< shared_ptr > _ops;
这个流程有很多个类参与,下面用两张顺序图来总结这一流程。
调用getDur().writingPtr的时序图


调用getDur().createdFile的时序图

至此为止,用户操作日志在内存的记录操作就完成了。接下来要讲到如何序列化内存中的记录,以备持久化到磁盘.

今日至此,下面两点下次结合其他的文章一起写。
如何序列化用户操作并持久化
如何根据现有Journal日志恢复数据
后会有期......
博客地址:Zealot Yin
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇什么是优化器统计信息?----系列二 下一篇ReportingServicetextbox换行

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++中智能指针的性能 (2025-12-25 03:49:29)
·如何用智能指针实现c (2025-12-25 03:49:27)
·如何在 C 语言中管理 (2025-12-25 03:20:14)
·C语言和内存管理有什 (2025-12-25 03:20:11)
·为什么C语言从不被淘 (2025-12-25 03:20:08)