diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdate.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdate.java
index 75fa171bb9..f7a5b7c7c4 100644
--- a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdate.java
+++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdate.java
@@ -274,7 +274,14 @@ public class IndexUpdate implements Editor, PathSource {
                 Editor editor = rootState.provider.getIndexEditor(type, definition, rootState.root,
                         rootState.newCallback(indexPath, shouldReindex, getEstimatedCount(definition)));
                 if (editor == null) {
-                    rootState.missingProvider.onMissingIndex(type, definition, indexPath);
+                    // if this isn't an async cycle AND definition has "async" property
+                    // (and implicitly isIncluded method allows async def in non-async cycle only for nrt/sync defs)
+                    // then we don't need to handle missing handler
+                    if (definition.hasProperty(ASYNC_PROPERTY_NAME) && rootState.async == null) {
+                        log.debug("Ignoring missing provider for {}. rootState.async: ", definition, rootState.async);
+                    } else {
+                        rootState.missingProvider.onMissingIndex(type, definition, indexPath);
+                    }
                 } else if (shouldReindex) {
                     if (definition.getBoolean(REINDEX_ASYNC_PROPERTY_NAME)
                             && definition.getString(ASYNC_PROPERTY_NAME) == null) {
diff --git a/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateTest.java b/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateTest.java
index fb4f237d1e..21b5c2f50e 100644
--- a/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateTest.java
+++ b/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateTest.java
@@ -29,6 +29,7 @@ import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.REINDEX_COU
 import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.REINDEX_PROPERTY_NAME;
 import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.TYPE_DISABLED;
 import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.TYPE_PROPERTY_NAME;
+import static org.apache.jackrabbit.oak.plugins.index.IndexUpdateCallback.NOOP;
 import static org.apache.jackrabbit.oak.plugins.index.IndexUtils.createIndexDefinition;
 import static org.apache.jackrabbit.oak.InitialContentHelper.INITIAL_CONTENT;
 import static org.hamcrest.CoreMatchers.instanceOf;
@@ -47,6 +48,7 @@ import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import ch.qos.logback.classic.Level;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.PropertyState;
@@ -502,7 +504,7 @@ public class IndexUpdateTest {
         EditorHook hook = new EditorHook(new EditorProvider() {
             @Override
             public Editor getRootEditor(NodeState before, NodeState after,
-                    NodeBuilder builder, CommitInfo info)
+                                        NodeBuilder builder, CommitInfo info)
                     throws CommitFailedException {
                 return new IndexUpdate(emptyProvider(), null, after, builder,
                         noop).withMissingProviderStrategy(mips);
@@ -525,6 +527,62 @@ public class IndexUpdateTest {
         }
     }
 
+    /**
+     * OAK-7686: async def with nrt/sync def should fail on missing provider only when running in
+     * context of an async cycle
+     */
+    @Test
+    public void testMissingProviderWithAsyncDef() throws Exception {
+        final MissingIndexProviderStrategy mips = new MissingIndexProviderStrategy();
+        mips.setFailOnMissingIndexProvider(true);
+
+        // prepare different hooks for different types indexing cycles
+        EditorHook syncHook = new EditorHook((before, after, builder, info) ->
+                new IndexUpdate(emptyProvider(), null, after, builder, NOOP)
+                        .withMissingProviderStrategy(mips));
+        EditorHook asyncHook = new EditorHook((before, after, builder, info) ->
+                new IndexUpdate(emptyProvider(), "async-run", after, builder, NOOP)
+                        .withMissingProviderStrategy(mips));
+        EditorHook otherAsyncHook = new EditorHook((before, after, builder, info) ->
+                new IndexUpdate(emptyProvider(), "other-async-run", after, builder, NOOP)
+                        .withMissingProviderStrategy(mips));
+
+        builder = EmptyNodeState.EMPTY_NODE.builder();
+
+        // create async defs with nrt and sync mixed in
+        createIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME),
+                "asyncIndex", true, false, ImmutableSet.of("foo"), null)
+                .setProperty(ASYNC_PROPERTY_NAME, ImmutableList.of("async-run"), Type.STRINGS)
+                .setProperty(REINDEX_PROPERTY_NAME, false);
+        createIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME),
+                "nrtIndex", true, false, ImmutableSet.of("foo"), null)
+                .setProperty(ASYNC_PROPERTY_NAME, ImmutableList.of("async-run", "nrt"), Type.STRINGS)
+                .setProperty(REINDEX_PROPERTY_NAME, false);
+        createIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME),
+                "asyncSyncIndex", true, false, ImmutableSet.of("foo"), null)
+                .setProperty(ASYNC_PROPERTY_NAME, ImmutableList.of("async-run", "sync"), Type.STRINGS)
+                .setProperty(REINDEX_PROPERTY_NAME, false);
+
+        // node states to run hook on
+        NodeState before = builder.getNodeState();
+        builder.child("testRoot").setProperty("foo", "abc");
+        NodeState after = builder.getNodeState();
+
+        // sync run should be ok with missing provider for an async def
+        syncHook.processCommit(before, after, CommitInfo.EMPTY);
+
+        // unrelated async run should be ok with missing provider
+        otherAsyncHook.processCommit(before, after, CommitInfo.EMPTY);
+
+        // async run matching the def async lane still should fail
+        try {
+            asyncHook.processCommit(before, after, CommitInfo.EMPTY);
+            fail("commit should fail on missing index provider");
+        } catch (CommitFailedException ex) {
+            // expected
+        }
+    }
+
     @Test
     public void testReindexCount() throws Exception{
         builder.child("testRoot").setProperty("foo", "abc");
