FSEvents по каким-то причинам не может доставлять события в некоторые папки - PullRequest
4 голосов
/ 27 июля 2011

это убивает меня, и я не уверен, что знаю, как подойти к его отладке.

Я использую API-интерфейс Mac FSEvents для мониторинга заданной папки в файловой системе.Однако иногда некоторые папки перестают отправлять какие-либо события уведомления.До сих пор это происходило только для папок внутри ~ / Dropbox и затрагивало лишь нескольких пользователей моего приложения (и также регулярно меня затрагивало).

Сумасшедшая часть в том, что путь к «излечению»'файловая система должна сделать:

mv ~/Dropbox/some/stuck/folder ~/Dropbox/some/stuck/folder.0
mkdir ~/Dropbox/some/stuck/folder
mv ~/Dropbox/some/stuck/folder.0/* ~/Dropbox/some/stuck/folder/
rmdir ~/Dropbox/some/stuck/folder.0

После выполнения этих команд папка отклеивается и начинает отправлять события!Требуется несколько попыток, чтобы определить, какая из родительских папок является виновником, но это всегда какая-то папка внутри Dropbox.(Выход из Dropbox или перезагрузка не излечивает его.)

Я не делаю ничего особенного в своем коде.Мониторинг запускается с использованием:

FSEventStreamContext context;
context.version = 0;
context.info = self;
context.retain = NULL;
context.release = NULL;
context.copyDescription = NULL;

_streamRef = FSEventStreamCreate(nil,
                                 (FSEventStreamCallback)FSMonitorEventStreamCallback,
                                 &context,
                                 (CFArrayRef)paths,
                                 kFSEventStreamEventIdSinceNow,
                                 0.25,
                                 kFSEventStreamCreateFlagUseCFTypes);
if (!_streamRef) {
    NSLog(@"Failed to start monitoring of %@ (FSEventStreamCreate error)", _path);
}

FSEventStreamScheduleWithRunLoop(_streamRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
if (!FSEventStreamStart(_streamRef)) {
    NSLog(@"Failed to start monitoring of %@ (FSEventStreamStart error)", _path);
}

, и обратный вызов выглядит следующим образом (не то чтобы это имеет значение):

static void FSMonitorEventStreamCallback(ConstFSEventStreamRef streamRef, FSMonitor *monitor, size_t numEvents, NSArray *eventPaths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]) {
    for (int i = 0; i < numEvents; i++) {
        NSString *path = [eventPaths objectAtIndex:i];
        FSEventStreamEventFlags flags = eventFlags[i];
        [monitor sendChangeEventWithPath:path flags:flags];
    }
}

Бывает как на 10,6, так и на 10,7.Никакие изворотливые вещи, такие как FileVault, не активны.

Мне это кажется ошибкой ОС, но я не нашел упоминаний об этой проблеме в Интернете.

Вопросы:

1) Вы когда-нибудь испытывали что-то подобное?Есть ли какие-либо результаты?

2) Какие шаги были бы предприняты для дальнейшей диагностики этого, прежде чем использовать инцидент технической поддержки?

1 Ответ

0 голосов
/ 29 июня 2015

Это известная ошибка «FSEvents» в OS X. Она может создавать всевозможные проблемы, которые трудно отследить. См. эту страницу для получения дополнительной информации о проблеме. В частности, на странице есть ссылка на GitHub repo с утилитой для поиска всех каталогов на вашем компьютере, подверженных данной проблеме (которых не должно быть в папке DropBox).

...