You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/12/06 12:38:15 UTC

svn commit: r1042589 - in /jackrabbit/branches/2.2: ./ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/ test/performance/base/src/main/java/org/apache/jackrabbit/performance/

Author: jukka
Date: Mon Dec  6 11:38:15 2010
New Revision: 1042589

URL: http://svn.apache.org/viewvc?rev=1042589&view=rev
Log:
2.2: Merged revisions 1040459 and 1040601 (JCR-2715 and JCR-2740)

Added:
    jackrabbit/branches/2.2/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/AutoFixCorruptNode.java
      - copied unchanged from r1040601, jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/AutoFixCorruptNode.java
    jackrabbit/branches/2.2/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/TestAll.java
      - copied unchanged from r1040601, jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/TestAll.java
    jackrabbit/branches/2.2/test/performance/base/src/main/java/org/apache/jackrabbit/performance/SQL2SearchTest.java
      - copied unchanged from r1040459, jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/SQL2SearchTest.java
Modified:
    jackrabbit/branches/2.2/   (props changed)
    jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java
    jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/LazyItemIterator.java
    jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
    jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
    jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/VersionManagerImpl.java
    jackrabbit/branches/2.2/test/performance/base/src/main/java/org/apache/jackrabbit/performance/AbstractPerformanceTest.java
    jackrabbit/branches/2.2/test/performance/base/src/main/java/org/apache/jackrabbit/performance/SimpleSearchTest.java

Propchange: jackrabbit/branches/2.2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Dec  6 11:38:15 2010
@@ -1 +1,5 @@
-/jackrabbit/trunk:1040661,1040958,1041761
+/jackrabbit/branches/1.5:794012,794100,794102
+/jackrabbit/sandbox/JCR-1456:774917-886178
+/jackrabbit/sandbox/JCR-2170:812417-816332
+/jackrabbit/sandbox/tripod-JCR-2209:795441-795863
+/jackrabbit/trunk:1038201,1038203,1038205,1038657,1039064,1039347,1039408,1039422-1039423,1039888,1039946,1040033,1040090,1040459,1040601,1040661,1040958,1041761

Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java?rev=1042589&r1=1042588&r2=1042589&view=diff
==============================================================================
--- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java (original)
+++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java Mon Dec  6 11:38:15 2010
@@ -713,7 +713,7 @@ public class ItemManager implements Item
             childIds.add(entry.getId());
         }
 
-        return new LazyItemIterator(this, childIds, parentId);
+        return new LazyItemIterator(sessionContext, childIds, parentId);
     }
 
     /**
@@ -774,7 +774,7 @@ public class ItemManager implements Item
             childIds.add(id);
         }
 
-        return new LazyItemIterator(this, childIds);
+        return new LazyItemIterator(sessionContext, childIds);
     }
 
     //-------------------------------------------------< item factory methods >

Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/LazyItemIterator.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/LazyItemIterator.java?rev=1042589&r1=1042588&r2=1042589&view=diff
==============================================================================
--- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/LazyItemIterator.java (original)
+++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/LazyItemIterator.java Mon Dec  6 11:38:15 2010
@@ -31,6 +31,8 @@ import javax.jcr.RepositoryException;
 
 import org.apache.jackrabbit.core.id.ItemId;
 import org.apache.jackrabbit.core.id.NodeId;
+import org.apache.jackrabbit.core.session.SessionContext;
+import org.apache.jackrabbit.core.state.ItemStateManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -53,6 +55,11 @@ public class LazyItemIterator implements
     /** Logger instance for this class */
     private static Logger log = LoggerFactory.getLogger(LazyItemIterator.class);
 
+    /**
+     * The session context used to access the repository.
+     */
+    private final SessionContext sessionContext;
+
     /** the item manager that is used to lazily fetch the items */
     private final ItemManager itemMgr;
 
@@ -71,11 +78,11 @@ public class LazyItemIterator implements
     /**
      * Creates a new <code>LazyItemIterator</code> instance.
      *
-     * @param itemMgr item manager
+     * @param sessionContext session context
      * @param idList  list of item id's
      */
