You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Marcel Offermans (Commented) (JIRA)" <ji...@apache.org> on 2012/02/03 13:43:54 UTC

[jira] [Commented] (FELIX-3336) Exceptions related to the pipe used in deployment admin

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

Marcel Offermans commented on FELIX-3336:
-----------------------------------------

A solution has been committed, but I'm not quite sure why it works. If you do a checkout, and run "mvn clean install" the test succeeds. If you apply this patch:

{code}

Index: src/main/java/org/apache/felix/deploymentadmin/ExplodingOutputtingInputStream.java
===================================================================
--- src/main/java/org/apache/felix/deploymentadmin/ExplodingOutputtingInputStream.java	(revision 1240137)
+++ src/main/java/org/apache/felix/deploymentadmin/ExplodingOutputtingInputStream.java	(working copy)
@@ -73,7 +73,7 @@
         super(inputStream, output);
         m_contentDir = root;
         m_indexFile = index;
-        m_input = new PipedInputStream(output /*, 8 FELIX-3336: if you provide such a small buffer, the error is reproducible (see below) */);
+        m_input = new PipedInputStream(output , 8 /* FELIX-3336: if you provide such a small buffer, the error is reproducible (see below) */);
         m_task = new Thread(this, "Apache Felix DeploymentAdmin - ExplodingOutputtingInputStream");
         m_task.start();
     }
@@ -129,16 +129,16 @@
             }
         }
         // FELIX-3336: if you include this code, the issue is gone
-        try {
-            byte[] bb = new byte[512];
-            int c = m_input.read(bb);
-            while (c != -1) {
-                c = m_input.read(bb);
-            }
-        }
-        catch (IOException e) {
-            e.printStackTrace();
-        }
+//        try {
+//            byte[] bb = new byte[512];
+//            int c = m_input.read(bb);
+//            while (c != -1) {
+//                c = m_input.read(bb);
+//            }
+//        }
+//        catch (IOException e) {
+//            e.printStackTrace();
+//        }
     }

{code}

And then run the test again, you get:

{code}

$ cat target/surefire-reports/org.apache.felix.deploymentadmin.ExplodingOutputtingInputStreamTest.txt 
-------------------------------------------------------------------------------
Test set: org.apache.felix.deploymentadmin.ExplodingOutputtingInputStreamTest
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 1.071 sec <<< FAILURE!
testStream(org.apache.felix.deploymentadmin.ExplodingOutputtingInputStreamTest)  Time elapsed: 1.057 sec  <<< ERROR!
java.io.IOException: Read end dead
	at java.io.PipedInputStream.checkStateForReceive(PipedInputStream.java:246)
	at java.io.PipedInputStream.awaitSpace(PipedInputStream.java:252)
	at java.io.PipedInputStream.receive(PipedInputStream.java:215)
	at java.io.PipedOutputStream.write(PipedOutputStream.java:132)
	at org.apache.felix.deploymentadmin.OutputtingInputStream.read(OutputtingInputStream.java:58)
	at org.apache.felix.deploymentadmin.ExplodingOutputtingInputStreamTest.testStream(ExplodingOutputtingInputStreamTest.java:47)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [...]

{code}

For some weird reason the read blocks and finally generates an exception because the pipe has been closed. I have no clue why the read blocks though, and why reading extra bytes from an underlying stream (m_input) that should have already been read completely (this ZipInputStream reads everything it should) unblocks the read. Admittedly, this is not the easiest piece of code to read, but I can't find a fundamental flaw in the approach. Maybe someone else can. :)
                
> Exceptions related to the pipe used in deployment admin
> -------------------------------------------------------
>
>                 Key: FELIX-3336
>                 URL: https://issues.apache.org/jira/browse/FELIX-3336
>             Project: Felix
>          Issue Type: Bug
>          Components: Deployment Admin
>            Reporter: Marcel Offermans
>
> Sporadically getting "Pipe closed" exceptions. Not reproducible yet, but seemingly related to a line containing "input.close()" in the ExplodingOutputtingInputStream. Needs investigation.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira