Search in sources :

Example 1 with IndexEventListener

use of org.opensearch.index.shard.IndexEventListener in project OpenSearch by opensearch-project.

the class IndicesLifecycleListenerSingleNodeTests method testStartDeleteIndexEventCallback.

public void testStartDeleteIndexEventCallback() throws Throwable {
    IndicesService indicesService = getInstanceFromNode(IndicesService.class);
    assertAcked(client().admin().indices().prepareCreate("test").setSettings(Settings.builder().put(SETTING_NUMBER_OF_SHARDS, 1).put(SETTING_NUMBER_OF_REPLICAS, 0)));
    ensureGreen();
    Index idx = resolveIndex("test");
    IndexMetadata metadata = indicesService.indexService(idx).getMetadata();
    ShardRouting shardRouting = indicesService.indexService(idx).getShard(0).routingEntry();
    final AtomicInteger counter = new AtomicInteger(1);
    IndexEventListener countingListener = new IndexEventListener() {

        @Override
        public void beforeIndexCreated(Index index, Settings indexSettings) {
            assertEquals("test", index.getName());
            assertEquals(1, counter.get());
            counter.incrementAndGet();
        }

        @Override
        public void afterIndexCreated(IndexService indexService) {
            assertEquals("test", indexService.index().getName());
            assertEquals(2, counter.get());
            counter.incrementAndGet();
        }

        @Override
        public void beforeIndexShardCreated(ShardId shardId, Settings indexSettings) {
            assertEquals(3, counter.get());
            counter.incrementAndGet();
        }

        @Override
        public void afterIndexShardCreated(IndexShard indexShard) {
            assertEquals(4, counter.get());
            counter.incrementAndGet();
        }

        @Override
        public void afterIndexShardStarted(IndexShard indexShard) {
            assertEquals(5, counter.get());
            counter.incrementAndGet();
        }

        @Override
        public void beforeIndexRemoved(IndexService indexService, IndexRemovalReason reason) {
            assertEquals(DELETED, reason);
            assertEquals(6, counter.get());
            counter.incrementAndGet();
        }

        @Override
        public void beforeIndexShardDeleted(ShardId shardId, Settings indexSettings) {
            assertEquals(7, counter.get());
            counter.incrementAndGet();
        }

        @Override
        public void afterIndexShardDeleted(ShardId shardId, Settings indexSettings) {
            assertEquals(8, counter.get());
            counter.incrementAndGet();
        }

        @Override
        public void afterIndexRemoved(Index index, IndexSettings indexSettings, IndexRemovalReason reason) {
            assertEquals(DELETED, reason);
            assertEquals(9, counter.get());
            counter.incrementAndGet();
        }
    };
    indicesService.removeIndex(idx, DELETED, "simon says");
    try {
        IndexService index = indicesService.createIndex(metadata, Arrays.asList(countingListener), false);
        assertEquals(3, counter.get());
        idx = index.index();
        ShardRouting newRouting = shardRouting;
        String nodeId = newRouting.currentNodeId();
        UnassignedInfo unassignedInfo = new UnassignedInfo(UnassignedInfo.Reason.INDEX_CREATED, "boom");
        newRouting = newRouting.moveToUnassigned(unassignedInfo).updateUnassigned(unassignedInfo, RecoverySource.EmptyStoreRecoverySource.INSTANCE);
        newRouting = ShardRoutingHelper.initialize(newRouting, nodeId);
        IndexShard shard = index.createShard(newRouting, s -> {
        }, RetentionLeaseSyncer.EMPTY);
        IndexShardTestCase.updateRoutingEntry(shard, newRouting);
        assertEquals(5, counter.get());
        final DiscoveryNode localNode = new DiscoveryNode("foo", buildNewFakeTransportAddress(), emptyMap(), emptySet(), Version.CURRENT);
        shard.markAsRecovering("store", new RecoveryState(newRouting, localNode, null));
        IndexShardTestCase.recoverFromStore(shard);
        newRouting = ShardRoutingHelper.moveToStarted(newRouting);
        IndexShardTestCase.updateRoutingEntry(shard, newRouting);
        assertEquals(6, counter.get());
    } finally {
        indicesService.removeIndex(idx, DELETED, "simon says");
    }
    assertEquals(10, counter.get());
}
Also used : DiscoveryNode(org.opensearch.cluster.node.DiscoveryNode) IndexService(org.opensearch.index.IndexService) UnassignedInfo(org.opensearch.cluster.routing.UnassignedInfo) IndexShard(org.opensearch.index.shard.IndexShard) IndexSettings(org.opensearch.index.IndexSettings) Index(org.opensearch.index.Index) ShardId(org.opensearch.index.shard.ShardId) IndexEventListener(org.opensearch.index.shard.IndexEventListener) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) IndexRemovalReason(org.opensearch.indices.cluster.IndicesClusterStateService.AllocatedIndices.IndexRemovalReason) IndexMetadata(org.opensearch.cluster.metadata.IndexMetadata) ShardRouting(org.opensearch.cluster.routing.ShardRouting) RecoveryState(org.opensearch.indices.recovery.RecoveryState) Settings(org.opensearch.common.settings.Settings) IndexSettings(org.opensearch.index.IndexSettings)

