lucene-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Erick Erickson <erickerick...@gmail.com>
Subject Re: SearcherManager not seeing changes in IndexWriteral and
Date Fri, 09 Nov 2018 16:16:56 GMT
You might be able to do this with a couple of threads in a single
program, but certainly up to you.

Best,
Erick
On Fri, Nov 9, 2018 at 7:47 AM Boris Petrov <boris_petrov@live.com> wrote:
>
> Well, while debugging I put a bunch of println's which showed the
> expected order. And, besides, I've written the code, I know that writing
> to the index happens way before searching in it - the test makes sure of
> that.
>
> If you think there indeed might be some problem, I'll try to reproduce
> it in a small example. But I will try only the obvious (which perhaps
> you've tried a million times and have tests for) - I'll have one thread
> write to the index, another (which starts after the first) search in it
> and I'll create a bash script that runs the program until it fails (what
> I currently do with our test). I'll do this beginning of next week.
>
> Thank you for the support!
>
> On 11/9/18 5:37 PM, Erick Erickson wrote:
> > If it's hard to do in a single thread, how about timestamping the
> > events to insure that they happen in the expected order?
> >
> > That would verify the sequencing is happening as you expect and
> > _still_ not see the expected docs...
> >
> > Assuming it does fail, do you think you could reduce it to a
> > multi-threaded test case?
> >
> > Best,
> > Erick
> > On Fri, Nov 9, 2018 at 7:03 AM Boris Petrov <boris_petrov@live.com> wrote:
> >> Well, it's a bit involved to try it in a single thread as I've
> >> oversimplified the example. But as far as I understand this should work,
> >> right? So something else is wrong? Committing the writer and then
> >> "maybeRefreshBlocking" should be enough to have the changes visible, yes?
> >>
> >> On 11/9/18 4:45 PM, Michael Sokolov wrote:
> >>> That should work, I think, but if you are serializing these threads so
> >>> that they cannot run concurrently, maybe try running both operations
> >>> in a single thread, at least as a test.
> >>> On Fri, Nov 9, 2018 at 9:16 AM Boris Petrov <boris_petrov@live.com>
wrote:
> >>>> If you mean the synchronization of the threads, it is not in the
> >>>> example, but Thread 2 is *started* after Thread 1 finished executing
the
> >>>> code that I gave as an example. So there is happens-before between them.
> >>>> If you mean synchronization on the Lucene level - isn't that what
> >>>> "maybeRefreshBlocking" should do?
> >>>>
> >>>> On 11/9/18 3:29 PM, Michael Sokolov wrote:
> >>>>> I'm not seeing anything there that would synchronize, or serialize,
the
> >>>>> read after the write and commit. Did you expect that for some reason?
> >>>>>
> >>>>> On Fri, Nov 9, 2018, 6:00 AM Boris Petrov <boris_petrov@live.com
wrote:
> >>>>>
> >>>>>> Hi all,
> >>>>>>
> >>>>>> I'm using Lucene version 7.5.0. We have a test that does something
like:
> >>>>>>
> >>>>>> Thread 1:
> >>>>>>
> >>>>>>             Field idStringField = new StringField("id", id,
> >>>>>> Field.Store.YES);
> >>>>>>             Field contentsField = new TextField("contents",
reader);
> >>>>>>             Document document = new Document();
> >>>>>>             document.add(idStringField);
> >>>>>>             document.add(contentsField);
> >>>>>>
> >>>>>>             writer.updateDocument(new Term(ID_FIELD, id), document);
> >>>>>>             writer.flush(); // not sure this flush is needed?
> >>>>>>             writer.commit();
> >>>>>>
> >>>>>> Thread 2:
> >>>>>>
> >>>>>>             searchManager.maybeRefreshBlocking();
> >>>>>>             IndexSearcher searcher = searchManager.acquire();
> >>>>>>             try {
> >>>>>>                 QueryParser parser = new QueryParser("contents",
analyzer);
> >>>>>>                 Query luceneQuery = parser.parse(queryText);
> >>>>>>                 ScoreDoc[] hits = searcher.search(luceneQuery,
> >>>>>> 50).scoreDocs;
> >>>>>>             } finally {
> >>>>>>                 searchManager.release(searcher);
> >>>>>>             }
> >>>>>>
> >>>>>> Thread 1 happens before Thread 2.
> >>>>>>
> >>>>>> Sometimes, only sometimes, the commit from thread 1 is not *immediately*
> >>>>>> visible in Thread 2. If I put a "Thread.sleep(1000)" it always
works.
> >>>>>> Without it, sometimes the search is empty. I'm not sure if I'm
doing
> >>>>>> something wrong or this is a bug?
> >>>>>>
> >>>>>> Thanks!
> >>>>>>
> >>>>>>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> >> For additional commands, e-mail: java-user-help@lucene.apache.org
> >>
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > For additional commands, e-mail: java-user-help@lucene.apache.org
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> For additional commands, e-mail: java-user-help@lucene.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-user-help@lucene.apache.org


Mime
View raw message