Index: jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentImportTest.java =================================================================== --- jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentImportTest.java (revision 813472) +++ jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentImportTest.java (working copy) @@ -112,6 +112,10 @@ log.println("Error: " + e); log.flush(); throw e; + } catch (Exception e) { + log.println("Unexpected error: " + e); + log.flush(); + throw new RepositoryException(e); } } }, CONCURRENCY, "/" + testPath); Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java (revision 813472) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java (working copy) @@ -998,7 +998,6 @@ itemDestroyed(destroyed.getId(), data); data.setStatus(ItemImpl.STATUS_DESTROYED); - data.setState(null); } } Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java (revision 813472) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java (working copy) @@ -407,10 +407,20 @@ try { local = changeLog.get(created.getId()); if (local != null) { - // underlying state has been permanently created - local.pull(); - local.setStatus(ItemState.STATUS_EXISTING); - cache.cache(local); + if (local.isNode() && local.getOverlayedState() != created) { + // mid-air collision of concurrent node state creation + // with same id (JCR-2272) + if (local.getStatus() == ItemState.STATUS_NEW) { + local.setStatus(ItemState.STATUS_STALE_MODIFIED); + } + } else { + if (local.getOverlayedState() == created) { + // underlying state has been permanently created + local.pull(); + local.setStatus(ItemState.STATUS_EXISTING); + cache.cache(local); + } + } } } catch (NoSuchItemStateException e) { /* ignore */ Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (revision 813472) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (working copy) @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.List; import java.util.Set; +import java.util.Calendar; import javax.jcr.PropertyType; import javax.jcr.ReferentialIntegrityException; @@ -48,6 +49,7 @@ import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.commons.name.NameConstants; +import org.apache.jackrabbit.JcrConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -632,7 +634,7 @@ return false; } NodeDef def = ntReg.getNodeDef(ns.getDefinitionId()); - return def != null ? def.allowsSameNameSiblings() : false; + return def != null && def.allowsSameNameSiblings(); } }; @@ -661,6 +663,14 @@ shared.deleted(state.getOverlayedState()); } for (ItemState state : local.addedStates()) { + if (state.isNode() && state.getStatus() != ItemState.STATUS_NEW) { + // another node with same id had been created + // in the meantime, probably caused by mid-air collision + // of concurrent versioning operations (JCR-2272) + String msg = state.getId() + " has been created externally"; + log.debug(msg); + throw new StaleItemStateException(msg); + } state.connect(createInstance(state)); shared.added(state.getOverlayedState()); }