修复 mhddfs 崩溃的问题 (Transport endpoint is not connected)

前言

本文主要关于解决 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 导致访问一个已经被 freenode

参考