You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2006/09/01 12:20:09 UTC

svn commit: r439262 - /jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/query/lucene/ConsistencyCheck.java

Author: mreutegg
Date: Fri Sep  1 03:20:07 2006
New Revision: 439262

URL: http://svn.apache.org/viewvc?rev=439262&view=rev
Log:
JCR-555: ConsistencyCheck uses too much memory

Modified:
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/query/lucene/ConsistencyCheck.java

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/query/lucene/ConsistencyCheck.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/query/lucene/ConsistencyCheck.java?rev=439262&r1=439261&r2=439262&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/query/lucene/ConsistencyCheck.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/query/lucene/ConsistencyCheck.java Fri Sep  1 03:20:07 2006
@@ -28,8 +28,6 @@
 
 import javax.jcr.RepositoryException;
 import java.io.IOException;
-import java.util.Map;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.ArrayList;
@@ -66,9 +64,9 @@
     private final MultiIndex index;
 
     /**
-     * All the documents within the index.
+     * All the document UUIDs within the index.
      */
-    private Map documents;
+    private Set documentUUIDs;
 
     /**
      * List of all errors.
@@ -152,19 +150,22 @@
     private void run() throws IOException {
         // UUIDs of multiple nodes in the index
         Set multipleEntries = new HashSet();
-        // collect all documents
-        documents = new HashMap();
+        // collect all documents UUIDs
+        documentUUIDs = new HashSet();
         IndexReader reader = index.getIndexReader();
         try {
             for (int i = 0; i < reader.maxDoc(); i++) {
+                if (i > 0 && i % (reader.maxDoc() / 5) == 0) {
+                    long progress = Math.round((100.0 * (float) i) / ((float) reader.maxDoc() * 2f));
+                    log.info("progress: " + progress + "%");
+                }
                 if (reader.isDeleted(i)) {
                     continue;
                 }
                 Document d = reader.document(i);
                 UUID uuid = UUID.fromString(d.get(FieldNames.UUID));
                 if (stateMgr.hasItemState(new NodeId(uuid))) {
-                    Document old = (Document) documents.put(uuid, d);
-                    if (old != null) {
+                    if (!documentUUIDs.add(uuid)) {
                         multipleEntries.add(uuid);
                     }
                 } else {
@@ -180,25 +181,37 @@
             errors.add(new MultipleEntries((UUID) it.next()));
         }
 
-        // run through documents
-        for (Iterator it = documents.values().iterator(); it.hasNext();) {
-            Document d = (Document) it.next();
-            UUID uuid = UUID.fromString(d.get(FieldNames.UUID));
-            String parentUUIDString = d.get(FieldNames.PARENT);
-            UUID parentUUID = null;
-            if (parentUUIDString.length() > 0) {
-                parentUUID = UUID.fromString(parentUUIDString);
-            }
-            if (parentUUID == null || documents.containsKey(parentUUID)) {
-                continue;
-            }
-            // parent is missing
-            NodeId parentId = new NodeId(parentUUID);
-            if (stateMgr.hasItemState(parentId)) {
-                errors.add(new MissingAncestor(uuid, parentUUID));
-            } else {
-                errors.add(new UnknownParent(uuid, parentUUID));
+        reader = index.getIndexReader();
+        try {
+            // run through documents again and check parent
+            for (int i = 0; i < reader.maxDoc(); i++) {
+                if (i > 0 && i % (reader.maxDoc() / 5) == 0) {
+                    long progress = Math.round((100.0 * (float) i) / ((float) reader.maxDoc() * 2f));
+                    log.info("progress: " + (progress + 50) + "%");
+                }
+                if (reader.isDeleted(i)) {
+                    continue;
+                }
+                Document d = reader.document(i);
+                UUID uuid = UUID.fromString(d.get(FieldNames.UUID));
+                String parentUUIDString = d.get(FieldNames.PARENT);
+                UUID parentUUID = null;
+                if (parentUUIDString.length() > 0) {
+                    parentUUID = UUID.fromString(parentUUIDString);
+                }
+                if (parentUUID == null || documentUUIDs.contains(parentUUID)) {
+                    continue;
+                }
+                // parent is missing
+                NodeId parentId = new NodeId(parentUUID);
+                if (stateMgr.hasItemState(parentId)) {
+                    errors.add(new MissingAncestor(uuid, parentUUID));
+                } else {
+                    errors.add(new UnknownParent(uuid, parentUUID));
+                }
             }
+        } finally {
+            reader.close();
         }
     }
 
@@ -266,13 +279,13 @@
          */
         public void repair() throws IOException {
             NodeId parentId = new NodeId(parentUUID);
-            while (parentId != null && !documents.containsKey(parentId.getUUID())) {
+            while (parentId != null && !documentUUIDs.contains(parentId.getUUID())) {
                 try {
                     NodeState n = (NodeState) stateMgr.getItemState(parentId);
                     log.info("Reparing missing node " + getPath(n));
                     Document d = index.createDocument(n);
                     index.addDocument(d);
-                    documents.put(n.getNodeId().getUUID(), d);
+                    documentUUIDs.add(n.getNodeId().getUUID());
                     parentId = n.getParentId();
                 } catch (ItemStateException e) {
                     throw new IOException(e.toString());
@@ -339,7 +352,7 @@
                 log.info("Re-indexing duplicate node occurrences in index: " + getPath(node));
                 Document d = index.createDocument(node);
                 index.addDocument(d);
-                documents.put(node.getNodeId().getUUID(), d);
+                documentUUIDs.add(node.getNodeId().getUUID());
             } catch (ItemStateException e) {
                 throw new IOException(e.toString());
             } catch (RepositoryException e) {