void (@NotNull ID<?, ?> indexId, Throwable throwable) { cleanupProcessedFlag("Rebuild requested for index " + indexId); if (!myRegisteredIndexes.isExtensionsDataLoaded()) reportUnexpectedAsyncInitState(); if (RebuildStatus.requestRebuild(indexId)) { String message = "Rebuild requested for index " + indexId; Application app = ApplicationManager.getApplication(); if (myIsUnitTestMode && app.isReadAccessAllowed() && !app.isDispatchThread()) { // Shouldn't happen in tests in general; so fail early with the exception that caused the index to be rebuilt. // Otherwise, reindexing will fail anyway later, but with a much more cryptic assertion LOG.error(message, throwable); } else { LOG.info(message, throwable); } cleanupProcessedFlag(message); if (!myRegisteredIndexes.isInitialized()) return; advanceIndexVersion(indexId); Runnable rebuildRunnable = () -> scheduleIndexRescanningForAllProjects(message); // we do invoke later since we can have read lock acquired AppUIExecutor.onWriteThread().later().expireWith(app).submit(rebuildRunnable); } }