Что видят программы, когда ZFS не может доставить нетронутые данные? - PullRequest
4 голосов
/ 12 ноября 2009

Скажем, моя программа пытается прочитать байт в файле в файловой системе ZFS. ZFS может найти копию необходимого блока, но не может найти любую копию с действительной контрольной суммой (все они повреждены, или единственные имеющиеся диски имеют поврежденные копии). Что видит моя программа с точки зрения возвращаемого значения чтения и байта, который она пыталась прочитать? И есть ли способ повлиять на поведение (под управлением Solaris или любой другой ОС, реализующей ZFS), то есть принудительное завершение или успешное завершение, с потенциально поврежденными данными?

Ответы [ 3 ]

5 голосов
/ 25 ноября 2009

EIO действительно единственный ответ с текущими реализациями ZFS.

Открытая «ошибка» ZFS запрашивает способ чтения поврежденных данных: http://bugs.opensolaris.org/bugdatabase/printableBug.do?bug_id=6186106

Я полагаю, что это уже выполнимо, используя недокументированную утилиту zdb с открытым исходным кодом. Посмотрите на http://www.cuddletech.com/blog/pivot/entry.php?id=980 для объяснения того, как вывести содержимое файла с помощью опции zdb -R и флага «r».

2 голосов
/ 24 апреля 2010

Solaris 10:

# Create a test pool
[root@tesalia z]# cd /tmp
[root@tesalia tmp]# mkfile 100M zz
[root@tesalia tmp]# zpool create prueba /tmp/zz

# Fill the pool
[root@tesalia /]# dd if=/dev/zero of=/prueba/dummy_file
dd: writing to `/prueba/dummy_file': No space left on device
129537+0 records in
129536+0 records out
66322432 bytes (66 MB) copied, 1.6093 s, 41.2 MB/s

# Umount the pool
[root@tesalia /]# zpool export prueba

# Corrupt the pool on purpose
[root@tesalia /]# dd if=/dev/urandom of=/tmp/zz seek=100000 count=1 conv=notrunc
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.0715209 s, 7.2 kB/s

# Mount the pool again
zpool import -d /tmp prueba

# Try to read the corrupted data
[root@tesalia tmp]# md5sum /prueba/dummy_file 
md5sum: /prueba/dummy_file: I/O error

# Read the manual
[root@tesalia tmp]# man -s2 read
[...]
RETURN VALUES
     Upon successful completion,  read()  and  readv()  return  a
     non-negative integer indicating the number of bytes actually
     read. Otherwise, the functions return -1 and  set  errno  to
     indicate the error.

ERRORS
     The read(), readv(), and pread() functions will fail if:
[...]
     EIO        A physical I/O error has occurred, [...]

Вы должны экспортировать / импортировать тестовый пул, поскольку в противном случае прямая перезапись (повреждение пула) будет пропущена, поскольку файл все еще будет кэшироваться в памяти ОС.

И нет, в настоящее время ZFS откажется предоставить вам поврежденные данные. Как и должно быть.

1 голос
/ 12 ноября 2009

Как будет иметь смысл возвращать что-либо, кроме ошибки EIO из read(), вне специальной утилиты восстановления данных низкого уровня для файловой системы?

Для доступа к файлу низкоуровневая утилита восстановления данных должна использовать API, специфичный для ОС и ФС, отличный от open / read / write / close to. Семантика, в которой она нуждается, принципиально отличается от чтения обычных файлов, поэтому для нее потребуется специализированный API.

...