Example 2 with IndexEventListener

use of org.opensearch.index.shard.IndexEventListener in project OpenSearch by opensearch-project.

the class IndicesService method createIndex.

/**
 * Creates a new {@link IndexService} for the given metadata.
 *
 * @param indexMetadata          the index metadata to create the index for
 * @param builtInListeners       a list of built-in lifecycle {@link IndexEventListener} that should should be used along side with the
 *                               per-index listeners
 * @throws ResourceAlreadyExistsException if the index already exists.
 */
@Override
public synchronized IndexService createIndex(final IndexMetadata indexMetadata, final List<IndexEventListener> builtInListeners, final boolean writeDanglingIndices) throws IOException {
    ensureChangesAllowed();
    if (indexMetadata.getIndexUUID().equals(IndexMetadata.INDEX_UUID_NA_VALUE)) {
        throw new IllegalArgumentException("index must have a real UUID found value: [" + indexMetadata.getIndexUUID() + "]");
    }
    final Index index = indexMetadata.getIndex();
    if (hasIndex(index)) {
        throw new ResourceAlreadyExistsException(index);
    }
    List<IndexEventListener> finalListeners = new ArrayList<>(builtInListeners);
    final IndexEventListener onStoreClose = new IndexEventListener() {

        @Override
        public void onStoreCreated(ShardId shardId) {
            indicesRefCount.incRef();
        }

        @Override
        public void onStoreClosed(ShardId shardId) {
            try {
                indicesQueryCache.onClose(shardId);
            } finally {
                indicesRefCount.decRef();
            }
        }
    };
    finalListeners.add(onStoreClose);
    finalListeners.add(oldShardsStats);
    final IndexService indexService = createIndexService(CREATE_INDEX, indexMetadata, indicesQueryCache, indicesFieldDataCache, finalListeners, indexingMemoryController);
    boolean success = false;
    try {
        if (writeDanglingIndices && nodeWriteDanglingIndicesInfo) {
            indexService.addMetadataListener(imd -> updateDanglingIndicesInfo(index));
        }
        indexService.getIndexEventListener().afterIndexCreated(indexService);
        indices = newMapBuilder(indices).put(index.getUUID(), indexService).immutableMap();
        if (writeDanglingIndices) {
            if (nodeWriteDanglingIndicesInfo) {
                updateDanglingIndicesInfo(index);
            } else {
                indexService.deleteDanglingIndicesInfo();
            }
        }
        success = true;
        return indexService;
    } finally {
        if (success == false) {
            indexService.close("plugins_failed", true);
        }
    }
}
Also used : ShardId(org.opensearch.index.shard.ShardId) IndexEventListener(org.opensearch.index.shard.IndexEventListener) IndexService(org.opensearch.index.IndexService) ArrayList(java.util.ArrayList) CollectionUtils.arrayAsArrayList(org.opensearch.common.util.CollectionUtils.arrayAsArrayList) ResourceAlreadyExistsException(org.opensearch.ResourceAlreadyExistsException) Index(org.opensearch.index.Index)

Example 3 with IndexEventListener

use of org.opensearch.index.shard.IndexEventListener in project OpenSearch by opensearch-project.

the class IndicesService method createIndexService.

/**
 * This creates a new IndexService without registering it
 */
