[ 
https://issues.apache.org/jira/browse/ACCUMULO-2400?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13911653#comment-13911653
 ] 

Keith Turner commented on ACCUMULO-2400:
----------------------------------------

LogWriter extends Daemon which extends Thread.   LogWriter is passed 
process.getInputStream() and then lw.start() is called which starts the thread. 
 After exec returns the test reads from process.getInputStream().   If the 
LogWriter thread has already read from process.getInputStream(), then the test 
will fail.  I was thinking of having another exec method that does not start 
log writer threads, instead it returns something like the following :

{code:java}
  class ProcessStreams{
     InputStream stdout;
     InputStream stderr;
  }
   
  public ProcessStreams exec(...){
    //tee stdout
    String logFileNAme = ..;
    new TeeInputStream(process.getInputStream(), new 
FileOutputStream(logFileName)) {
       public void close(){
             //overidde this method to read all data not read by test before 
closing... test need to close in finally block
       }
    }
 
    //also tee stder

   return new ProcessStreams(...)
  }
{code}



> race condition in ExamplesIT
> ----------------------------
>
>                 Key: ACCUMULO-2400
>                 URL: https://issues.apache.org/jira/browse/ACCUMULO-2400
>             Project: Accumulo
>          Issue Type: Bug
>         Environment: 6395840418046d8b3a923a4bfb3e4ba486c5dcd0
>            Reporter: Keith Turner
>             Fix For: 1.6.0
>
>
> Saw ExamplesIT fail with the following exception.  Looking at the code I 
> think there is a race condition.  The test calls the MAC.exec() function to 
> create a process and then reads from stdout of the process.  The MAC exec 
> function starts a background thread to read from stdout.  If this background 
> thread reads stdout before the test I think it will fail in the following 
> way.  Probably need to fix everywhere MAC exec is used in this way.  Could 
> either read from the file MAC creates or pass an option to MAC.exec() to not 
> start the background thread.
> {noformat}
> java.io.IOException: Stream closed
>       at 
> java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:162)
>       at java.io.BufferedInputStream.read(BufferedInputStream.java:325)
>       at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
>       at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
>       at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
>       at java.io.InputStreamReader.read(InputStreamReader.java:184)
>       at java.io.BufferedReader.fill(BufferedReader.java:154)
>       at java.io.BufferedReader.readLine(BufferedReader.java:317)
>       at java.io.BufferedReader.readLine(BufferedReader.java:382)
>       at 
> org.apache.accumulo.test.functional.ExamplesIT.testClasspath(ExamplesIT.java:172)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at java.lang.reflect.Method.invoke(Method.java:606)
>       at 
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
>       at 
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
>       at 
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
>       at 
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
>       at 
> org.junit.internal.runners.statements.FailOnTimeout$StatementThread.run(FailOnTimeout.java:74)
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

Reply via email to