[
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)