Or you could try this patch:
*LUCENE-1316<https://issues.apache.org/jira/browse/LUCENE-1316>
*
Peter*

*
On Thu, Aug 6, 2009 at 8:51 AM, Michael McCandless <
luc...@mikemccandless.com> wrote:

> Opening your IndexReader with readOnly=true should also fix it, I think.
>
> Mike
>
> On Thu, Aug 6, 2009 at 8:41 AM, Carl Austin<carl.aus...@detica.com> wrote:
> > Thanks Mike,
> >
> > Running this with the 2.9 build does resolve the issue it would seem.
> >
> > Unfortunately I can't move to 2.9, especially as it isn't in release yet.
> Is there a work-around for 2.4 known that will allow me to get around this
> issue as I notice the patches change some underlying classes such as
> MultiSegmentReader? What I am doing does regularly have the chance to call
> this query concurrently multiple times, which cause quite an issue.
> >
> > Thanks
> >
> > Carl
> >
> > -----Original Message-----
> > From: Michael McCandless [mailto:luc...@mikemccandless.com]
> > Sent: 06 August 2009 13:26
> > To: java-user@lucene.apache.org
> > Subject: Re: MatchAllDocsQuery concurrency issue
> >
> > Most likely you're hitting this issue:
> >
> >    https://issues.apache.org/jira/browse/LUCENE-1316
> >
> > Which is fixed in 2.9.  Can you try running with 2.9 to confirm?
> >
> > Mike
> >
> > On Thu, Aug 6, 2009 at 8:19 AM, Carl Austin<carl.aus...@detica.com>
> wrote:
> >> Hi,
> >>
> >> I have been seeing an issue running MatchAllDocsQueries concurrently.
> >> Running one against a test index is very fast (70 ms). Running two
> >> concurrently can take 5-25 seconds on the same test index! This issue
> >> doesn't occur with any other type of query I have used.
> >> Because of this, I have put together a few test classes to demonstrate
> >> this in a simple manner. These recreate the issue with only the most
> >> basic Lucene api usage.
> >>
> >> I have incldued the code for the classes below in this email. Just run
> >> TestIndexCreator with a single argument of where to create the test
> >> index. This will create an index with 999999 documents in, each
> >> document having only 1 field with the value "testing" in that field.
> >> Only one unique term for the whole index.
> >> Then run the class Test with the same argument as the index creator.
> >> This will run a 4 tests with a 5 second wait between each. The first
> >> runs a single term query for "testing". The second a single match all
> >> docs query. The third 2 concurrent term queries and the fourth 2
> >> concurrent match all docs queries. It is the fourth that takes a
> >> relatively long time to complete.
> >> On a larger index I have here it can take 8 minutes to run just 2
> >> match all docs queries concurrently.
> >>
> >> I look forward to hearing further on this. I can provide this in Jar
> >> for if wished, though I don't know if you can attach to these emails.
> >>
> >> Thanks
> >>
> >> Carl
> >>
> >>
> >> Source Code:
> >>
> >> import org.apache.lucene.analysis.KeywordAnalyzer;
> >> import org.apache.lucene.document.Document;
> >> import org.apache.lucene.document.Field; import
> >> org.apache.lucene.document.Field.Index;
> >> import org.apache.lucene.document.Field.Store;
> >> import org.apache.lucene.index.IndexReader;
> >> import org.apache.lucene.index.IndexWriter;
> >>
> >>
> >> public class TestIndexCreator {
> >>
> >>
> >>        public static void main(String[] args) throws Exception
> >>        {
> >>                if (!IndexReader.indexExists(args[0]))
> >>                {
> >>                        IndexWriter w = new IndexWriter(args[0], new
> >> KeywordAnalyzer(), true);
> >>                        for(int i =0; i < 1000000; i++)
> >>                        {
> >>                                Document doc = new Document();
> >>                                doc.add(new Field("testfield",
> >> "testing", Store.YES, Index.ANALYZED));
> >>                                w.addDocument(doc);
> >>                                if (i % 10000 == 0)
> >>                                {
> >>                                        System.out.println(i);
> >>                                }
> >>                        }
> >>                        w.optimize();
> >>                        w.close();
> >>                }
> >>        }
> >>
> >> }
> >>
> >> import java.io.IOException;
> >>
> >> import org.apache.lucene.index.IndexReader;
> >> import org.apache.lucene.index.Term;
> >> import org.apache.lucene.search.IndexSearcher;
> >> import org.apache.lucene.search.MatchAllDocsQuery;
> >> import org.apache.lucene.search.Query; import
> >> org.apache.lucene.search.TermQuery;
> >> import org.apache.lucene.search.TopDocCollector;
> >>
> >>        class TestThread implements Runnable
> >>        {
> >>                private IndexReader r;
> >>                private int x;
> >>                private Test callback;
> >>                private boolean termSearches;
> >>
> >>                public TestThread(IndexReader r, int x, Test callback,
> >> boolean termSearches)
> >>                {
> >>                        this.r = r;
> >>                        this.x = x;
> >>                        this.callback = callback;
> >>                        this.termSearches = termSearches;
> >>                }
> >>
> >>                public void run() {
> >>                        long time = System.currentTimeMillis();
> >>                        System.out.println("Thread " + x + " start");
> >>                        IndexSearcher s = new IndexSearcher(r);
> >>                        Query q = null;
> >>                        if (termSearches)
> >>                        {
> >>                                q = new TermQuery(new Term("testfield",
> >> "testing"));
> >>                        }
> >>                        else
> >>                        {
> >>                                q = new MatchAllDocsQuery();
> >>
> >>                        }
> >>                        TopDocCollector col = new TopDocCollector(50);
> >>                        try {
> >>                                s.search(q, col);
> >>                        } catch (IOException e) {
> >>                                e.printStackTrace();
> >>                        }
> >>                        System.out.println("Time taken for " + x + " = "
> >> + (System.currentTimeMillis() - time));
> >>                        callback.callback();
> >>                }
> >>
> >>        }
> >>
> >> import java.io.IOException;
> >>
> >> import org.apache.lucene.index.CorruptIndexException;
> >> import org.apache.lucene.index.IndexReader;
> >>
> >>
> >> public class Test {
> >>
> >>        private IndexReader r;
> >>        private int noSearches = 0;
> >>
> >>        public static void main(String[] args)
> >>        {
> >>                System.out.println("Running Single TermQuery Search");
> >>                Test t = new Test(args[0]);
> >>                try {
> >>                        t.runSearches(1, true);
> >>                } catch (Exception e) {
> >>                        // TODO Auto-generated catch block
> >>                        e.printStackTrace();
> >>                }
> >>                try {
> >>                        Thread.sleep(5000);
> >>                } catch (InterruptedException e1) {
> >>                        // TODO Auto-generated catch block
> >>                        e1.printStackTrace();
> >>                }
> >>                System.out.println("Running Single MatchAllDocs
> >> Search");
> >>                t = new Test(args[0]);
> >>                try {
> >>                        t.runSearches(1, false);
> >>                } catch (Exception e) {
> >>                        // TODO Auto-generated catch block
> >>                        e.printStackTrace();
> >>                }
> >>                try {
> >>                        Thread.sleep(5000);
> >>                } catch (InterruptedException e1) {
> >>                        // TODO Auto-generated catch block
> >>                        e1.printStackTrace();
> >>                }
> >>                System.out.println("Running two concurrent TermQuery
> >> Searches");
> >>                t = new Test(args[0]);
> >>                try {
> >>                        t.runSearches(2, true);
> >>                } catch (Exception e) {
> >>                        // TODO Auto-generated catch block
> >>                        e.printStackTrace();
> >>                }
> >>                try {
> >>                        Thread.sleep(5000);
> >>                } catch (InterruptedException e1) {
> >>                        // TODO Auto-generated catch block
> >>                        e1.printStackTrace();
> >>                }
> >>                System.out.println("Running two concurrent MatchAllDocs
> >> Searches");
> >>                t = new Test(args[0]);
> >>                try {
> >>                        t.runSearches(2, false);
> >>                } catch (Exception e) {
> >>                        // TODO Auto-generated catch block
> >>                        e.printStackTrace();
> >>                }
> >>
> >>        }
> >>
> >>        public Test(String index)
> >>        {
> >>                try {
> >>                        r = IndexReader.open(index);
> >>                } catch (CorruptIndexException e) {
> >>                        // TODO Auto-generated catch block
> >>                        e.printStackTrace();
> >>                } catch (IOException e) {
> >>                        // TODO Auto-generated catch block
> >>                        e.printStackTrace();
> >>                }
> >>        }
> >>
> >>        public void runSearches(int no, boolean termSearches) throws
> >> Exception
> >>        {
> >>                noSearches = no;
> >>                for (int i = 0; i < no; i++)
> >>                {
> >>                        Thread t1 = new Thread(new TestThread(r, i,
> >> this, termSearches));
> >>                        t1.start();
> >>                }
> >>        }
> >>
> >>        public void callback()
> >>        {
> >>                noSearches--;
> >>                if (noSearches == 0)
> >>                {
> >>                        try {
> >>                                r.close();
> >>                        } catch (IOException e) {
> >>                                // TODO Auto-generated catch block
> >>                                e.printStackTrace();
> >>                        }
> >>                }
> >>        }
> >>
> >> }
> >>
> >>
> >>
> >> This message should be regarded as confidential. If you have received
> this email in error please notify the sender and destroy it immediately.
> >> Statements of intent shall only become binding when confirmed in hard
> copy by an authorised signatory.  The contents of this email may relate to
> dealings with other companies within the Detica Limited group of companies.
> >>
> >> Detica Limited is registered in England under No: 1337451.
> >>
> >> Registered offices: Surrey Research Park, Guildford, Surrey, GU2 7YP,
> England.
> >>
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
> > For additional commands, e-mail: java-user-h...@lucene.apache.org
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
> > For additional commands, e-mail: java-user-h...@lucene.apache.org
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
> For additional commands, e-mail: java-user-h...@lucene.apache.org
>
>

Reply via email to