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.

Reply via email to