Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java (revision 1685621) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AsyncIndexUpdate.java (working copy) @@ -464,7 +464,16 @@ new ConflictHook(new AnnotatingConflictHandler()), new EditorHook(new ConflictValidatorProvider()), concurrentUpdateCheck); - store.merge(builder, hooks, CommitInfo.EMPTY); + try { + store.merge(builder, hooks, CommitInfo.EMPTY); + } catch (CommitFailedException ex) { + // OAK-2961 + if (ex.isOfType(CommitFailedException.STATE) && ex.getCode() == 1) { + throw CONCURRENT_UPDATE; + } else { + throw ex; + } + } } private static void preAsyncRunStatsStats(AsyncIndexStats stats) { Index: oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/AsyncConflictsIT.java =================================================================== --- oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/AsyncConflictsIT.java (revision 1685621) +++ oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/AsyncConflictsIT.java (working copy) @@ -70,7 +70,7 @@ assumeTrue(OakMongoNSRepositoryStub.isMongoDBAvailable()); } - @Test @Ignore("OAK-2961") + @Test public void updates() throws Exception { final Map exceptions = Collections.synchronizedMap(new HashMap()); final Random generator = new Random(3);