Как проверить, правильно ли приложение обрабатывает медленные / нестабильные файловые системы?

Я хочу убедиться, что в моем приложении нет зависаний пользовательского интерфейса при работе с файлами в медленной файловой системе (например, в сети, на CD/DVD или на жестком диске).

Я использую операции с файловой системой Какао напрямую. Боюсь, что было бы слишком много усилий, чтобы высмеивать или абстрагировать все это только для тестирования, и кроме того, могут быть неочевидные способы, которыми моя программа касается файловой системы.

Я пытался использовать сетевые диски для тестирования, но кэширование ОС делает тесты неповторяющимися и... слишком быстрыми:)

Есть ли что-то вроде намеренно медленной файловой системы MacFuse? Какой-нибудь другой метод, который позволил бы мне найти все сбои пользовательского интерфейса и условия гонки, вызванные неожиданными задержками?

5 ответов

Решение

Самый простой ответ - MacFUSE, как отмечено в другом месте; это довольно легко симулировать. Вы также можете попробовать смонтировать общий ресурс через NFS, а затем использовать его с помощью встроенного ipfw, лайк:

ipfw pipe 1 config 1KByte / s ipfw add 1 pipe 1 src-port 2049

или если вы используете WebDAV

ipfw add 1 pipe 1 src-port 80

Затем он будет передавать запросы на любом уровне канала, который вы определили. После этого вы сможете снова избавиться от него:

ipfw удалить 1

Может быть, купить медленный флэш-накопитель? Я нашел некоторые в Best Buy, которые были ледниковыми. Подключите их через несколько USB-концентраторов и, возможно, к клавиатуре, чтобы они были подключены к сети.

-W

Написание файловой системы MacFUSE с их каркасом Cocoa очень просто. На самом деле, я думаю, что есть даже пример системы, которая просто отражает локальную файловую систему. Почему бы не адаптировать этот код так, чтобы он вызывал sleep() на мгновение во время каждой операции?

В зависимости от того, где вы беспокоитесь о проблемах, моей первой мыслью было бы просто включить дополнительный уровень вызовов функций между приложением и файловым вводом-выводом, и в этом уровне встроить некоторые вызовы sleep(). То есть, на каком бы языке вы ни использовали, замените вызов read на readDelegate и дайте readDelegate спать в течение некоторого определенного промежутка времени, затем выполните реальное чтение и верните значение. Когда вы будете готовы к производству, вам даже не придется вытягивать дополнительный слой, просто снимите сон.

Как насчет дисковода? Там должны быть внешние, которые вы можете просто подключить через USB или около того...

Другие вопросы по тегам