[hibernate-dev] MassIndexer have any known issues when InfinispanDirectory is used?
Tom Waterhouse
tomwaterhouse at gmail.com
Wed Aug 31 15:17:44 EDT 2011
I have a test case available. In the test case a
org.apache.lucene.store.LockObtainFailedException instance is thrown.
Should I attach the test case to an email sent to this list?
On Tue, Aug 30, 2011 at 12:50 AM, Sanne Grinovero <sanne at hibernate.org>wrote:
> Is it using exclusive_index_use=true ? Exclusive index use does not
> work nicely with the MassIndexer in version 3.4, that's one of the
> issues fixed in 4.0 (included in the last alpha release).
> Is the same test & configuration working fine if you change it only
> from Infinispan to a filesystem Directory ?
>
> I'm asking these questions as the MassIndexer will grab this exclusive
> lock from the main backend, and the "main backend" is supposed to not
> have any pending activity when it's started. Are you aware of other
> ongoing writes to the index while the MassIndexer starts?
>
> If there is a limited amount of activity it should be able to acquire
> the lock, but in the way Lucene's BaseLuceneLock works it's only
> polling, not a fair lock, so if the standard backend is constantly
> writing it might timeout waiting for the writes to finish.
>
> A testcase would help; as pointed out in my previous mail I've written
> one and found no issues, so please help me reproducing the issue. You
> could also open an issue and attach both your Infinispan and Search
> configurations.
>
> Regards,
> Sanne
>
> 2011/8/29 Tom Waterhouse <tomwaterhouse at gmail.com>:
> > Here is the associated stack at the time of the call, if it would be
> > helpful. The stack is the same for both the initial call that obtains
> the
> > lock and the second and subsequent calls that fail.
> >
> > BaseLuceneLock(Lock).obtain(long) line: 72
> > IndexWriter.<init>(Directory, IndexWriterConfig) line: 1115
> > Workspace.createNewIndexWriter(DirectoryProvider<?>,
> IndexWriterConfig,
> > ParameterSet) line: 202
> > Workspace.getIndexWriter(boolean, ErrorContextBuilder) line: 175
> > Workspace.getIndexWriter(boolean) line: 210
> > DirectoryProviderWorkspace.doWorkInSync(LuceneWork) line: 96
> >
> >
> LuceneBatchBackend$SyncBatchPerDirectoryWorkProcessor.addWorkToDpProcessor(DirectoryProvider<?>,
> > LuceneWork) line: 139
> >
> >
> DpSelectionVisitor$PurgeAllSelectionDelegate.addAsPayLoadsToQueue(LuceneWork,
> > IndexShardingStrategy, PerDirectoryWorkProcessor) line: 119
> > LuceneBatchBackend.sendWorkToShards(LuceneWork,
> > PerDirectoryWorkProcessor) line: 119
> > LuceneBatchBackend.doWorkInSync(LuceneWork) line: 80
> > BatchCoordinator.beforeBatch() line: 153
> > BatchCoordinator.run() line: 96
> > MassIndexerImpl.startAndWait() line: 203
> > ArticleSearchControllerImpl.reindexAllArticles() line: 215
> > NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not
> > available [native method]
> > NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
> > DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
> > Method.invoke(Object, Object...) line: 597
> > AopUtils.invokeJoinpointUsingReflection(Object, Method, Object[])
> line:
> > 307
> > ReflectiveMethodInvocation.invokeJoinpoint() line: 183
> > ReflectiveMethodInvocation.proceed() line: 150
> > TransactionInterceptor.invoke(MethodInvocation) line: 110
> > ReflectiveMethodInvocation.proceed() line: 172
> > JdkDynamicAopProxy.invoke(Object, Method, Object[]) line: 202
> > $Proxy168.reindexAllArticles() line: not available
> > ReindexArticlesJob.executeJob(JobExecutionContext) line: 24
> > ReindexArticlesJob(AbstractJob).execute(JobExecutionContext) line: 79
> > JobRunShell.run() line: 214
> > SimpleThreadPool$WorkerThread.run() line: 549
> >
> >
> > On Mon, Aug 29, 2011 at 2:49 PM, Tom Waterhouse <tomwaterhouse at gmail.com
> >
> > wrote:
> >>
> >> I set a breakpoint inside of org.apache.lucene.store.Lock.obtain(long)
> and
> >> noticed something peculiar - the method is called twice. The first call
> >> succeeds, the second fails, my guess because the first call obtained the
> >> lock.
> >>
> >> I added logging/stepped through our code to verify that we only make the
> >> call one time, and in fact that is the case.
> >>
> >> We are using JPA and JTA, would that impact the call to obtain the lock
> in
> >> such a way as to allow two calls?
> >>
> >> Here is the call we make, including the logging statements I've added.
> >> This call is done inside of a JTA transaction.
> >>
> >> FullTextEntityManager fullTextEntityManager =
> >> org.hibernate.search.jpa.Search.getFullTextEntityManager(em);
> >>
> >> logger.info("creating MassIndexer");
> >> MassIndexer massIndexer =
> >> fullTextEntityManager.createIndexer(Article.class);
> >> massIndexer.batchSizeToLoadObjects(30);
> >> massIndexer.threadsForSubsequentFetching(8);
> >> massIndexer.threadsToLoadObjects(4);
> >> logger.info("starting MassIndexer");
> >> massIndexer.startAndWait();
> >>
> >>
> >> On Sun, Aug 28, 2011 at 9:28 AM, Sanne Grinovero <sanne at hibernate.org>
> >> wrote:
> >>>
> >>> Hi Tom,
> >>> I've created a test checking for both event-driven changes and the
> >>> MassIndexer, double-checking event-driven changes after the
> >>> MassIndexer completion, starting two nodes initially and adding a
> >>> third node dynamically during the test execution.. alls seems to work
> >>> flawlessly, a part of taking so long due the jgroups delays for
> >>> starting a new node (it takes ~14 seconds to run).
> >>> you can find it here:
> >>>
> >>>
> https://github.com/Sanne/hibernate-search/tree/MassIndexerWithInfinispan5.0-Search3.4
> >>>
> >>> Could you please check this test out and change it as much as you feel
> >>> is needed to reproduce the problem?
> >>>
> >>> Also note the previous commit to change the Infinispan version to 5.0:
> >>> you mentioned you're using 5.0 but Search 3.4 was intended to support
> >>> Infinispan 4.2.x, so I had to apply some minimal changes.
> >>>
> >>> You might want to try out Hibernate Search 4.0.0.Alpha1, intended to
> >>> support Infinispan 5.x, but I've created this test for Search 3.4 as
> >>> the backends interaction in 4.0 is very different: there are not two
> >>> competing backends anymore, but a unified access to the IndexWriter,
> >>> so to try reproducing your issue it was pointless to try it out on
> >>> master.
> >>>
> >>> Sanne
> >>>
> >>> 2011/8/27 Tom Waterhouse <tomwaterhouse at gmail.com>:
> >>> > Sanne,
> >>> >
> >>> > There aren't any other nodes involved in the cluster. This is the
> >>> > 'just
> >>> > make it work' phase of the project, so the simplest configuration is
> >>> > being
> >>> > used.
> >>> >
> >>> > Note that normal index access is fine. Entity operations populate
> the
> >>> > Lucene indexes as expected, and search operations work as expected.
> It
> >>> > is
> >>> > only the MassIndexer that has had trouble to this point.
> >>> >
> >>> > Tom
> >>> >
> >>> > On Fri, Aug 26, 2011 at 7:02 AM, Sanne Grinovero <
> sanne at hibernate.org>
> >>> > wrote:
> >>> >>
> >>> >> Hi Tom,
> >>> >>
> >>> >> the MassIndexer needs to acquire the Directory lock, which is in
> this
> >>> >> case distributed, i.e. it's a single lock to coordinate writes
> across
> >>> >> all nodes (searches can happen in parallel, but writes can not).
> >>> >>
> >>> >> Is it possible that another node is writing to the index, or is any
> >>> >> node using exclusive_index_use=true ?
> >>> >>
> >>> >> Regards,
> >>> >> Sanne
> >>> >>
> >>> >> 2011/8/25 Tom Waterhouse <tomwaterhouse at gmail.com>:
> >>> >> > I'm trying to setup clustering of entities and Lucene indexes for
> >>> >> > our
> >>> >> > app
> >>> >> > with Hibernate 3.6.5, Hibernate Search 3.4.0, Infinispan 5.0. I'm
> >>> >> > using
> >>> >> > FileCacheStore for the Infinispan cache loader
> >>> >> > (InfinispanDirectoryProvider).
> >>> >> >
> >>> >> > MassIndexerImpl.startAndWait() never returns with this
> >>> >> > configuration. A
> >>> >> > lock is never able to be obtained, see the stack from a thread
> dump
> >>> >> > below.
> >>> >> > The same MassIndexer call works fine when using
> FSDirectoryProvider.
> >>> >> >
> >>> >> > Should MassIndexer work with Infinispan as the directory?
> >>> >> >
> >>> >> > Tom
> >>> >> >
> >>> >> > java.lang.Thread.State: TIMED_WAITING (sleeping)
> >>> >> > at java.lang.Thread.sleep(Native Method)
> >>> >> > at org.apache.lucene.store.Lock.obtain(Lock.java:91)
> >>> >> > at
> >>> >> > org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:1097)
> >>> >> > at
> >>> >> >
> >>> >> >
> >>> >> >
> org.hibernate.search.backend.Workspace.createNewIndexWriter(Workspace.java:202)
> >>> >> > at
> >>> >> >
> >>> >> >
> >>> >> >
> org.hibernate.search.backend.Workspace.getIndexWriter(Workspace.java:175)
> >>> >> > - locked <7793180e8> (a org.hibernate.search.backend.Workspace)
> >>> >> > _______________________________________________
> >>> >> > hibernate-dev mailing list
> >>> >> > hibernate-dev at lists.jboss.org
> >>> >> > https://lists.jboss.org/mailman/listinfo/hibernate-dev
> >>> >> >
> >>> >
> >>> >
> >>
> >
> >
>
More information about the hibernate-dev
mailing list