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_pet...@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! >> >>