项目中在使用ganesha2.3.3版本中,遇到一个棘手的问题。
我们是自己实现的一个分布式文件系统,对接的ganesha-nfs的2.3.3的接口。有一个应用场景是将目录通过nfs挂载给vmware,以建立虚拟机使用。最近在测试强压力测试(vdbench做着压力测试,还开着虚拟机)中,出现了虚拟机开启时报文件不存在的错误,再次开启就好了。
首先是开启调试日志,预感这种问题应该是在强压力测试下才可能出现的, 让测试想办法再复现。刚开始以为我们文件系统的cache存在问题,进行了一下简单的cache代码排查,暂时没有发现问题。
终于过了两天测试告诉我们复现了,谢天谢地,兴奋的跑去查日志,查找找不到目录的所有条目,发现一条重要的线索,有一条lookup记录居然通过vdbench中的目录作为父目录,去查找挂载给vmware的文件夹中的目录(名字取得骚气,很容易看出来),我说你们两个一点血缘关系都没有,去找什么,难道想处对象吗?直觉告诉我,可能真的与cache相关,但是不会是我们的cache,而是ganesha中的cache,可惜之前懒,加之工作量大,人手不足,没有仔细看ganesha-nfs的inode cache的代码,不知道为什么会发生这样的事情,只有拿出杀手锏,抓包,通过抓包找到这样发送的原因,在针对性的看代码。
手动复现抓包真的是一个不可取的工程,而且鬼知道下一次复现是什么时候,包又不能一直在抓着,太大。让测试写了个自动化测试的脚本,给虚拟机开机时,调用抓包,开机成功,重新抓包。开机失败,保存当次抓包的数据。
漫长等待自动化测试跑了两三天,果然又复现了,这一次还不逮着你。使用最原始但是最有效的方法,将开机成功的包,和开机失败的包一行一行的对比,眼睛都快看瞎了的情况下,终于发现了问题,万恶的lookup.., 在开机时,一次vmware文件夹中的目录在进行lookup .., 居然返回了vdbench中一个目录的句柄,然后客户端傻傻的用这个句柄去查找这个