文件系统的核心问题是存储。这里面隐含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. CentOS出错You don't have permission to access on this server

    之前配置phpmyadmin的时候,在浏览器上输入http://192.168.8.250/phpmyadmin/ 也遇到了You don't have permission to access on ...

  2. 服务器知识----IIS架设问题

    1,基本配置,应用程序池,路径等. 2,权限设置  Iuser  IIS_users 只读权限 3,isapi映射  framework安装目录下  运行 aspnet_regiis.exe -i 注 ...

  3. EF – 6.一对一关联

    5.6.6 <一对一关联概述>  5.6.7 <一对一关联CRUD演示>  在两讲视频中,首先介绍了数据库中一对一关联表的设计规范,接着通过实例介绍了如何合适Entity Fr ...

  4. CXF学习(2) helloworld

    0.新建一个项目取名wsserver. pom.xml 文件如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xml ...

  5. scala的tcp通信

    client: object ActorClient extends App { import actors.Actor, actors.remote.Node, actors.remote.Remo ...

  6. 利用IdentityServer3在ASP.NET 5和Angular中实现OAuth2 Implicit Flow

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:之前介绍过的IdentityServer3虽然是基于Katana开发的,不过同样可以托 ...

  7. App界面交互设计规范

    策划007-App界面交互设计规范 字数1805 阅读3544 评论20 喜欢154 交互设计规范 在上篇<策划006-APP界面设计风格>确定下来后,产品经理(兼交互设计)还不用着急将所 ...

  8. "Project facet Java version 1.7 is not supported"的问题解决的办法

    问题描述 在eclipse中,从SVN中检出project代码,拖拽式部署到local server中的时候,报出以下错误: 问题分析 问题产生的原因是,SVN中的代码是采用java 1.7开发编译的 ...

  9. Java中继承thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  10. thinkphp数据表操作恐怖事件。

    1当使用thinkphp的where(array())时,如果里面的字段在数据库是没有的,则默认这个条件为1,这时就可能出现大批修改记录问题.如修改所有用户的密码.特别要注意的是,这里的表字段是区分大 ...