private synchronized IndexService createIndexService(IndexService.IndexCreationContext indexCreationContext, IndexMetadata indexMetadata, IndicesQueryCache indicesQueryCache, IndicesFieldDataCache indicesFieldDataCache, List<IndexEventListener> builtInListeners, IndexingOperationListener... indexingOperationListeners) throws IOException {
    final IndexSettings idxSettings = new IndexSettings(indexMetadata, settings, indexScopedSettings);
    if (idxSettings.getIndexVersionCreated().onOrAfter(LegacyESVersion.V_7_0_0) && EngineConfig.INDEX_OPTIMIZE_AUTO_GENERATED_IDS.exists(idxSettings.getSettings())) {
        throw new IllegalArgumentException("Setting [" + EngineConfig.INDEX_OPTIMIZE_AUTO_GENERATED_IDS.getKey() + "] was removed in version 7.0.0");
    }
    // we ignore private settings since they are not registered settings
    indexScopedSettings.validate(indexMetadata.getSettings(), true, true, true);
    logger.debug("creating Index [{}], shards [{}]/[{}] - reason [{}]", indexMetadata.getIndex(), idxSettings.getNumberOfShards(), idxSettings.getNumberOfReplicas(), indexCreationContext);
    final IndexModule indexModule = new IndexModule(idxSettings, analysisRegistry, getEngineFactory(idxSettings), getEngineConfigFactory(idxSettings), directoryFactories, () -> allowExpensiveQueries, indexNameExpressionResolver, recoveryStateFactories);
    for (IndexingOperationListener operationListener : indexingOperationListeners) {
        indexModule.addIndexOperationListener(operationListener);
    }
    pluginsService.onIndexModule(indexModule);
    for (IndexEventListener listener : builtInListeners) {
        indexModule.addIndexEventListener(listener);
    }
    return indexModule.newIndexService(indexCreationContext, nodeEnv, xContentRegistry, this, circuitBreakerService, bigArrays, threadPool, scriptService, clusterService, client, indicesQueryCache, mapperRegistry, indicesFieldDataCache, namedWriteableRegistry, this::isIdFieldDataEnabled, valuesSourceRegistry);
}
Also used : IndexingOperationListener(org.opensearch.index.shard.IndexingOperationListener) IndexEventListener(org.opensearch.index.shard.IndexEventListener) IndexSettings(org.opensearch.index.IndexSettings) IndexModule(org.opensearch.index.IndexModule)

Example 4 with IndexEventListener

use of org.opensearch.index.shard.IndexEventListener in project OpenSearch by opensearch-project.

the class IndicesService method withTempIndexService.

public <T, E extends Exception> T withTempIndexService(final IndexMetadata indexMetadata, CheckedFunction<IndexService, T, E> indexServiceConsumer) throws IOException, E {
    final Index index = indexMetadata.getIndex();
    if (hasIndex(index)) {
        throw new ResourceAlreadyExistsException(index);
    }
    List<IndexEventListener> finalListeners = Collections.singletonList(// double check that shard is not created.
    new IndexEventListener() {

        @Override
        public void beforeIndexShardCreated(ShardId shardId, Settings indexSettings) {
            assert false : "temp index should not trigger shard creation";
            throw new OpenSearchException("temp index should not trigger shard creation [{}]", index);
        }

        @Override
        public void onStoreCreated(ShardId shardId) {
            assert false : "temp index should not trigger store creation";
            throw new OpenSearchException("temp index should not trigger store creation [{}]", index);
        }
    });
    final IndexService indexService = createIndexService(CREATE_INDEX, indexMetadata, indicesQueryCache, indicesFieldDataCache, finalListeners, indexingMemoryController);
    try (Closeable dummy = () -> indexService.close("temp", false)) {
        return indexServiceConsumer.apply(indexService);
    }
}
Also used : ShardId(org.opensearch.index.shard.ShardId) IndexEventListener(org.opensearch.index.shard.IndexEventListener) IndexService(org.opensearch.index.IndexService) Closeable(java.io.Closeable) ResourceAlreadyExistsException(org.opensearch.ResourceAlreadyExistsException) Index(org.opensearch.index.Index) OpenSearchException(org.opensearch.OpenSearchException) IndexScopedSettings(org.opensearch.common.settings.IndexScopedSettings) Settings(org.opensearch.common.settings.Settings) IndexSettings(org.opensearch.index.IndexSettings)

