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 ju...@apache.org on 2012/07/22 10:42:14 UTC

svn commit: r1364232 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/OakDirectory.java

Author: jukka
Date: Sun Jul 22 08:42:13 2012
New Revision: 1364232

URL: http://svn.apache.org/viewvc?rev=1364232&view=rev
Log:
OAK-175: MemoryNodeStateBuilder inefficient for large child node lists

Use the new NodeStateBuilder methods to simplify also OakDirectory.

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/OakDirectory.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/OakDirectory.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/OakDirectory.java?rev=1364232&r1=1364231&r2=1364232&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/OakDirectory.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/lucene/OakDirectory.java Sun Jul 22 08:42:13 2012
@@ -19,16 +19,13 @@ package org.apache.jackrabbit.oak.plugin
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 
 import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.oak.api.CoreValue;
 import org.apache.jackrabbit.oak.api.CoreValueFactory;
 import org.apache.jackrabbit.oak.api.PropertyState;
-import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStateBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
@@ -38,6 +35,8 @@ import org.apache.lucene.store.IndexInpu
 import org.apache.lucene.store.IndexOutput;
 import org.apache.lucene.store.NoLockFactory;
 
+import com.google.common.collect.Iterables;
+
 class OakDirectory extends Directory {
 
     private final CoreValueFactory factory;
@@ -46,8 +45,6 @@ class OakDirectory extends Directory {
 
     private final NodeStateBuilder directoryBuilder;
 
-    private NodeState directory;
-
     public OakDirectory(NodeStore store, NodeState root, String... path) {
         this.lockFactory = NoLockFactory.getNoLockFactory();
         this.factory = store.getValueFactory();
@@ -58,7 +55,6 @@ class OakDirectory extends Directory {
             builder = builder.getChildBuilder(name);
         }
         this.directoryBuilder = builder;
-        this.directory = null;
     }
 
     @Nonnull
@@ -66,44 +62,30 @@ class OakDirectory extends Directory {
         return rootBuilder.getNodeState();
     }
 
-    @Nonnull
-    private NodeState getDirectory() {
-        if (directory == null) {
-            directory = directoryBuilder.getNodeState();
-        }
-        return directory;
-    }
-
     @Override
     public String[] listAll() throws IOException {
-        NodeState directory = getDirectory();
-        List<String> names =
-                new ArrayList<String>((int) directory.getChildNodeCount());
-        for (ChildNodeEntry entry : directory.getChildNodeEntries()) {
-            names.add(entry.getName());
-        }
-        return names.toArray(new String[names.size()]);
+        return Iterables.toArray(
+                directoryBuilder.getChildNodeNames(), String.class);
     }
 
     @Override
     public boolean fileExists(String name) throws IOException {
-        return getDirectory().getChildNode(name) != null;
+        return directoryBuilder.hasChildNode(name);
     }
 
     @Override
     public void deleteFile(String name) throws IOException {
         directoryBuilder.removeNode(name);
-        directory = null;
     }
 
     @Override
     public long fileLength(String name) throws IOException {
-        NodeState file = getDirectory().getChildNode(name);
-        if (file == null) {
+        if (!fileExists(name)) {
             return 0;
         }
 
-        PropertyState property = file.getProperty("jcr:data");
+        NodeStateBuilder fileBuilder = directoryBuilder.getChildBuilder(name);
+        PropertyState property = fileBuilder.getProperty("jcr:data");
         if (property == null || property.isArray()) {
             return 0;
         }
@@ -135,37 +117,35 @@ class OakDirectory extends Directory {
     }
 
     private byte[] readFile(String name) throws IOException {
-        CoreValue value = null;
-        NodeState file = getDirectory().getChildNode(name);
-        if (file != null) {
-            PropertyState property = file.getProperty("jcr:data");
-            if (property != null && !property.isArray()) {
-                value = property.getValue();
-            }
+        if (!fileExists(name)) {
+            return new byte[0];
         }
 
-        if (value != null) {
-            InputStream stream = value.getNewStream();
-            try {
-                byte[] buffer = new byte[(int) value.length()];
-
-                int size = 0;
-                do {
-                    int n = stream.read(buffer, size, buffer.length - size);
-                    if (n == -1) {
-                        throw new IOException(
-                                "Unexpected end of index file: " + name);
-                    }
-                    size += n;
-                } while (size < buffer.length);
-
-                return buffer;
-            } finally {
-                stream.close();
-            }
-        } else {
+        NodeStateBuilder fileBuilder = directoryBuilder.getChildBuilder(name);
+        PropertyState property = fileBuilder.getProperty("jcr:data");
+        if (property == null || property.isArray()) {
             return new byte[0];
         }
+
+        CoreValue value = property.getValue();
+        InputStream stream = value.getNewStream();
+        try {
+            byte[] buffer = new byte[(int) value.length()];
+
+            int size = 0;
+            do {
+                int n = stream.read(buffer, size, buffer.length - size);
+                if (n == -1) {
+                    throw new IOException(
+                            "Unexpected end of index file: " + name);
+                }
+                size += n;
+            } while (size < buffer.length);
+
+            return buffer;
+        } finally {
+            stream.close();
+        }
     }
 
     private final class OakIndexOutput extends IndexOutput {
@@ -240,8 +220,6 @@ class OakDirectory extends Directory {
             fileBuilder.setProperty(
                     "jcr:data",
                     factory.createValue(new ByteArrayInputStream(data)));
-
-            directory = null;
         }
 
         @Override