You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by st...@apache.org on 2014/07/01 15:57:27 UTC

svn commit: r1607081 - in /jackrabbit/oak/trunk: oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/mk/ oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/mk/ oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/ oak-core/src/main/...

Author: stefan
Date: Tue Jul  1 13:57:26 2014
New Revision: 1607081

URL: http://svn.apache.org/r1607081
Log:
OAK-1931: MicroKernel.read() returns negative value

Modified:
    jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/mk/MicroKernelInputStream.java
    jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/mk/MicroKernelInputStreamTest.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStoreKernel.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java
    jackrabbit/oak/trunk/oak-it/mk/src/main/java/org/apache/jackrabbit/mk/test/MicroKernelIT.java
    jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/core/MicroKernelImpl.java

Modified: jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/mk/MicroKernelInputStream.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/mk/MicroKernelInputStream.java?rev=1607081&r1=1607080&r2=1607081&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/mk/MicroKernelInputStream.java (original)
+++ jackrabbit/oak/trunk/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/mk/MicroKernelInputStream.java Tue Jul  1 13:57:26 2014
@@ -54,8 +54,8 @@ public class MicroKernelInputStream exte
     @Override
     public int read(byte[] b, int off, int len) {
         int l = mk.read(id, pos, b, off, len);
-        if (l < 0) {
-            return l;
+        if (l <= 0) {
+            return -1;
         }
         pos += l;
         return l;

Modified: jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/mk/MicroKernelInputStreamTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/mk/MicroKernelInputStreamTest.java?rev=1607081&r1=1607080&r2=1607081&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/mk/MicroKernelInputStreamTest.java (original)
+++ jackrabbit/oak/trunk/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/mk/MicroKernelInputStreamTest.java Tue Jul  1 13:57:26 2014
@@ -250,7 +250,8 @@ public class MicroKernelInputStreamTest 
                     InputStream stream = new ByteArrayInputStream(data);
                     try {
                         ByteStreams.skipFully(stream, pos);
-                        return stream.read(buff, off, length);
+                        int read = stream.read(buff, off, length);
+                        return read < 0 ? 0 : read;
                     } finally {
                         stream.close();
                     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStoreKernel.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStoreKernel.java?rev=1607081&r1=1607080&r2=1607081&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStoreKernel.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStoreKernel.java Tue Jul  1 13:57:26 2014
@@ -623,7 +623,8 @@ public class NodeStoreKernel implements 
                 InputStream stream = blob.getNewStream();
                 try {
                     ByteStreams.skipFully(stream, pos);
-                    return stream.read(buff, off, length);
+                    int read = stream.read(buff, off, length);
+                    return read < 0 ? 0 : read;
                 } finally {
                     stream.close();
                 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java?rev=1607081&r1=1607080&r2=1607081&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java Tue Jul  1 13:57:26 2014
@@ -319,7 +319,8 @@ public class DocumentMK implements Micro
     public int read(String blobId, long pos, byte[] buff, int off, int length)
             throws MicroKernelException {
         try {
-            return nodeStore.getBlobStore().readBlob(blobId, pos, buff, off, length);
+            int read = nodeStore.getBlobStore().readBlob(blobId, pos, buff, off, length);
+            return read < 0 ? 0 : read;
         } catch (Exception e) {
             throw new MicroKernelException(e);
         }

Modified: jackrabbit/oak/trunk/oak-it/mk/src/main/java/org/apache/jackrabbit/mk/test/MicroKernelIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-it/mk/src/main/java/org/apache/jackrabbit/mk/test/MicroKernelIT.java?rev=1607081&r1=1607080&r2=1607081&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-it/mk/src/main/java/org/apache/jackrabbit/mk/test/MicroKernelIT.java (original)
+++ jackrabbit/oak/trunk/oak-it/mk/src/main/java/org/apache/jackrabbit/mk/test/MicroKernelIT.java Tue Jul  1 13:57:26 2014
@@ -1387,7 +1387,6 @@ public class MicroKernelIT extends Abstr
         }
     }
 
-    @Ignore("OAK-1931")  // FIXME OAK-1931
     @Test
     public void testReadReturnsNonNegative() {
         TestInputStream in = new TestInputStream(0);

Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/core/MicroKernelImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/core/MicroKernelImpl.java?rev=1607081&r1=1607080&r2=1607081&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/core/MicroKernelImpl.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/core/MicroKernelImpl.java Tue Jul  1 13:57:26 2014
@@ -630,7 +630,8 @@ public class MicroKernelImpl implements 
             throw new IllegalStateException("this instance has already been disposed");
         }
         try {
-            return rep.getBlobStore().readBlob(blobId, pos, buff, off, length);
+            int read = rep.getBlobStore().readBlob(blobId, pos, buff, off, length);
+            return read < 0 ? 0 : read;
         } catch (Exception e) {
             throw new MicroKernelException(e);
         }



Re: svn commit: r1607081 - in /jackrabbit/oak/trunk: oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/mk/ oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/mk/ oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/ oak-core/src/main/...

Posted by Jukka Zitting <ju...@gmail.com>.
Hi,

On Tue, Jul 1, 2014 at 5:02 PM, Jukka Zitting <ju...@gmail.com> wrote:
> On Tue, Jul 1, 2014 at 9:57 AM,  <st...@apache.org> wrote:
>> -            return rep.getBlobStore().readBlob(blobId, pos, buff, off, length);
>> +            int read = rep.getBlobStore().readBlob(blobId, pos, buff, off, length);
>> +            return read < 0 ? 0 : read;
>
> Shouldn't this (and all the other similar lines) be:
>
>     return read < 0 ? -1 : read;
>
> ? My build gets stuck in an infinite loop because the read() method returns 0.

Answering my own questions: it shouldn't, as described in the issue.

The stuck thread I saw was (same stack trace for many minutes):

"main" #1 prio=5 os_prio=0 tid=0x00000000024c8000 nid=0x4c90 runnable
[0x00000000030fd000]
   java.lang.Thread.State: RUNNABLE
        at org.apache.jackrabbit.oak.commons.IOUtils.skipFully(IOUtils.java:80)
        at org.apache.jackrabbit.oak.spi.blob.AbstractBlobStore.readBlob(AbstractBlobStore.java:431)
        at org.apache.jackrabbit.oak.plugins.document.DocumentMK.read(DocumentMK.java:322)
        at org.apache.jackrabbit.oak.commons.mk.MicroKernelInputStream.read(MicroKernelInputStream.java:56)
        at com.google.common.io.ByteStreams.read(ByteStreams.java:828)
        at com.google.common.io.ByteSource.contentEquals(ByteSource.java:304)
        at com.google.common.io.ByteStreams.equal(ByteStreams.java:661)
        at org.apache.jackrabbit.oak.plugins.memory.AbstractBlob.equal(AbstractBlob.java:58)
        at org.apache.jackrabbit.oak.plugins.memory.AbstractBlob.equals(AbstractBlob.java:153)
        at org.junit.Assert.isEquals(Assert.java:132)
        at org.junit.Assert.assertEquals(Assert.java:121)
        at org.junit.Assert.assertEquals(Assert.java:147)
        at org.apache.jackrabbit.oak.core.MutableTreeTest.testBlob(MutableTreeTest.java:474)

A subsequent build didn't reproduce this problem, so it might have
been some unrelated transient problem. I'll let you know if this
occurs again.

BR,

Jukka Zitting

Re: svn commit: r1607081 - in /jackrabbit/oak/trunk: oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/mk/ oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/mk/ oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/ oak-core/src/main/...

Posted by Jukka Zitting <ju...@gmail.com>.
Hi,

On Tue, Jul 1, 2014 at 9:57 AM,  <st...@apache.org> wrote:
> -            return rep.getBlobStore().readBlob(blobId, pos, buff, off, length);
> +            int read = rep.getBlobStore().readBlob(blobId, pos, buff, off, length);
> +            return read < 0 ? 0 : read;

Shouldn't this (and all the other similar lines) be:

    return read < 0 ? -1 : read;

? My build gets stuck in an infinite loop because the read() method returns 0.

BR,

Jukka Zitting