作者:Sanjay Ghemawat
          Howard Gobioff
          Shun-Tak Leung
翻译:tinyfool

4.1 名称空间管理和锁

主服务器的许多操作会花费较长的时间:例如,快照操作必须取消快照内容涵盖的所有块服务器的租约。我们不希望这些操作的运行延迟其他的主服务器操作。所以我们允许多个操作同时进行,用名称空间的区域之上的锁来保证相应的秩序。

不同于许多传统文件系统的是,GFS没有一个用来列出目录内全部文件的,每个目录的数据结构。而且不支持同一文件或者目录的别名(Unxi术语中的符号链接或者硬链接)。GFS展现名称空间的逻辑就像一个全路径映射到元数据的查找表。利用前缀压缩,这个表可以高效的在内存中展现。名称空间树内的每个节点(绝对路径文件名和绝对路径目录名)都有一个与之对应的读写锁。

每个主服务器操作运行之前都需要获得一系列的锁。例如,如果操作包含/d1/d2/.../dn/leaf,首先获得目录/d1,/d1/d2,...,/d1/d2/.../dn的读取锁,以及全路径/d1/d2/.../dn/leaf的读写锁。注意leaf可以是一个文件也可以是一个目录,这取决于操作本身。

现在我们演示锁机制如何在/home/user被快照到/save/user的时候,防止文件/home/user/foo的创建。快照操作获得/home和/save的读取锁,以及/home/user和/save/user的写入锁。文件创建操作获得/home和/home/user的读取锁,以及/home/user/foo的写入锁。这两个操作会顺序执行,因为它们试图冲突地获取/home/user的锁。文件创建操作不去请求父目录的写入锁,因为这里没有"目录",或者类似inode的数据结构,用来防止修改。文件名的读取锁完全可以防止父目录被删除。

这种锁方案的好的属性是它支持对同一目录的并行操作。例如,同一个目录的多个文件创建操作可以并行执行:每一个操作获得目录名的读取锁和文件名本身的写入锁。目录名的读取锁完美的防止目录被删除,改名以及被快照。文件名的写入锁保证不会创建同名文件两次。

因为名称空间可以有许多节点,所以读写锁需要的时候才会被分配,一旦不再使用就会被删除。锁的获取依据一个全局一致的顺序来避免死锁:首先由名称空间的层次决定顺序,统一层次内的锁顺序由字典顺序决定。


<< 4. 主服务器的操作 | 4.2 副本布置 >>