Example 5 with IndexEventListener

use of org.opensearch.index.shard.IndexEventListener in project OpenSearch by opensearch-project.

the class IndicesLifecycleListenerIT method testBeforeIndexAddedToCluster.

public void testBeforeIndexAddedToCluster() throws Exception {
    String node1 = internalCluster().startNode();
    String node2 = internalCluster().startNode();
    String node3 = internalCluster().startNode();
    final AtomicInteger beforeAddedCount = new AtomicInteger(0);
    final AtomicInteger allCreatedCount = new AtomicInteger(0);
    IndexEventListener listener = new IndexEventListener() {

        @Override
        public void beforeIndexAddedToCluster(Index index, Settings indexSettings) {
            beforeAddedCount.incrementAndGet();
            if (MockIndexEventListener.TestPlugin.INDEX_FAIL.get(indexSettings)) {
                throw new OpenSearchException("failing on purpose");
            }
        }

        @Override
        public void beforeIndexCreated(Index index, Settings indexSettings) {
            allCreatedCount.incrementAndGet();
        }
    };
    internalCluster().getInstance(MockIndexEventListener.TestEventListener.class, node1).setNewDelegate(listener);
    internalCluster().getInstance(MockIndexEventListener.TestEventListener.class, node2).setNewDelegate(listener);
    internalCluster().getInstance(MockIndexEventListener.TestEventListener.class, node3).setNewDelegate(listener);
    client().admin().indices().prepareCreate("test").setSettings(Settings.builder().put(IndexMetadata.SETTING_NUMBER_OF_SHARDS, 3).put(IndexMetadata.SETTING_NUMBER_OF_REPLICAS, 1)).get();
    ensureGreen("test");
    assertThat("beforeIndexAddedToCluster called only once", beforeAddedCount.get(), equalTo(1));
    assertThat("beforeIndexCreated called on each data node", allCreatedCount.get(), greaterThanOrEqualTo(3));
    try {
        client().admin().indices().prepareCreate("failed").setSettings(Settings.builder().put("index.fail", true)).get();
        fail("should have thrown an exception during creation");
    } catch (Exception e) {
        assertTrue(e.getMessage().contains("failing on purpose"));
        ClusterStateResponse resp = client().admin().cluster().prepareState().get();
        assertFalse(resp.getState().routingTable().indicesRouting().keys().contains("failed"));
    }
}
Also used : MockIndexEventListener(org.opensearch.test.MockIndexEventListener) IndexEventListener(org.opensearch.index.shard.IndexEventListener) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ClusterStateResponse(org.opensearch.action.admin.cluster.state.ClusterStateResponse) Index(org.opensearch.index.Index) OpenSearchException(org.opensearch.OpenSearchException) Settings(org.opensearch.common.settings.Settings) OpenSearchException(org.opensearch.OpenSearchException)

Aggregations

IndexEventListener (org.opensearch.index.shard.IndexEventListener)11 IndexService (org.opensearch.index.IndexService)5 IndexSettings (org.opensearch.index.IndexSettings)5 Settings (org.opensearch.common.settings.Settings)4 Index (org.opensearch.index.Index)4 OpenSearchException (org.opensearch.OpenSearchException)3 ResourceAlreadyExistsException (org.opensearch.ResourceAlreadyExistsException)3 IndexShard (org.opensearch.index.shard.IndexShard)3 ShardId (org.opensearch.index.shard.ShardId)3 MockIndexEventListener (org.opensearch.test.MockIndexEventListener)3 IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)2 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)2 ClusterHealthResponse (org.opensearch.action.admin.cluster.health.ClusterHealthResponse)2 IndexRequestBuilder (org.opensearch.action.index.IndexRequestBuilder)2 SearchResponse (org.opensearch.action.search.SearchResponse)2 IndexMetadata (org.opensearch.cluster.metadata.IndexMetadata)2 ShardRouting (org.opensearch.cluster.routing.ShardRouting)2 CheckedFunction (org.opensearch.common.CheckedFunction)2 Nullable (org.opensearch.common.Nullable)2