[
http://opensource.atlassian.com/projects/hibernate/browse/HSEARCH-573?pag...
]
Christian Köberl commented on HSEARCH-573:
------------------------------------------
The massindexer was not designed to be run concurrently with normal
event-based activity.
But what should you do - lock users out while re-indexing
(e.g. after a data import)?
We should lock the DPs, or make sure that we share the same
IndexWriter from the backend.
Same IndexWriter would be a good idea - especially
when you set "exclusive_index_use" to "true", cause then locks are
held forever (or very long).
BTW we have a simple workaround for this (which doesn't solve the issue but leads to
less conflicts): set global write lock timeout (IndexWriter#setWriteLockTimeout) to some
hours. Now, (if sync) the user has to wait for re-indexing to finish - that can be a
while.
PerDPQueueProcessor forces release of lock even if not held - causes
corrupt index
----------------------------------------------------------------------------------
Key: HSEARCH-573
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HSEARCH-573
Project: Hibernate Search
Issue Type: Bug
Components: engine, massindexer
Affects Versions: 3.2.0.CR1, 3.2.0.Final, 3.2.1, 3.3.0.Alpha1
Environment: Hibernate 3.5.0-Final, Oracle 10g
Reporter: Christian Köberl
Assignee: Sanne Grinovero
Fix For: 3.2.2, 3.3.0
Attachments: testHibernateSearchLockFailure.zip
Occurs: when an indexed entity is modified while another thread is re-indexing the index
for that entity
Consequences: Hibernate Search calls "workspace.forceLockRelease();" in the
catch-block of PerDPQueueProcessor#run - so the lock held by the batch indexer is
forcefully released. That means the next entity index operation will write to the index
causing the index to be corrupt.
h2. First Exception - triggers forceLockRelease
{noformat}
ERROR| Unexpected error in Lucene Backend:
| at
org.hibernate.search.backend.impl.lucene.PerDPQueueProcessor.run(PerDPQueueProcessor.java:118)
org.hibernate.search.SearchException: Unable to open IndexWriter
at org.hibernate.search.backend.Workspace.getIndexWriter(Workspace.java:159)
at
org.hibernate.search.backend.impl.lucene.PerDPQueueProcessor.run(PerDPQueueProcessor.java:103)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:432)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:284)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:678)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:703)
at java.lang.Thread.run(Thread.java:811)
Caused by:
org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out:
SimpleFSLock@C:\Temp\turntableLuceneIndex\LogEntry\lucene-74da319434c1dd9f133d63245791e1b4-write.lock
at org.apache.lucene.store.Lock.obtain(Lock.java:85)
at org.apache.lucene.index.IndexWriter.init(IndexWriter.java:1538)
at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:1067)
at org.hibernate.search.backend.Workspace.getIndexWriter(Workspace.java:152)
... 7 more
WARN | going to force release of the IndexWriter lock
| at
org.hibernate.search.backend.Workspace.forceLockRelease(Workspace.java:221)
{noformat}
h2. second Exception - index is destroyed
{noformat}
ERROR| Exception occurred org.hibernate.search.SearchException: Unable to add to Lucene
index: class com.poi.egh.turntable.vehicle.domain.vehicle.Vehicle#200
Primary Failure:
Entity com.poi.egh.turntable.vehicle.domain.vehicle.Vehicle Id 200 Work Type
org.hibernate.search.backend.AddLuceneWork
| at
org.hibernate.search.exception.impl.LogErrorHandler.logError(LogErrorHandler.java:83)
org.hibernate.search.SearchException: Unable to add to Lucene index: class
com.poi.egh.turntable.vehicle.domain.vehicle.Vehicle#200
at
org.hibernate.search.backend.impl.lucene.works.AddWorkDelegate.performWork(AddWorkDelegate.java:81)
at
org.hibernate.search.backend.impl.lucene.PerDPQueueProcessor.run(PerDPQueueProcessor.java:106)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:432)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:284)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:678)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:703)
at java.lang.Thread.run(Thread.java:811)
Caused by:
java.io.IOException: Cannot overwrite: C:\temp\turntableLuceneIndex\vehicle\_5.fdt
at org.apache.lucene.store.FSDirectory.initOutput(FSDirectory.java:362)
at org.apache.lucene.store.SimpleFSDirectory.createOutput(SimpleFSDirectory.java:58)
at org.apache.lucene.index.FieldsWriter.<init>(FieldsWriter.java:61)
at
org.apache.lucene.index.StoredFieldsWriter.initFieldsWriter(StoredFieldsWriter.java:66)
at
org.apache.lucene.index.StoredFieldsWriter.finishDocument(StoredFieldsWriter.java:144)
at
org.apache.lucene.index.StoredFieldsWriter$PerDoc.finish(StoredFieldsWriter.java:190)
at
org.apache.lucene.index.DocumentsWriter$WaitQueue.writeDocument(DocumentsWriter.java:1466)
at org.apache.lucene.index.DocumentsWriter$WaitQueue.add(DocumentsWriter.java:1485)
at org.apache.lucene.index.DocumentsWriter.finishDocument(DocumentsWriter.java:1089)
at org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:775)
at org.apache.lucene.index.DocumentsWriter.addDocument(DocumentsWriter.java:750)
at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:2454)
at
org.hibernate.search.backend.impl.lucene.works.AddWorkDelegate.performWork(AddWorkDelegate.java:77)
... 7 more
{noformat}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira