[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: mhddfs стал отваливаться.



Pavel Shurubura <pavelshurubura@gmail.com> writes:

> Здравствуйте, community!
>
> После установки дополнительного нового винта в систему debian stable
> (jessie) начались траблы с mhddfs. Конфигурация приблизительно такая:
>
> /dev/sda1 смонтирован /mnt/disk1 (опции монтирования: defaults,
> noatime)
> /dev/sdb1 смонтирован /mnt/disk2 (опции монтирования: defaults,
> noatime)
> /dev/sdc1 смонтирован /mnt/disk3 (опции монтирования: defaults,
> noatime)
>
> в fstab прописано монтирование
> mhddfs#/mnt/disk1,/mnt/disk2,/mnt/disk3 /home/user/torrent fuse
> defaults,noatime,mlimit=100% 0 0
>
> т.е. все 3 диска объединены в одно пространство.
>
> После добавления 3-го диска, начались проблемы:
> rtorrent скачивает только часть файла (приблизительно 2 Гб) всё
> остальное пропадает...
> т.е. показывает, что закачка завершена на 100%, но при rehash остаётся
> только несколько % и соответственно только часть файла.
>
> При rehash большой коллекции файлов вообще rtorrent отваливается с
> сообщением: конечная точка не подсоединена.
> соответственно при попытке:
> ls -al /home/user/torrent
> тоже получаем ошибку: конечная точка не подсоединена.
> По команде mount, точки монтирования /home/user/torrent нет.
> В логах есть падение mhddfs (segfault).

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=728310
(без решения, без backtraces [что, впрочем, затруднено отсутствием -dbg
пакета и неподдержкой nostrip в debian/rules], и т.д.)

Беглый взгляд на исходники показывает возможный racing, см. патч
(Disclaimer: патч *не проверен*, я не пользуюсь mhddfs, и знаю примерно
ничего про fuse).

> Помогите разобраться, кто сталкивался, либо подскажите чем его
> заменить (более стабильное что-то, но по функциональности такое-же).

lvm, raid0,...? Оно, конечно, менее удобно в рулении, но.

P.S. из логов сборки (к падениям, впрочем, отношения не имеет):
src/parse_options.c: In function 'parse_options':
src/parse_options.c:253:39: warning: integer overflow in expression [-Woverflow]
  mhdd.move_limit = DEFAULT_MLIMIT;
                                       ^
src/parse_options.c:295:42: warning: integer overflow in expression [-Woverflow]
     mhdd.move_limit = DEFAULT_MLIMIT;
                                          ^
(Иными словами, на 32-битных платформах оно по умолчанию немножко поломатое).

--- src/main.c.orig	2013-05-12 17:33:06.000000000 +0400
+++ src/main.c	2016-04-14 17:23:03.000000000 +0300
@@ -411,7 +411,7 @@
 	ssize_t res;
 	struct flist *info;
 	mhdd_debug(MHDD_INFO, "mhdd_write: %s, handle = %lld\n", path, fi->fh);
-	info = flist_item_by_id(fi->fh);
+	info = flist_item_by_id_wrlock(fi->fh);
 
 	if (!info) {
 		errno = EBADF;
--- src/tools.c.orig	2013-05-12 17:33:06.000000000 +0400
+++ src/tools.c	2016-04-14 17:23:36.000000000 +0300
@@ -217,8 +217,6 @@
 
 	mhdd_debug(MHDD_MSG, "move_file: %s\n", file->real_name);
 
-	/* TODO: it would be nice to contrive something alter */
-	flist_wrlock_locked();
 	from=file->real_name;
 
 	/* We need to check if already moved */
--- src/parse_options.c.orig	2013-05-12 17:33:06.000000000 +0400
+++ src/parse_options.c	2016-04-14 17:45:20.000000000 +0300
@@ -48,8 +48,8 @@
 
 /* the number less (or equal) than 100 is in percent,
    more than 100 is in bytes */
-#define DEFAULT_MLIMIT ( 4l * 1024 * 1024 * 1024 )
-#define MINIMUM_MLIMIT ( 50l * 1024 * 1024 )
+#define DEFAULT_MLIMIT ( 4l * (off_t)1024 * 1024 * 1024 )
+#define MINIMUM_MLIMIT ( 50l * (off_t)1024 * 1024 )
 
 static struct fuse_opt mhddfs_opts[]={
 	MHDDFS_OPT("mlimit=%s",   mlimit_str, 0),

Reply to: