Lucene.Net и проблема потоков ввода / вывода - PullRequest
6 голосов
/ 14 июля 2009

У меня есть функция индексирования с именем «Execute ()», использующая IndexWriter для индексации содержимого моего сайта. Это прекрасно работает, если я просто вызвал его с веб-страницы, но не получилось, если у меня есть его в качестве параметра делегата в System.Threading.Thread. Странно, однако, что он всегда работает на моей локальной машине разработчика, он не работает, только когда я загружаю на общий хост.

Это сообщение об ошибке, которое я получил

"Превышено время ожидания блокировки: ошибка SimpleFSLock ...."

Ниже приведен код ошибки (но происходит только на общем хосте)

Scheduler scheduler = new Scheduler();
System.Threading.Thread schedulerThread = new System.Threading.Thread(scheduler.Execute);

Ниже приведен код, который работает (работает как на моей локальной машине, так и на общем хосте)

Scheduler scheduler = new Scheduler();
schedulre.Execute();

Теперь, некоторые люди сказали, что это может быть плохо от предыдущего сеанса отладки, поэтому, прежде чем я создал экземпляр IndexWriter, я сделал

if (IndexReader.IsLocked(indexingFolder))
{

    log.Debug("it is locked");
    IndexReader.Unlock(FSDirectory.GetDirectory(indexingFolder));
}
else
{
    log.Debug("it is not locked");
}

и угадайте что? Мой журнал говорит, что он не заблокирован.

Так что теперь я почти уверен, что это вызвано System.Thread.Threading, но я просто понятия не имею, как это исправить.

Спасибо

Ответы [ 4 ]

4 голосов
/ 14 июля 2009

Убедитесь, что на общем хосте поток имеет те же разрешения на папку индекса, что и на компьютере разработчика / общем хосте.

Обновление: Вы можете узнать, под чем Principal работает поток, опросив свойство CurrentPrincipal потока. Хотя это свойство для чтения и записи, у вас могут не быть разрешения для установки этого свойства в среде общего хоста.

Вы можете найти этот пост полезным.

2 голосов
/ 14 июля 2009

Спасибо всем и особенно Vinay за указание мне в правильном направлении. После долгих поисков я наконец-то решил взглянуть на источник и посмотреть, что там.

В «IndexWriter» у вас есть

  Lock @lock = this.directory.MakeLock("write.lock");
  if (!@lock.Obtain(this.writeLockTimeout))

, который указывает на реализацию SimpleFSLock. Виновник был

new FileStream(this.lockFile.FullName, FileMode.CreateNew).Close();

внутренне создавая новый поток, он создает исключение system.unauthorizedaccessexception в соответствии с msdn здесь

При запуске нового потока System.Security.Principal.WindowsIdentity.GetCurrent () возвращает идентификатор процесса, а не обязательно код, вызвавший Thread.Start (). Это важно помнить при запуске асинхронных делегатов или потоков в олицетворенном потоке ASP.NET.

Если вы находитесь в ASP.NET и хотите, чтобы новый поток начинался с олицетворенной WindowsIdentity, передайте WindowsIdentity методу ThreadStart. Попав в метод ThreadStart, вызовите WindowsIdentity.Impersonate ().

Таким образом, я решил проблему, выдав себя за учетную запись IIS, в которой запущено мое приложение в функции «Execute ()», и все проблемы были решены.

Еще раз спасибо всем.

0 голосов
/ 14 июля 2009

Я считаю, что проблема в файле блокировки записи в каталоге индексов Lucene. Перейдите и список файлов каталога. В Java Lucene вы бы увидели файл с именем write.lock в каталоге index, Это означает, что индекс не был правильно закрыт в прошлый раз (возможно, процесс был внезапно остановлен). В Lucene.net ищите пустой файл с аналогичным именем. Я верю, что тот же механизм будет использоваться в Lucene.net. Попробуйте найти этот файл, стереть его и перезапустить Lucene.net.

0 голосов
/ 14 июля 2009

Вероятно, худший, чтобы попытаться ответить на этот вопрос, поскольку я не использовал хостинг lucene / shared, но SimpleFSLock звучит так, как будто он блокирует индексный файл lucene с помощью явного файла блокировки в файловой системе (не совсем то же самое, что блокировка в потоке). Я бы сказал, проверьте, чтобы убедиться, что вы настроили правильные пути к файлам и что права доступа к файлам установлены правильно.

В противном случае, надеюсь, кто-нибудь, более знакомый с Lucene.net, сможет ответить.

...