curvefs client删除文件和目录功能设计Session机制: • 遗留问题 • 工作量评估 ## 背景 目前curvefs client版本对删除unlink和rmdir的设计只有简单的删除inode和dentry结构,遗留了nlink和lookup count相关的内容还未实现,是不完备的。本文首先调研moosefs,chubaofs等分布式系统,参考并设计解决上述遗留问题。 当前删除接口代码如下: CURVEFS_ERROR ret; ## 存在两个问题: 一是删除时nlink字段未考虑: 文件的nlink用于实现hard link。hard link使用nlink字段表示文件的link的引用计数,第一次创建文件是nlink字段为1。每创建一个新的指向该文件的hard link时,nlink字段+1,每删除一个hard link或指向的原文件时,nlink字段-1。 当nlink字段减到0时,才真正删除inode。所以在 实现unlink接口或rmdir接口时,需要判断unlink字段的当前值,当nlink字段大于1时,只减nlink字段就可以了,当nlink字段减到0时,才真正的执行删除inode。目录的nlink字段与文件的nlink字段不同,目录的nlink字段初始值为2,并且在目录下,每创建一个新目录,nlink字段也会+1,删除目录nlink相应的减1。 目录不支持硬链接。 ## 二 是删除时lookup0 码力 | 15 页 | 325.42 KB | 1 年前3
Django CMS 2.4.x Documentation0 码力 | 104 页 | 709.98 KB | 1 年前3
Scrapy 0.9 Documentation0 码力 | 204 页 | 447.68 KB | 2 年前3
Firebird Null Guide: NULL behaviour and pitfalls in Firebird SQL0 码力 | 69 页 | 479.63 KB | 2 年前3
CurveFS rename 接口实现方案1. 将源文件的 nlink 加一 2. 创建目标文件的 dentry 3. 删除源文件的 dentry 4. 将源文件的 nlink 减一 而每一步骤都有可能出错,chubaofs 针对以上的 4 步骤中出现的错误处理如下: 1. 步骤 1 出错,啥事都没发生 2. 步骤 2 出错,等同于创建硬连接出错,恢复机制如下: 1. 将源文件的 nlink 减一 3. 步骤 步骤 3 出错,相当于创建了硬链接,但是没有删除源文件,此时源文件和目标文件同时存在,恢复机制如下: 1. 删除目标文件 dentry 2. 将源文件的 nlink 减一 备注:如果这一步骤出错,并且恢复机制没有执行成功,那么会导致一些问题: (1)用户不能在源目录或目标目录下创建相应文件了,因为文件名被占用了(如 rename /dir1/file1 /dir2/file2,既不能在 /dir1 并且因为存在硬链接,不能通过再次 rename 来获取成功(一般用户 rename 返回失败后,有可能希望再次执行 rename 以获得成功) 4. 步骤 4 出错,会导致 inode 有可能没办法被正常回收(nlink 始终大于 0),恢复机制如下: 1. 对于这一步出错,没有恢复机制,与 unlink 操作失败一样的处理(因为 dentry 删除了,而 inode 却没被回收,会被当成孤儿节点去处理) 如果采用0 码力 | 15 页 | 555.93 KB | 1 年前3
Curve文件系统元数据持久化方案设计copyset-3  Raft Log |字段|字节数|说明| |---|---|---| |type|1|操作类型,共有以下2类:• SET (OX01):ADD和UPDATE都可以转换成SET操作• DEL (OX02):当为DEL操作时, |\[value\_length]|4|value长度| |\[value]|$value\_length|编码后的value| |checksum|8|前面5部分的校验和| Raft Snapshot ## 持久化文件 |字段|字节数|说明| |---|---|---| |CURVEFS|7|magic number(常量字符 "CURVEFS"),用于标识该文件为 curvefs 元数据持久化文件| | |size|8|键值对数量| |key\_value\_pairs|/|键值对(当 size 为 0 时,该字段为空)| |EOF|1|特殊标记常量(0xFF),表示内容已结束| |check\_sum|8|保存校验和(根据前 5 个部分内容计算得出)| ## key_value_pairs |字段|字节数|说明| |---|---|---| |key\_length|4|key 的长度| |key0 码力 | 12 页 | 384.47 KB | 1 年前3
Curve文件系统元数据管理(cfs)|有元数据服务器|inode → b tree (key ino)dentry → b tree (key parentIno + name)|extent → B+ tree这个在inode的ExtentsTree字段|meta partition (raft group)Btree、B+ tree|好|有tiny extent, 多个文件共用normal extent, 属于一个文件|partition|append→ |glusterfs|无中心化服务器dht算法 hash扩展时大量迁移|client缓存inode→ has table (gfid)dentry→ has table (name)|inode扩展属性字段|和写数据一样|好|||写多份|overwrite 有数据不一致风险| |curve|有元数据服务器|lru cache缓存kv → has table (key parent inode + name)|segmentkv uint32_t uid; /* user id */ uint32_t gid; /* group id */ uint32_t mode; /* file mode */ int nlink; /* ref count for hard link */ int64_t size; FileType type; SpaceList std::map0 码力 | 24 页 | 204.67 KB | 1 年前3
Curve支持S3 数据缓存方案required uint32 uid = 7; required uint32 gid = 8; required uint32 mode = 9; required sint32 nlink = 10; required FsFileType type = 11; optional string symlink = 12; // TYPE_SYM_LINK only ## FsSync流程 1. 循环获取FileCacheManager,执行Flush函数。 ## 后台流程 1. 在 FsCacheManager 中增加一个 DataCacheNum 字段,如果该字段为 0,表示没有 cache 需要 flush,则线程由条件变量控制处于 wait 状态。 2. write 流程会对后台线程处于 wait 状态的情况触发 notify 唤醒,同时修改 DataCacheNum。0 码力 | 9 页 | 179.72 KB | 1 年前3
Python 标准库参考指南 3.6.15 Decimal 及其子类)的时候,该函数会临时性地将 LC_CTYPE 区域设置为 LC_NUMERIC 区域以解码 localeconv() 的 decimal_point 和 thousands_sep 字段,如果它们是非 ASCII 字符或长度超过 1 字节的话,并且 LC_NUMERIC 区域会与 LC_CTYPE 区域不一致。这个临时更改会影响其他线程。 在 3.6.5 版更改: 当使用 n 类型格式化数字时 映射键(可选),由加圆括号的字符序列组成(例如(somename))。 3. 转换旗标(可选),用于影响某些转换类型的结果。 4. 最小字段宽度(可选)。如果指定为 '*'(星号),则实际宽度会从 values 元组的下一元素中读取,要转换的对象则为最小字段宽度和可选的精度之后的元素。 5. 精度(可选),以在 '.'(点号)之后加精度值的形式给出。如果指定为 ' 映射键(可选),由加圆括号的字符序列组成(例如(somename))。 3. 转换旗标(可选),用于影响某些转换类型的结果。 4. 最小字段宽度(可选)。如果指定为 '*'(星号),则实际宽度会从 values 元组的下一元素中读取,要转换的对象则为最小字段宽度和可选的精度之后的元素。 5. 精度(可选),以在 '.'(点号)之后加精度值的形式给出。如果指定为 '0 码力 | 1886 页 | 8.95 MB | 1 年前3
Python 标准库参考指南 3.6.15 decimal.Decimal及其子类)的时候,该函数会临时性地将 LC_CTYPE区域设置为 LC_NUMERIC区域以解码 localeconv()的 decimal_point和 thousands_sep字段,如果它们是非 ASCII字符或长度超过1字节的话,并且 LC_NUMERIC区域会与 LC_CTYPE区域不一致。这个临时更改会影响其他线程。 在3.6.5版更改:当使用n类型格式化数字时,该函 映射键(可选),由加圆括号的字符序列组成(例如(somename))。 3. 转换旗标(可选),用于影响某些转换类型的结果。 4. 最小字段宽度(可选)。如果指定为 ' \star ' (星号),则实际宽度会从 values 元组的下一元素中读取,要转换的对象则为最小字段宽度和可选的精度之后的元素。 5. 精度(可选),以在'.'(点号)之后加精度值的形式给出。如果指定为 映射键(可选),由加圆括号的字符序列组成(例如(somename))。 3. 转换旗标(可选),用于影响某些转换类型的结果。 4. 最小字段宽度(可选)。如果指定为 ' \star ' (星号),则实际宽度会从 values 元组的下一元素中读取,要转换的对象则为最小字段宽度和可选的精度之后的元素。 5. 精度(可选),以在 '.'(点号)之后加精度值的形式给出。如果指定为0 码力 | 1886 页 | 8.95 MB | 1 年前3
共 766 条
- 1
- 2
- 3
- 4
- 5
- 6
- 77













