文件锁支持方案

背景

为保证对同一文件元数据操作的正确性,需要将对元数据的操作串行化,所以需要文件锁的支持

方案

NameServer中,设置一个FileLockManager,用来负责保证单个文件元数据操作的原子性,FileLockManager为每个正在进行元信息修改的文件或目录维护一个内存结构LockEntry,该结构中包含一个引用计数ref_和一个读写锁rw_lock_

rename时预防死锁

由于在rename时涉及到两个不同的路径,为防止死锁,rename操作时,都遵循按照路径的字典序进行加锁

可能需要的优化

  1. 考虑到每个文件的锁相对比较独立,可以对FileLockManager中的映射信息进行分桶
  2. 绝大部分情况下,并不会出现同时操作同一个文件的元数据的情况,因此次加锁、释放锁的时候,会造成LockEntry结构的构造和析构,或者可以辅以cache,将需要释放的LockEntry先缓存起来,让缓存去负责最终释放,当需要新申请LockEntry时,直接从缓存中召回一个即可,类似内核中slab的做法