Hi Folks,

Please see:
http://wiki.apache.org/jakarta-lucene/LuceneFAQ#head-733eab8f4000ba0f6c9f4ea
052dea77d3d541857 to learn more about the lock-file of Lucene (this applies
to both Java and C# Lucene.)

With Lucene, you can have as many readers as you want on an index but only
one writer.  Both readers and a writer can be active concurrently on the
same index.  For this to work, the lock-file must be shared.  Any reader(s)
that want to pickup changes made by a writer, the reader must be re-opened.
If for some strange reason you need multiple writers on the same index (not
recommended,) you must synchronize them.

Regards,

-- George Aroush


-----Original Message-----
From: Ben Martz [mailto:[EMAIL PROTECTED] 
Sent: Thursday, January 18, 2007 12:36 PM
To: lucene-net-user@incubator.apache.org
Subject: Re: FileNotFoundException, is this code supposed to work?

Simon, I forgot to mention that my server processes are running multiple
computers and the lock directory is a UNC path in my case. You are quite
correct that the implicit declaration of the lock directory as %temp% should
prevent synchronization issues from occurring on a single computer running
multiple threads/processes, so if that is the case we need to look somewhere
else to identify the issue.

On 1/18/07, Simon Gartz <[EMAIL PROTECTED]> wrote:
>
>
> The lock dir if not set manually is set to your temp directory. But 
> there may be something wrong anyway. I'll try your solution, I don't 
> have any other choice right now.
>
> Usually the locking error occurres when you are searching a lot and 
> indexing at the same time. We will be running on a quite small index 
> of 50-100MB and this will probably not be an issue in the beginning.
>
> //Lock dir is set here... If not specified :) FSDirectory.cs - 
> v2.0.0.001 - line 145 public static readonly System.String LOCK_DIR = 
> SupportClass.AppSettings.Get("Lucene.Net.lockDir",
> System.IO.Path.GetTempPath());
>
> Thanks
>
> /Simon
>
>
>
> -----Original Message-----
> From: Ben Martz [mailto:[EMAIL PROTECTED]
> Sent: den 18 januari 2007 16:08
> To: lucene-net-user@incubator.apache.org
> Subject: Re: FileNotFoundException, is this code supposed to work?
>
> I should add further that the only reason I went with a thread for the 
> index changes (add/delete/update) is so that I could control the 
> frequency of index optimization to keep things running smoothly - I 
> didn't want every minor change to result in a blocking optimization 
> call. Other than that, I can instantiate multiple copies of my server 
> application and they all coexist quite cheerfully using the standard 
> Lucene.Net.lockdir parameter.
>
> On 1/18/07, Ben Martz <[EMAIL PROTECTED]> wrote:
> >
> > Out of curiosity, are you running into the multiple writer issue 
> > when you correctly set up the lock directory? I use the following 
> > code in my application prior to creating an index writer.
> >
> >         private static bool m_LockInitted = false;
> >         public static void InitLockDir()
> >         {
> >             if (m_LockInitted)
> >                 return;
> >
> >             string lockPath = Common.GetIndexPath() + @"\lock";
> >
> >             if (!Directory.Exists(lockPath))
> >                 Directory.CreateDirectory(lockPath);
> >
> >             ConfigurationManager.AppSettings["Lucene.Net.lockdir"] =
> > lockPath;    // <-- this is the important part
> >
> >             m_LockInitted = true;
> >         }
> >
> >
> > On 1/18/07, Torsten Rendelmann <[EMAIL PROTECTED]> wrote:
> > >
> > > AFAIK only index modifications require a lock, while a concurrent 
> > > search does not. We run into the same problem (concurrent index
> > > writers) and "solved" it using a single index mod. thread working 
> > > with a queue of documents to add/delete/update.
> > >
> > > > -----Original Message-----
> > > > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> > > > Sent: Monday, January 15, 2007 7:25 PM
> > > > To: lucene-net-user@incubator.apache.org
> > > > Subject: RE: FileNotFoundException, is this code supposed to work?
> > > >
> > > >
> > > > I receive these kinds of errors when multiple threads are 
> > > > searching/writing to the index at the same time.  So far, I have 
> > > > had to resort to .NET locks for key locations in code, such as:
> > > >
> > > >       Dim hits As Hits = Nothing
> > > >       SyncLock aLock
> > > >               hits = searcher.Search(query, df1, custSort)
> > > >       End SyncLock
> > > >
> > > >       SyncLock aLock
> > > >               Result = reader.DeleteDocuments(New Term("Id",
> > > > CStr(Id)))
> > > >             reader.Close()
> > > >       End SyncLock
> > > >
> > > >       SyncLock aLock
> > > >               writer.AddDocument(doc)
> > > >               writer.Close()
> > > >       End SyncLock
> > > >
> > > >
> > > > This of course kills our scalability, so I am so interested in 
> > > > knowing how to address multi-process/multi-threaded access to 
> > > > any particular index.
> > > >
> > > >
> > > >
> > > > - Michael
> > > >
> > > >
> > > >
> > > > -----Original Message-----
> > > > From: Simon Gartz [mailto:[EMAIL PROTECTED]
> > > > Sent: Monday, January 15, 2007 6:54 AM
> > > > To: lucene-net-user@incubator.apache.org
> > > > Subject: FileNotFoundException, is this code supposed to work?
> > > >
> > > > Hi,
> > > >
> > > > I've seen this questions before with slightly different 
> > > > approaches, but non with sample code. Is this code supposed to 
> > > > work or not, using Lucene.net v1.9.1.3?
> > > > I get follwing error executing the code below. Note that it 
> > > > might take some time to crash.
> > > >
> > > > System.IO.FileNotFoundException : Could not find file 
> > > > "C:\DOCUME~1\sgartz\LOCALS~1\Temp\lucene\_1ji.frq".
> > > >       at System.IO.__Error.WinIOError(Int32 errorCode, String str)
> > > >       at System.IO.FileStream..ctor(String path, FileMode mode, 
> > > > FileAccess access, FileShare share, Int32 bufferSize, Boolean 
> > > > useAsync, String msgPath, Boolean bFromProxy)
> > > >       at System.IO.FileStream..ctor(String path, FileMode mode, 
> > > > FileAccess access, FileShare share)
> > > >       at Lucene.Net.Store.Descriptor..ctor(FSIndexInput
> > > > enclosingInstance, FileInfo file, FileAccess mode)
> > > >       at Lucene.Net.Store.FSIndexInput..ctor(FileInfo path)
> > > >       at Lucene.Net.Store.FSDirectory.OpenInput(String name)
> > > >       at Lucene.Net.Index.SegmentReader.Initialize(SegmentInfo si)
> > > >       at Lucene.Net.Index.SegmentReader.Get(Directory dir, 
> > > > SegmentInfo si, SegmentInfos sis, Boolean closeDir, Boolean
> > > > ownDir)
> > > >       at Lucene.Net.Index.SegmentReader.Get(SegmentInfo si)
> > > >       at Lucene.Net.Index.AnonymousClassWith.DoBody ()
> > > >       at Lucene.Net.Store.With.Run()
> > > >       at Lucene.Net.Index.IndexReader.Open(Directory
> > > > directory, Boolean
> > > > closeDirectory)
> > > >       at Lucene.Net.Index.IndexReader.Open(String path)
> > > >       at Lucene.Net.Search.IndexSearcher..ctor(String path)
> > > >
> > > > c:\projects\x\development\x.test\indexingservice\indexingservi
> > > > cetest.cs(
> > > > 128,0): at
> > > > x.Test.IndexingService.IndexingServiceTest.LuceneThreadTest ()
> > > >
> > > >
> > > >   private static readonly string directory = 
> > > > Path.Combine(Path.GetTempPath(), "lucene");
> > > >
> > > >   [Test]
> > > >   public void LuceneThreadTest(){
> > > >
> > > >    //Create index
> > > >    Lucene.Net.Analysis.Analyzer analyzer = new 
> > > > Lucene.Net.Analysis.SimpleAnalyzer();
> > > >    Lucene.Net.Index.IndexWriter writer = new 
> > > > Lucene.Net.Index.IndexWriter(directory, analyzer, true);
> > > >    writer.Close();
> > > >
> > > >    //Start indexing thread
> > > >    Thread indexThread = new Thread(new 
> > > > ThreadStart(LuceneIndexThread));
> > > >    indexThread.Start();
> > > >
> > > >    while(indexThread.IsAlive ){
> > > >     Console.WriteLine("Searching...");
> > > >
> > > >     Lucene.Net.Search.Searcher searcher = new 
> > > > Lucene.Net.Search.IndexSearcher(directory);
> > > >
> > > >     Lucene.Net.Search.Hits hits = null;
> > > >     Lucene.Net.QueryParsers.QueryParser parser = new 
> > > > Lucene.Net.QueryParsers.QueryParser("contents", analyzer);
> > > >     Lucene.Net.Search.Query query = parser.Parse("put");
> > > >     Console.WriteLine("Query: " + query.ToString("contents"));
> > > >
> > > >     hits = searcher.Search(query);
> > > >     Console.WriteLine(hits.Length() + " total results");
> > > >     for (int i = 0; i < hits.Length() && i < 10; i++) {
> > > >      Lucene.Net.Documents.Document d = hits.Doc(i);
> > > >      Console.WriteLine(i + " " + hits.Score(i) + " " + 
> > > > d.Get("contents").Length + " " + d.Get("contents").Substring(0,
> 20));
> > > >     }
> > > >     searcher.Close();
> > > >     Thread.Sleep(1000);
> > > >    }
> > > >   }
> > > >   private void LuceneIndexThread(){
> > > >    Console.WriteLine("Start indexing files");
> > > >    for(int j = 0; j < 100; j++){
> > > >
> > > >     Lucene.Net.Analysis.Analyzer analyzer = new 
> > > > Lucene.Net.Analysis.SimpleAnalyzer();
> > > >     Lucene.Net.Index.IndexWriter writer = new 
> > > > Lucene.Net.Index.IndexWriter (directory, analyzer, false);
> > > >
> > > >     for (int i = 0; i < 100; i++) {
> > > >      Lucene.Net.Documents.Document d = new 
> > > > Lucene.Net.Documents.Document();
> > > >      string content = new string('a', (new Random()).Next(100) *
> 10);
> > > >      d.Add(new Lucene.Net.Documents.Field("contents", "Put 
> > > > contents here " + content, Lucene.Net.Documents.Field.Store.YES,
> > > > Lucene.Net.Documents.Field.Index.TOKENIZED));
> > > >      writer.AddDocument(d);
> > > >     }
> > > >     writer.Close();
> > > >     Console.WriteLine("Indexed 100 documents...");
> > > >    }
> > > >    Console.WriteLine("Finished indexing files");
> > > >   }
> > > >
> > > >
> > > > Regards
> > > > Simon
> > > >
> > >
> > >
> > >
> >
> >
> > --
> > Mmmmmm...C8H11NO2
>
>
>
>
> --
> Mmmmmm...C8H11NO2
>



--
Mmmmmm...C8H11NO2

Reply via email to