• f2fs解析(一)f2fs如何解决wandering tree


    wandering tree问题是log-structured 文件系统(LFS) 特有的一个问题,因为LFS的脏数据是追加更新的,所以如果一个数据块变脏了,那么那个数据块的直接索引块、间接索引块都会变脏(因为索引的地址变脏)。F2FS是如何解决这个问题呢?

    我们知道F2FS中main area中共有两种类型的block:NODE和DATA,其中NODE存储文件的元数据,DATA存储文件实际的数据。其中NODE类型的block包括三类元数据:inode,直接dnode,间接dnode。其中直接dnode的每一个表项指向的是一个DATA block的地址,而间接dnode的每一个表项指针指向的NAT表中的一个表项

    这是F2FS解决wandering tree问题的关键F2FS引入了NAT(node address table),其中每个表项的结构是:

    struct f2fs_nat_entry {
        __u8 version;       /* latest version of cached nat entry */
        __le32 ino;     /* inode number */
        __le32 block_addr;  /* block address */
    } __packed;
    

    NAT表是个大数组,每个数组元素就是上面的f2fs_nat_entry。引入NAT表项是F2FS解决wandering tree问题的关键,因为这样每当有数据块更新的之后,只有与其直接相关的dnode才会变脏,各间接dnode是不会变脏的。怎么实现的?

    上面说到,直接dnode的表项指向的是DATA block的地址,所以DATA page变脏了之后,DATA block就要变更了,所以被殃及的直接dnode当然也脏喽。但是注意,此时火势并不会蔓延到间接dnode上,因为间接dnode表项指针指的并不是直接dnode的block地址,而是NAT表中的一个表项,所以NAT就像防火枪一样防止了tree任意滋生:你只要把NAT中相应的block_addr域给更新掉就可以了,我间接dnode的指针还是指向这个NAT表项,不变!巧妙!

    有兴趣的同学可以研究下C++中虚函数的实现,与此处异曲同工。

  • 相关阅读:
    AJPFX总结hashmap和hashtable的区别
    AJPFX分享JAVA修饰符详解
    AJPFX分享java排序之希尔排序
    Mysql框架---HMySql
    html/css实现聊天布局
    Java连接Mysql
    微信小程序九宫格布局
    Android设计模式——MVP
    iOS与H5交互(WKWbebView)
    iOS MJExtension的使用
  • 原文地址:https://www.cnblogs.com/honpey/p/4808798.html
Copyright © 2020-2023  润新知