文件系统的核心问题是存储。这里面隐含2个问题:1)存储什么?2)存储到哪里?文件系统中的各种技术手段都是如何高效的解决这2个问题。ubifs用node标准化每一个存储对象,用lprops描述每一个逻辑块空间,用TNC组织管理所有的node对象,用LPT组织管理所有的lprops对象。
 
node
          ubifs中除了存储用户数据,还要存储索引节点、目录项、超级块等数据。这些数据结构各异,差异很大,为了统一数据视图,便于管理,ubifs标准化了所有数据的表现形式,所有数据以node表示呈现。并根据不同用途对node进行分类、存储和组织。ubifs的node汇总介绍如下。
          黑色部分为通用的文件系统数据,红色部分为ubifs专有的文件系统数据。

TNC
          因为 UBIFS_INO_NODE,UBIFS_DATA_NODE,UBIFS_DENT_NODE,UBIFS_XENT_NODE,UBIFS_TRUN_NODE节点数量巨大,ubifs采用 B+树用于管理这些节点。各节点在树中的index为(inode, key2),如上图所示,不同的node有不同的key2。其目的就是能根据index快速找到叶节点数据所在的位置,但是B+树的index节点数量多,更新很慢,如果这个过程中被打断,叶节点文件就丢失了。所以在commit tnc前,先把叶节点文件的数据信息commit到log区,这样既提高了速度,也保证在tnc commit失败的情况下,叶节点文件也能通过log区找到,并replay到tnc。
 
journal replay

          从数据的角度看,recovery的过程就是将(leb, offs) list进过加工处理,映射成{key: [leb, offs, len]} B+tree的过程。
          日志回放的详细过程如下:
          从log区中获取ref node((leb, offs) ),从ref node获取bud所在位置信息(leb:offs),构造内存对象bud,并根据此信息 scan这一段leb,筛选出无效的node,将有效的node加入sleb->nodes,以备后面replay,如果是最后一个bud并需要recovery,将leb:0-offs这段异地备份到另一个peb上。
把sleb->nodes上的node处理成replay_entry,并加入到c->replay_list,然后根据replay_list,构造成ubifs_zbranch({key: [leb, offs, len]})对象更新到TNC B+树上,然后将已replay的buds leb块的free和dirty空间、dirty标记等lprop属性信息
 
sync
          如果在unclean reboot前,没有调用sync,buf中的数据由于没有同步到flash,将可能破坏ubifs文件系统。
          sync会调用ubifs_run_commit进行所有的数据提交。
          如果调用sync过程中断电,
          如果在wbuf commit前或者过程中断电,文件将丢失,这需要应用层主动调用sync来保证。但wbuf commit很快,这是小概率事件;
          如果在log commit前断电,文件将丢失,这需要应用层主动调用sync来保证。
          如果在log commit过程中断电,文件还是会丢失。但log commit很快,这是小概率事件;
          其他情况下,比如gc commit前、或者tnc commit前或者过程中断电,文件不会丢失,因为可以从log区replay。
 
lprops
          ubifs用node对象解决存储对象的问题,用lprops对象解决存储位置问题。要决定新的对象存储到哪里,就需要获取整个存储空间的使用视图数据以辅助决策。
          lprops对象用(lnum,free,dirty)元组信息完成对一个逻辑块的使用视图的描述。通过把所有的lprops对象组织成LPT B+tree,可以快速查询更新某个lnum逻辑块的使用视图信息。因为LPT的key是lnum,所有无法快速查询到most free或most dirty的逻辑块,在这种需求基础上,ubifs对lprops进行分类组织,满足对free lnum(空间分配)或dirtry lnum(垃圾回收)的快速查询需求。
 
 
LPT
          lpt B+tree用于管理ubifs逻辑块属性对象 lprops,B+tree的index为lnum。其目的就是根据lnum,快速查询、更新逻辑块的信息(主要是free、dirty等信息)。
 
--EOF--
 

ubifs核心对象 -- TNC和LPT的更多相关文章

  1. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  2. ASP.NET Core的路由[2]:路由系统的核心对象——Router

    ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路由参数的形式解析出来供后续请求处理流 ...

  3. Asp.Net WebApi核心对象解析(上篇)

    生活需要自己慢慢去体验和思考,对于知识也是如此.匆匆忙忙的生活,让人不知道自己一天到晚都在干些什么,似乎每天都在忙,但又好似不知道自己到底在忙些什么.不过也无所谓,只要我们知道最后想要什么就行.不管怎 ...

  4. Three.js 入门指南(核心对象)

    推荐大家可以看看这个:http://wenku.baidu.com/link?url=RQU2exzV_EF3GATc3bzQU2o9LGMuCmiN5nUJth5SLG3E2TrxtBLQodJU_ ...

  5. Ajax的核心对象创建步骤

    * Ajax具有核心对象 * XMLHttpRequest对象 * 如何创建XMLHttpRequest对象 function getXhr(){ // 声明XMLHttpRequest对象 var ...

  6. 我心目中的Asp.net核心对象

    转:http://www.cnblogs.com/fish-li/archive/2011/08/21/2148640.html 阅读目录 开始 HttpRuntime HttpServerUtili ...

  7. 路由系统的核心对象——Router

    路由系统的核心对象--Router ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路 ...

  8. ASP.NET Ajax核心对象

    本章学习目标 主要掌握AJAX的基本概念和实现机制,学习并创建XMLHttpRequest对象,使用XMLHttpRequestObject对象获取服务器端的数据 主要内容如下,请点击ASP.NET ...

  9. ASP.NET Web API的核心对象:HttpController

    ASP.NET Web API的核心对象:HttpController 对于ASP.NET Web API来说,所谓的Web API定义在继承自ApiController的类中,可能ApiContro ...

随机推荐

  1. mysql列类型

    mysql三大列类型 整型 tinyint(占据空间:1个字节 存储范围  有符号  -128-127   无符号  0-255) smallint   mediumint    int    big ...

  2. python中random模块使用

  3. 苹果开发者账号申请时报错提示错误:Legal Entity Name

    he information you entered did not match your profile in the D&B database. Before submitting you ...

  4. SQL语法中的子查询Subqueries

    记一下样子. 明白它的应用场景. SELECT account_id, product_cd, cust_id, avail_balance FROM account WHERE open_emp_i ...

  5. SQL中的多表查询,以及JOIN的顺序重要么?

    说法是,一般来说,JOIN的顺序不重要,除非你要自己定制driving table. 示例: SELECT a.account_id, c.fed_id, e.fname, e.lname -> ...

  6. 豆瓣的账号登录及api操作

    .douban.php <?php /** * PHP Library for douban.com * * @author */ class doubanPHP { function __co ...

  7. WPF QuickStart系列之数据绑定(Data Binding)

    这篇博客将展示WPF DataBinding的内容. 首先看一下WPF Data Binding的概览, Binding Source可以是任意的CLR对象,或者XML文件等,Binding Targ ...

  8. CQRS及.NET中的参考资料

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:CQRS作为一种设计模式,其实一点都不新鲜了.不过今天有朋友感叹.NET朋友也关注CQ ...

  9. [荐]SWFObject 2最新版语法调用示例

    我一直都在用SWFObject 插入flash,好处多多,代码简洁,不会出现微软的“单击此处以激活控件”的提示(据可靠消息,这个是微软惹的官司,其结果是害苦了用户).不过先前的 调用方法着实有些繁琐, ...

  10. memset中的sizeof

    记录memset中的sizeof的用法, unsigned char *buff = (unsigned char*) malloc(128 * sizeof(char)); //错误的:memset ...