lucenenet-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andrei Iliev (JIRA)" <j...@apache.org>
Subject [jira] Created: (LUCENENET-308) TestIndexWriter.TestThreadInterruptDeadlock
Date Tue, 24 Nov 2009 13:28:39 GMT
TestIndexWriter.TestThreadInterruptDeadlock
-------------------------------------------

                 Key: LUCENENET-308
                 URL: https://issues.apache.org/jira/browse/LUCENENET-308
             Project: Lucene.Net
          Issue Type: Bug
            Reporter: Andrei Iliev


2 problems with the test:
1) There is no .Net equivalent for java's java.lang.Thread.interrupted() and interrupted bit
 => we can not check if IW restored interrupted bit (there is no such bit).
2)  Sometimes test fails with exception:
An unhandled System.NullReferenceException was thrown while executing this test : Object reference
not set to an instance of an object.

In seems that in java statement  "synchronized(this) "
will never throw an InterruptedException but in .Net  statement lock(this) can throw such
exception. Because of this the inner exception sometimes will be null => cause System.NullReferenceException
exception.

Here's a snippet of code from the ConcurrentMergeScheduler
=============
lock (this) // (1)
                    {
                        MergeThread merger;
                        while (MergeThreadCount() >= maxThreadCount)
                        {
                            if (Verbose())
                                Message("    too many merge threads running; stalling...");
                            try
                            {
                                System.Threading.Monitor.Wait(this);  // (2)
                            }
                            catch (System.Threading.ThreadInterruptedException ie)
                            {
                                // In 3.0 we will change this to throw
                                // InterruptedException instead
                                SupportClass.ThreadClass.Current().Interrupt();
                                throw new System.SystemException(ie.Message, ie);
                            }
                        }
=============
In java  ThreadInterruptedException can  be thrown only in position (2). But in .Net it can
be  at  postion (1) as well.


I choose the easiest fix: check  not only inner exception but the  exception  as well

if(re is System.Threading.ThreadInterruptedException || e is System.Threading.ThreadInterruptedException)

As alternative we have to fix many places in ConcurrentMergeScheduler  by
-finding lock(this),
-add try , and  catch  blocks in the following way:

catch (System.Threading.ThreadInterruptedException ie)
                            {
                                // In 3.0 we will change this to throw
                                // InterruptedException instead
                                SupportClass.ThreadClass.Current().Interrupt();
                                throw new System.SystemException(ie.Message, ie);
                            }


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message