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();