[ http://issues.apache.org/jira/browse/DERBY-1694?page=all ]

Sunitha Kambhampati updated DERBY-1694:
---------------------------------------

    Attachment: derby1694.p2.diff.txt
                derby1694.p2.stat.txt

I was looking at the testProperties issue that caused problems because of test 
hang. The test doesnt hang in my environment but I thought I would look to see 
why the test didnt timeout. 

I found couple of issues here:
0. The testProperties.java and several networkserver tests exec new processes 
to start server, test properties,shutdown server etc. In some cases, we wait to 
capture the output from the subprocess that is started. ProcessStreamResult is 
used for this purpose.  ProcessStreamResult is part of the harness (see 
org.apache.derbyTesting.functionTests.harness.ProcessStreamResult) and it 
starts a thread to read data from the process's stream and writes it out. Once 
EOS (-1) is reached, the thread exits after doing a notifyAll. 

1. ProcessStreamResult.Wait() does not work with the timeout case. I think the 
original intention of the method that takes the timeout was to force the thread 
to stop, once the timeout period has elapsed. The method Wait() does not handle 
this case.
2. On timeout, the myThread needs to stop its work. The run() method does not 
handle this case.
3. testProperties test does not make use of the ProcessStreamResult timeout 
mechanism.  
4. Process's are exec'd in the tests and they are not destroyed within a 
timeout period. The network server tests start server using Process, and then 
cleanup by shutting them down.  It will all work ok, if no deadlock or blocking 
of process's occur. It seems to me though, that we should have a way to destroy 
the processes that are 
started as part of each test given a timeout period.  Each test must learn to 
do the cleanup when it leaves and the test has knowledge of all the 
sub-processes that it has exec'd.  The current test harness has a class 
TimedProcess which could work. 

In the spirit of incremental development, I am attaching a 
patch(derby1694.p2.diff.txt and corresponding stat file - 
derby1694.p2.stat.txt)  that fixes problems 1,2 and 3.  I think #4 can be 
handled as a separate issue/patch.

This patch 
-- fixes the timeout handling in ProcessStreamResult.  Instance variable 
'interrupted' is a flag to indicate if a timeout has occurred or if the 
thread's work has been interrupted in between.  The flag 'finished' indicates 
whether  the work has been finished by the thread. Changes are in Wait() method 
to make use of wait(timeoutms) if a timeout is specified in 
ProcessStreamResult. If timeout time has elapsed, then the interrupted flag is 
set to true.
-- Adds condition in the run() method to check if interrupted is true. If so, 
the thread will stop its work and leave.
-- correctly return if the thread's work was interrupted either because of a 
timeout or if it was interrupted.
-- Make use of the ProcessStreamResult with a timeout setting of 2 minutes in 
testProperties test. Note, the timeout handling only comes into effect when 
ProcessStreamResult.Wait() method is called.

other notes:
-- when you run a test, the suite property for timeout does not get picked up. 
I think this is intentional behavior. 
-- Issues mentioned above are not specific to just testProperties but exist for 
other networkserver tests. There are a total of 7 files in derbynet that make 
use of this.  

I'd like feedback on this patch. If this approach seems ok, then we can make 
these changes to the 6 other networkserver tests also.

I ran derbyall on ibm142/linux and no new failures. Two tests failed, 
blobclob4BLOB(derby-1844) and the known DerbyNetAutoStart.   These 2 failures 
are not related to these changes. 

Thanks. 

> derbynet/testProperties.java hangs
> ----------------------------------
>
>                 Key: DERBY-1694
>                 URL: http://issues.apache.org/jira/browse/DERBY-1694
>             Project: Derby
>          Issue Type: Bug
>          Components: Regression Test Failure
>    Affects Versions: 10.3.0.0
>         Environment: Windows XP  IBM 142 JRE
>            Reporter: Daniel John Debrunner
>             Fix For: 10.2.1.0
>
>         Attachments: derby1694.p2.diff.txt, derby1694.p2.stat.txt, 
> derby1694diff.txt
>
>
> The testProperties.execCmd() is used to fork a JVM and not handle its
> streams. This will cause problems, as indicated by the javadoc for Process.
> "The parent process uses these streams to feed input to and get output
> from the subprocess. Because some native platforms only provide limited
> buffer size for standard input and output streams, failure to promptly
> write the input stream or read the output stream of the subprocess may
> cause the subprocess to block, and even deadlock"

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to