2009-07-14 29 views
6

Tôi có một hàm lập chỉ mục có tên là "Execute()" sử dụng IndexWriter để lập chỉ mục nội dung trang web của tôi. Nó hoạt động tuyệt vời nếu tôi chỉ đơn giản gọi nó từ một trang web, nhưng thất bại khi tôi có nó như là một tham số đại biểu vào System.Threading.Thread. Kỳ lạ thay, nó luôn hoạt động trên máy dev cục bộ của tôi, nó chỉ thất bại khi tôi tải lên một máy chủ chia sẻ.Lucene.Net và I/O Luồng vấn đề

Đây là thông báo lỗi tôi đã

"Khóa được sự thoả timed out: Lỗi SimpleFSLock ...."

Dưới đây là mã thất bại (nhưng chỉ thất bại trên một máy chủ chia sẻ)

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

Dưới đây là đoạn code mà làm việc (làm việc cả trên máy tính địa phương của tôi và trên máy chủ chia sẻ)

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

Bây giờ, một số ppl nói, nó có thể là một xấu còn sót lại từ phiên gỡ lỗi trước, vì vậy trước khi tôi khởi tạo các IndexWriter, tôi đã làm

if (IndexReader.IsLocked(indexingFolder)) 
{ 

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

và đoán những gì? nhật ký của tôi nói, nó không bị khóa.

Vì vậy, bây giờ tôi khá chắc chắn nó gây ra bởi các System.Thread.Threading, nhưng tôi chỉ không có đầu mối như thế nào để sửa chữa nó.

Cảm ơn

+0

Tôi đã cập nhật câu trả lời của mình để kết hợp những gì bạn đã hỏi trong nhận xét của mình. –

Trả lời

0

Có lẽ tồi tệ nhất để thử và trả lời này vì tôi đã không sử dụng Lucene/chia sẻ lưu trữ, nhưng SimpleFSLock vẻ như nó khóa file index Lucene bằng cách sử dụng một tập tin khóa rõ ràng trên hệ thống tập tin (không hoàn toàn giống như khóa trong luồng). Tôi muốn nói kiểm tra để đảm bảo rằng bạn đã cấu hình đường dẫn tệp thích hợp và quyền tệp đó được đặt chính xác.

Nếu không, hy vọng ai đó quen thuộc hơn với Lucene.net có thể trả lời.

+0

Cảm ơn Kevin. Các đường dẫn tệp là chính xác vì nếu tôi chỉ thực hiện hàm bằng cách không liên quan đến luồng, mọi thứ hoạt động như mong đợi, các chỉ mục đang được tạo và tôi có thể tìm kiếm tất cả nội dung. Ngay sau khi tôi chuyển hàm vào trong hàm tạo Thread(), nó sẽ thoát ra ngoài. ps: cảm ơn vì đã giúp tôi ra định dạng :) –

4

Kiểm tra xem trên máy chủ chia sẻ, chuỗi có cùng quyền cho thư mục chỉ mục giống như bạn thực hiện trên máy phát triển/máy chủ chia sẻ.

Cập nhật: Bạn có thể tìm thấy những gì Principal chuỗi đang chạy dưới bằng cách thẩm vấn thuộc tính CurrentPrincipal của chủ đề. Mặc dù đây là thuộc tính đọc-ghi, bạn có thể không có quyền đặt thuộc tính này trong môi trường máy chủ chia sẻ của mình.

Bạn có thể tìm thấy this post hữu ích.

+0

Xin chào Vinay, làm cách nào để kiểm tra xem một chuỗi có quyền giống như tôi làm không? –

0

Tôi tin rằng sự cố là với tệp ghi khóa trong thư mục chỉ mục Lucene. Đi và liệt kê các tệp của thư mục. Trong Java Lucene, bạn sẽ thấy một tệp có tên là write.lock trong thư mục chỉ mục, có nghĩa là chỉ mục này không được đóng đúng cách lần cuối (có thể một quá trình đã bị dừng đột ngột). Trong Lucene.net, hãy tìm một tệp trống có tên tương tự. Tôi tin rằng cơ chế tương tự sẽ được sử dụng trong Lucene.net. Thử tìm tập tin đó, xóa nó và khởi động lại Lucene.net.

+0

Cảm ơn Yuval. Tôi vừa chạy một tập lệnh và nó in phân đoạn.gen phân đoạn_6 _1.cfs Vậy đó. Chi tiết của thông báo lỗi thực sự cho biết vấn đề với "write.lock" trong thư mục lập chỉ mục của tôi. Tuy nhiên, giống như kết quả kịch bản được hiển thị ở trên, không có tệp "write.lock" nào tồn tại. –

2

Cảm ơn mọi người và đặc biệt là Vinay đã chỉ cho tôi đúng hướng. Sau nhiều lần truy tìm, cuối cùng tôi đã quyết định xem xét nguồn và xem có gì ở đó.

Trong "IndexWriter", bạn có

Lock @lock = this.directory.MakeLock("write.lock"); 
    if ([email protected](this.writeLockTimeout)) 

mà được trỏ đến việc thực hiện SimpleFSLock. Thủ phạm là

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

bằng cách tạo ra một chủ đề mới, trong nội bộ, nó ném một system.unauthorizedaccessexception, theo MSDN here

Khi bắt đầu một chủ đề mới, System.Security.Principal.WindowsIdentity.GetCurrent() trả về danh tính của quá trình, không nhất thiết phải là danh tính của mã được gọi là Thread.Start(). Điều này là quan trọng cần nhớ khi bắt đầu các đại biểu hoặc chủ đề không đồng bộ trong một luồng ASP.NET giả mạo.

Nếu bạn đang ở trong ASP.NET và muốn chuỗi mới bắt đầu với WindowsIdentity mạo danh, chuyển WindowsIdentity sang phương thức ThreadStart. Khi ở trong phương thức ThreadStart, hãy gọi WindowsIdentity.Impersonate().

Như vậy, tôi đã giải quyết được vấn đề của mình bằng cách mạo danh tài khoản IIS đang chạy ứng dụng của tôi trong hàm "Execute()" và mọi sự cố được giải quyết.

Cảm ơn bạn một lần nữa.

+0

Vâng, cách bình thường để thể hiện lời cảm ơn của bạn là upvote và/hoặc chấp nhận câu trả lời :-) –

Các vấn đề liên quan