-    public LazyItemIterator(ItemManager itemMgr, List< ? extends ItemId> idList) {
-        this(itemMgr, idList, null);
+    public LazyItemIterator(SessionContext sessionContext, List< ? extends ItemId> idList) {
+        this(sessionContext, idList, null);
     }
 
     /**
@@ -83,12 +90,13 @@ public class LazyItemIterator implements
      * a parent id as parameter. This version should be invoked to strictly return
      * children nodes of a node.
      *
-     * @param itemMgr item manager
+     * @param sessionContext session context
      * @param idList  list of item id's
      * @param parentId parent id.
      */
-    public LazyItemIterator(ItemManager itemMgr, List< ? extends ItemId> idList, NodeId parentId) {
-        this.itemMgr = itemMgr;
+    public LazyItemIterator(SessionContext sessionContext, List< ? extends ItemId> idList, NodeId parentId) {
+        this.sessionContext = sessionContext;
+        this.itemMgr = sessionContext.getSessionImpl().getItemManager();
         this.idList = new ArrayList<ItemId>(idList);
         this.parentId = parentId;
         // prefetch first item
@@ -117,6 +125,24 @@ public class LazyItemIterator implements
                 log.debug("ignoring nonexistent item " + id);
                 // remove invalid id
                 idList.remove(pos);
+
+                // maybe fix the root cause
+                if (parentId != null && sessionContext.getSessionImpl().autoFixCorruptions()) {
+                    try {
+                        // it might be an access right problem
+                        // we need to check if the item doesn't exist in the ism
+                        ItemStateManager ism = sessionContext.getItemStateManager();
+                        if (!ism.hasItemState(id)) {
+                            NodeImpl p = (NodeImpl) itemMgr.getItem(parentId);
+                            p.removeChildNode((NodeId) id);
+                            p.save();
+                        }
+                    } catch (RepositoryException e2) {
+                        log.error("could not fix repository inconsistency", e);
+                        // ignore
+                    }
+                }
+
                 // try next
             } catch (AccessDeniedException e) {
                 log.debug("ignoring nonexistent item " + id);

Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java?rev=1042589&r1=1042588&r2=1042589&view=diff
==============================================================================
--- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java (original)
+++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java Mon Dec  6 11:38:15 2010
@@ -98,6 +98,7 @@ import org.apache.jackrabbit.core.sessio
 import org.apache.jackrabbit.core.state.ChildNodeEntry;
 import org.apache.jackrabbit.core.state.ItemState;
 import org.apache.jackrabbit.core.state.ItemStateException;
+import org.apache.jackrabbit.core.state.ItemStateManager;
 import org.apache.jackrabbit.core.state.NodeReferences;
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.PropertyState;
@@ -555,7 +556,7 @@ public class NodeImpl extends ItemImpl i
      * @param id
      * @param newName
      * @throws RepositoryException
-     * @deprecated use #renameChildNode(NodeId, Name, boolean) 
+     * @deprecated use #renameChildNode(NodeId, Name, boolean)
      */
     protected void renameChildNode(Name oldName, int index, NodeId id,
                                    Name newName)
@@ -613,8 +614,24 @@ public class NodeImpl extends ItemImpl i
         }
 
         // notify target of removal
-        NodeImpl childNode = itemMgr.getNode(childId, getNodeId());
-        childNode.onRemove(getNodeId());
+        try {
+            NodeImpl childNode = itemMgr.getNode(childId, getNodeId());
+            childNode.onRemove(getNodeId());
+        } catch (ItemNotFoundException e) {
+            boolean ignoreError = false;
+            if (sessionContext.getSessionImpl().autoFixCorruptions()) {
+                // it might be an access right problem
+                // we need to check if the item doesn't exist in the ism
+                ItemStateManager ism = sessionContext.getItemStateManager();
+                if (!ism.hasItemState(childId)) {
+                    log.warn("Node " + childId + " not found, ignore", e);
+                    ignoreError = true;
+                }
+            }
+            if (!ignoreError) {
+                throw e;
+            }
+        }
 
         // remove the child node entry
         if (!thisState.removeChildNodeEntry(childId)) {
@@ -663,9 +680,28 @@ public class NodeImpl extends ItemImpl i
                 // recursively remove child node
                 NodeId childId = entry.getId();
                 //NodeImpl childNode = (NodeImpl) itemMgr.getItem(childId);
-                NodeImpl childNode = itemMgr.getNode(childId, getNodeId());
-                childNode.onRemove(thisState.getNodeId());
-                // remove the child node entry
+                try {
+                    NodeImpl childNode = itemMgr.getNode(childId, getNodeId());
+                    childNode.onRemove(thisState.getNodeId());
+                    // remove the child node entry
+                } catch (ItemNotFoundException e) {
+                    boolean ignoreError = false;
+                    if (parentId != null && sessionContext.getSessionImpl().autoFixCorruptions()) {
+                        // it might be an access right problem
+                        // we need to check if the item doesn't exist in the ism
+                        ItemStateManager ism = sessionContext.getItemStateManager();
+                        if (!ism.hasItemState(childId)) {
+                            log.warn("Child named " + entry.getName() + " (index " + entry.getIndex() + ", " +
+                                    "node id " + childId + ") " +
+                                    "not found when trying to remove " + getPath() + " " +
+                                    "(node id " + getNodeId() + ") - ignored", e);
+                            ignoreError = true;
+                        }
+                    }
+                    if (!ignoreError) {
+                        throw e;
+                    }
+                }
                 thisState.removeChildNodeEntry(childId);
             }
         }
@@ -1418,7 +1454,7 @@ public class NodeImpl extends ItemImpl i
             log.debug(msg);
             throw new AccessDeniedException(msg);
         }
