Mark, Just for my clarification,
1) Would you have indexStop and indexStart methods? If that's the case then I don't have to call close() at all. These new methods would serve as just cleaning up the caches and not closing the thread pool. I would prefer not to call close() and init() again if possible. The reason we have to do partition is because our index size grows over 50G a week and then optimization takes hours. I'd a thread going on this topic in the mailing list, http://www.gossamer-threads.com/lists/lucene/java-user/57366?search_string=partition;#57366. Thanks, -vivek On Thu, Feb 28, 2008 at 5:01 PM, Mark Miller <[EMAIL PROTECTED]> wrote: > I added the Thread Pool recently, so things did probably work before > that. I am certainly willing to put the Thread Pool init in the open > call instead of the constructor. > > As for the best method to use, I was thinking of something along the > same lines as what you suggest. > > One of the decisions will be how to handle shutting down method calls on > the Accessor. Throw an Exception or block? > > In any case, I will put up code that makes the above change and your > code should work as it did. I'll be sure to add this to the test cases. > > > Just as a personal interest question, what has led you to setup your > index this way? Adding partitions as it grows that is. > > > > - Mark > > vivek sar wrote: > > Mark, > > > > Yes, I think that's what precisely is happening. I call > > accessor.close, which shuts down all the ExecutorService. I was > > assuming the accessor.open would re-open it (I think that's how it > > worked in older version of your IndexAccessor). > > > > Basically, I need a way to stop (or close) all the IndexSearchers for > > a specific IndexAccessor and do not allow them to re-open until I flag > > the indexAccessor that it's safe to give out new index searchers. So I > > am able to optimize the index, rename it and move it to somewhere else > > during partitioning. Right now without closing the searchers I can not > > rename the index as it wouldn't allow me to if some other thread has a > > file handle to that index. > > > > I don't know if there is a way to get an exclusive writer thread to an > > index using IndexAccessor. I would think a better way for me would be > > to, > > > > 1) Call a method on IndexAccessor, let's say stopIndex() - This > > would clear all the caches (stop all the open searchers, readers and > > writers) and flag the index accessor so no other reader or writer > > thread can be taken from this index accessor > > 2) I use my own (not using IndexAccessor) IndexWriter to do > > optimization on the index that needs to be partitioned and release it > > 3) Once done with partition, I call another method on > > IndexAccessor, let's say startIndex() -> This will simply flag so > > now the IndexAccessor would allow to get searchers, readers and > > writers. The start would have to reopen all the searchers and readers. > > > > Not sure if this is a good design for what I am trying to do. This > > would require two new methods on IndexAccessor - stopIndex() and > > startIndex(). Any thoughts? > > > > Thanks, > > -vivek > > > > > > On Thu, Feb 28, 2008 at 3:55 PM, Mark Miller <[EMAIL PROTECTED]> wrote: > > > >> Hey vivek, > >> > >> Sorry you ran into this. I believe the problem is that I had just not > >> foreseen the use case of closing and then reopening the Accessor. The > >> only time I ever close the Accessors is when I am shutting down the JVM. > >> > >> What do you do about all of the IndexAccessor requests while it is in a > >> closed state? Could their be a better way of accomplishing this without > >> closing the Accessor? Would a new method that just stalled everything be > >> better? Then you wouldn't have to recreate any resources possibly? > >> > >> In any case, the problem is that after the Executor gets shutdown it is > >> not reopened in the open method. I can certainly change this, but I need > >> to look for any other issues as well. I will add an open after a > >> shutdown test to investigate. I am going to think about the issue > >> further and I will get back to you soon. > >> > >> Thanks for all of the details. > >> > >> - Mark > >> > >> > >> > >> vivek sar wrote: > >> > Mark, > >> > > >> > Some more information, > >> > > >> > 1) I run indexwriter every 5 mins > >> > 2) After every cycle I check if I need to partition (based on > >> > the index size) > >> > 3) In the partition interface, > >> > a) I first call close on the index accessor (so all the > >> > searchers can close before I move that index) > >> > accessor = > >> > IndexAccessorFactory.getInstance().getAccessor(dir.getFile()); > >> > accessor.close(); > >> > b) Then I re-open the index accessor, > >> > accessor = > indexFactory.getAccessor(dir.getFile()); > >> > accessor.open(); > >> > c) I optimized the my indexes using the Index Writer (that > >> > I get from the accessor). > >> > masterWriter = > this.indexAccessor.getWriter(false); > >> > masterWriter.optimize(optimizeSegment); > >> > d) Once the optimization is done I release the > masterWriter, > >> > this.indexAccessor.release(masterWriter); > >> > > >> > Now here is where I get the "RejectedExecutionException". > >> > Reading up little more on this exception, > >> > > http://pveentjer.wordpress.com/2008/02/06/are-you-dealing-with-the-rejectedexecutionexception/, > >> > I see this might be happening because something got stuck during the > >> > close cycle, so the ExecutorSerivce is not accepting any new tasks. > >> > I'm not sure how would this happen. > >> > > >> > The critical problem is once I get this exception, every release call > >> > throws the same exception (looks like shutdown never gets done). > >> > Because of this my readers are never refreshed and I can not read any > >> > new indexes. > >> > > >> > May be I've to check whether the accessor is completely closed before > >> > re-opening? Could you in your release check whether the pool > >> > (ExecutorService) is in shutdown state? Any thing else I can check? > >> > > >> > Thanks, > >> > -vivek > >> > > >> > On Thu, Feb 28, 2008 at 1:26 PM, vivek sar <[EMAIL PROTECTED]> wrote: > >> > > >> >> Mark, > >> >> > >> >> We deployed our indexer (using defaultIndexAccessor) on one of the > >> >> production site and getting this error, > >> >> > >> >> Caused by: java.util.concurrent.RejectedExecutionException > >> >> at > java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(Unknown > >> >> Source) > >> >> at java.util.concurrent.ThreadPoolExecutor.reject(Unknown > Source) > >> >> at java.util.concurrent.ThreadPoolExecutor.execute(Unknown > Source) > >> >> at > org.apache.lucene.indexaccessor.DefaultIndexAccessor.release(DefaultIndexAccessor.java:514) > >> >> > >> >> > >> >> This is happening repeatedly every time the indexer runs. > >> >> > >> >> This is running your latest IndexAccessor-021508 code. Any ideas > >> >> (it's kind of urgent for us)? > >> >> > >> >> Thanks, > >> >> -vivek > >> >> > >> >> > >> >> > >> >> > >> >> On Fri, Feb 15, 2008 at 6:50 PM, vivek sar <[EMAIL PROTECTED]> wrote: > >> >> > Mark, > >> >> > > >> >> > Thanks for the quick fix. Actually, it is possible that there > might > >> >> > had been simultaneous queries using the MultiSearcher. I assumed > it > >> >> > was thread-safe, thus was re-using the same instance. I'll update > my > >> >> > application code as well. > >> >> > > >> >> > Thanks, > >> >> > -vivek > >> >> > > >> >> > > >> >> > > >> >> > On Feb 15, 2008 5:56 PM, Mark Miller <[EMAIL PROTECTED]> wrote: > >> >> > > Here is the fix: > https://issues.apache.org/jira/browse/LUCENE-1026 > >> >> > > > >> >> > > > >> >> > > vivek sar wrote: > >> >> > > > Mark, > >> >> > > > > >> >> > > > There seems to be some issue with > DefaultMultiIndexAccessor.java. I > >> >> > > > got following NPE exception, > >> >> > > > > >> >> > > > 2008-02-13 07:10:28,021 ERROR [http-7501-Processor6] > ReportServiceImpl - > >> >> > > > java.lang.NullPointerException > >> >> > > > at > org.apache.lucene.indexaccessor.DefaultMultiIndexAccessor.release(DefaultMultiIndexAccessor.java:89) > >> >> > > > > >> >> > > > Looks like the IndexAccessor for one of the Searcher in the > >> >> > > > MultiSearcher returned null. Not sure how is that possible, > any ideas > >> >> > > > how is that possible? > >> >> > > > > >> >> > > > In my case it caused a critical error as the writer thread > was stuck > >> >> > > > forever (we found out after couple of days) because of this, > >> >> > > > > >> >> > > > "PS thread 9" prio=1 tid=0x00002aac70eb95d0 nid=0x6ba in > Object.wait() > >> >> > > > [0x0000000047533000..0x0000000047533b80] > >> >> > > > at java.lang.Object.wait(Native Method) > >> >> > > > - waiting on <0x00002aab3e5c7700> (a > >> >> > > > org.apache.lucene.indexaccessor.DefaultIndexAccessor) > >> >> > > > at java.lang.Object.wait(Unknown Source) > >> >> > > > at > org.apache.lucene.indexaccessor.DefaultIndexAccessor.waitForReadersAndCloseCached(DefaultIndexAccessor.java:593) > >> >> > > > at > org.apache.lucene.indexaccessor.DefaultIndexAccessor.release(DefaultIndexAccessor.java:510) > >> >> > > > - locked <0x00002aab3e5c7700> (a > >> >> > > > org.apache.lucene.indexaccessor.DefaultIndexAccessor) > >> >> > > > > >> >> > > > The only way to recover was to re-start the application. > >> >> > > > > >> >> > > > I use both MultiSearcher and IndexSearcher in my application, > I've > >> >> > > > looked at your code but not able to pinpoint how can it go > wrong? Of > >> >> > > > course, you do have to check for null in the > >> >> > > > MultiIndexAccessor.release, but how could you get null index > accessor > >> >> > > > at first place? > >> >> > > > > >> >> > > > I do call IndexAccessor.close during partitioning of indexes, > but the > >> >> > > > close should wait for all Searchers to close before doing > anything. > >> >> > > > > >> >> > > > Do you have any updates to your code since 02/04/2008? > >> >> > > > > >> >> > > > Thanks, > >> >> > > > -vivek > >> >> > > > > >> >> > > > On Feb 6, 2008 8:37 AM, Jay <[EMAIL PROTECTED]> wrote: > >> >> > > > > >> >> > > >> Thanks for your clarifications, Mark! > >> >> > > >> > >> >> > > >> > >> >> > > >> Jay > >> >> > > >> > >> >> > > >> > >> >> > > >> Mark Miller wrote: > >> >> > > >> > >> >> > > >>>> 5. Although currently IndexSearcher.close() does almost > nothing except > >> >> > > >>>> to close the internal index reader, it might be a safer to > close > >> >> > > >>>> searcher itself as well in closeCachedSearcher(), just in > case, the > >> >> > > >>>> searcher may have other resources to release in the future > version of > >> >> > > >>>> Lucene. > >> >> > > >>>> > >> >> > > >>> Didn't catch that "as well". You are right, great idea Jay, > thanks. > >> >> > > >>> > >> >> > > >>> > --------------------------------------------------------------------- > >> >> > > >>> To unsubscribe, e-mail: [EMAIL PROTECTED] > >> >> > > >>> For additional commands, e-mail: [EMAIL PROTECTED] > >> >> > > >>> > >> >> > > >> > --------------------------------------------------------------------- > >> >> > > >> To unsubscribe, e-mail: [EMAIL PROTECTED] > >> >> > > >> For additional commands, e-mail: [EMAIL PROTECTED] > >> >> > > >> > >> >> > > >> > >> >> > > >> > >> >> > > > > >> >> > > > > --------------------------------------------------------------------- > >> >> > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > >> >> > > > For additional commands, e-mail: [EMAIL PROTECTED] > >> >> > > > > >> >> > > > > >> >> > > > > >> >> > > > >> >> > > > --------------------------------------------------------------------- > >> >> > > To unsubscribe, e-mail: [EMAIL PROTECTED] > >> >> > > For additional commands, e-mail: [EMAIL PROTECTED] > >> >> > > > >> >> > > > >> >> > > >> >> > >> >> > >> > > >> > --------------------------------------------------------------------- > >> > To unsubscribe, e-mail: [EMAIL PROTECTED] > >> > For additional commands, e-mail: [EMAIL PROTECTED] > >> > > >> > > >> > > >> > >> --------------------------------------------------------------------- > >> To unsubscribe, e-mail: [EMAIL PROTECTED] > >> For additional commands, e-mail: [EMAIL PROTECTED] > >> > >> > >> > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]