前言
本文主要关于解决 mhddfs
1.39版本使用时遇到的bug问题(Transport endpoint is not connected),以及简要分析导致问题的原因。
去年使用 mhddfs
统合服务器上的多块大容量硬盘(链接)。但是之后偶尔会出现由于大规模io(主要是写入,删除之类的操作)导致(或许) mhddfs 崩溃的问题。出现如下字样
Transport endpoint is not connected
此时运行 ps auxw | grep mhddfs
没有输出,mhddfs 已经停止运行。查看日志 /var/log/kern.log
发现 mhdfs 由于一个 segfault
quit。
mhddfs[11861]: segfault at 0 ip 0000000000404750 sp 00007f1100ff8a40 error 4 in mhddfs[400000+b000]
由于挂载点失效,所有涉及向这个挂载点io的程序都会中断,而且该错误出现的莫名其妙,令人头秃。最近经过查阅发现这个 bug 已经被修复,经验证修复后暂未出现如同之前一样crash的情况。
修复过程
安装依赖
sudo apt install git fuse libfuse-dev libattr1-dev
下载修复了 bug 的 mhddfs 源码并编译
git clone https://github.com/vdudouyt/mhddfs-nosegfault/
cd mhddfs-nosegfault
make
sudo cp mhddfs /usr/bin
然后重新挂载
sudo umount <mount point>
sudo mount -a
原因分析
该错误仅出现在1.39版本,观察1.38到1.39的唯一一次 commit ,发现 HASH_CLEAN
存在一个 use after free 的问题 ( here ),该问题代码会由于调用 HASH_CLEAR
导致访问一个已经被 free
的 node
。