-        
+
         ArrayList<ChildNodeEntry> list = new ArrayList<ChildNodeEntry>(data.getNodeState().getChildNodeEntries());
         int srcInd = -1, destInd = -1;
         for (int i = 0; i < list.size(); i++) {
@@ -3022,7 +3058,7 @@ public class NodeImpl extends ItemImpl i
                     }
                     idList = filteredList;
                 }
-                return new LazyItemIterator(itemMgr, idList);
+                return new LazyItemIterator(sessionContext, idList);
             } else {
                 // there are no references, return empty iterator
                 return PropertyIteratorAdapter.EMPTY;

Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java?rev=1042589&r1=1042588&r2=1042589&view=diff
==============================================================================
--- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java (original)
+++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java Mon Dec  6 11:38:15 2010
@@ -122,6 +122,17 @@ public class SessionImpl extends Abstrac
     public static final String DISABLE_CLUSTER_SYNC_ON_REFRESH =
         "org.apache.jackrabbit.disableClusterSyncOnRefresh";
 
+    /**
+     * Name of the session attribute that controls whether repository
+     * inconsistencies should be automatically fixed when traversing over child
+     * nodes, when trying to add a child node, or removing a child node.
+     *
+     * @since Apache Jackrabbit 2.2
+     * @see <a href="https://issues.apache.org/jira/browse/JCR-2740">JCR-2740</a>
+     */
+    public static final String AUTO_FIX_CORRUPTIONS =
+        "org.apache.jackrabbit.autoFixCorruptions";
+
     private static Logger log = LoggerFactory.getLogger(SessionImpl.class);
 
     /**
@@ -772,6 +783,20 @@ public class SessionImpl extends Abstrac
     }
 
     /**
+     * Checks whether repository inconsistencies should be automatically fixed
+     * when traversing over child nodes, when trying to add a child node, or
+     * when removing a child node.
+     *
+     * @return <code>true</code> if the {@link #AUTO_FIX_CORRUPTIONS}
+     *         attribute is set, <code>false</code> otherwise
+     * @since Apache Jackrabbit 2.2
+     * @see <a href="https://issues.apache.org/jira/browse/JCR-2740">JCR-2740</a>
+     */
+    protected boolean autoFixCorruptions() {
+        return getAttribute(AUTO_FIX_CORRUPTIONS) != null;
+    }
+
+    /**
      * {@inheritDoc}
      */
     public boolean hasPendingChanges() throws RepositoryException {

Modified: jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/VersionManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/VersionManagerImpl.java?rev=1042589&r1=1042588&r2=1042589&view=diff
==============================================================================
--- jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/VersionManagerImpl.java (original)
+++ jackrabbit/branches/2.2/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/VersionManagerImpl.java Mon Dec  6 11:38:15 2010
@@ -413,7 +413,7 @@ public class VersionManagerImpl extends 
                         Permission.VERSION_MNGMT);
                 List<ItemId> failedIds = new LinkedList<ItemId>();
                 mergeOrUpdate(state, srcWorkspaceName, failedIds, bestEffort, isShallow);
-                return new LazyItemIterator(session.getItemManager(), failedIds);
+                return new LazyItemIterator(context, failedIds);
             }
             public String toString() {
                 return "versionManager.merge("
@@ -592,7 +592,7 @@ public class VersionManagerImpl extends 
         }
         List<ItemId> failedIds = new ArrayList<ItemId>();
         merge(activity, failedIds);
-        return new LazyItemIterator(session.getItemManager(), failedIds);
+        return new LazyItemIterator(context, failedIds);
     }
 
     /**
@@ -642,4 +642,4 @@ public class VersionManagerImpl extends 
         }
     }
 
-}
\ No newline at end of file
+}

Modified: jackrabbit/branches/2.2/test/performance/base/src/main/java/org/apache/jackrabbit/performance/AbstractPerformanceTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/test/performance/base/src/main/java/org/apache/jackrabbit/performance/AbstractPerformanceTest.java?rev=1042589&r1=1042588&r2=1042589&view=diff
==============================================================================
--- jackrabbit/branches/2.2/test/performance/base/src/main/java/org/apache/jackrabbit/performance/AbstractPerformanceTest.java (original)
+++ jackrabbit/branches/2.2/test/performance/base/src/main/java/org/apache/jackrabbit/performance/AbstractPerformanceTest.java Mon Dec  6 11:38:15 2010
@@ -100,6 +100,7 @@ public abstract class AbstractPerformanc
         runTest(new ConcurrentReadTest(), name, conf);
         runTest(new ConcurrentReadWriteTest(), name, conf);
         runTest(new SimpleSearchTest(), name, conf);
+        runTest(new SQL2SearchTest(), name, conf);
         runTest(new TwoWayJoinTest(), name, conf);
         runTest(new ThreeWayJoinTest(), name, conf);
         runTest(new CreateManyChildNodesTest(), name, conf);

Modified: jackrabbit/branches/2.2/test/performance/base/src/main/java/org/apache/jackrabbit/performance/SimpleSearchTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.2/test/performance/base/src/main/java/org/apache/jackrabbit/performance/SimpleSearchTest.java?rev=1042589&r1=1042588&r2=1042589&view=diff
==============================================================================
--- jackrabbit/branches/2.2/test/performance/base/src/main/java/org/apache/jackrabbit/performance/SimpleSearchTest.java (original)
+++ jackrabbit/branches/2.2/test/performance/base/src/main/java/org/apache/jackrabbit/performance/SimpleSearchTest.java Mon Dec  6 11:38:15 2010
@@ -31,6 +31,11 @@ public class SimpleSearchTest extends Ab
 
     private Node root;
 
+    protected Query createQuery(QueryManager manager, int i)
+            throws RepositoryException {
+        return manager.createQuery("//*[@testcount=" + i + "]", Query.XPATH);
+    }
+
     public void beforeSuite() throws RepositoryException {
         session = getRepository().login(getCredentials());
 
@@ -48,8 +53,7 @@ public class SimpleSearchTest extends Ab
     public void runTest() throws Exception {
         QueryManager manager = session.getWorkspace().getQueryManager();
         for (int i = 0; i < NODE_COUNT; i++) {
-            Query query =
-                manager.createQuery("//*[@testcount=" + i + "]", Query.XPATH);
+            Query query = createQuery(manager, i);
             NodeIterator iterator = query.execute().getNodes();
             while (iterator.hasNext()) {
                 Node node = iterator.nextNode();