package org.elasticsearch.plugin.degraphmalizer; import java.util.HashMap; import java.util.Map; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.logging.ESLogger; import org.elasticsearch.common.logging.Loggers; import org.elasticsearch.index.Index; import org.elasticsearch.index.service.IndexService; import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.index.shard.service.IndexShard; import org.elasticsearch.indices.IndicesLifecycle; import org.elasticsearch.indices.IndicesService; import org.elasticsearch.plugin.degraphmalizer.updater.UpdaterManager; /** * This class is responsible for starting and stopping DegraphmalizerIndexShardListener instances. */ public class DegraphmalizerLifecycleListener extends IndicesLifecycle.Listener { private static final ESLogger LOG = Loggers.getLogger(DegraphmalizerLifecycleListener.class); private final Map<ShardId, DegraphmalizerIndexShardListener> listeners = new HashMap<ShardId, DegraphmalizerIndexShardListener>(); private final UpdaterManager updaterManager; @Inject public DegraphmalizerLifecycleListener(IndicesService indicesService, UpdaterManager updaterManager) { this.updaterManager = updaterManager; indicesService.indicesLifecycle().addListener(this); } @Override public void afterIndexCreated(final IndexService indexService) { final String indexName = indexService.index().name(); if (isRelevantForDegraphmalizer(indexName)) { updaterManager.startUpdater(indexName); } } @Override public void afterIndexClosed(final Index index, final boolean delete) { final String indexName = index.name(); if (isRelevantForDegraphmalizer(indexName)) { updaterManager.stopUpdater(indexName); } } @Override public void afterIndexShardStarted(final IndexShard indexShard) { if (isRelevantForDegraphmalizer(indexShard)) { addIndexShardListener(indexShard); } } @Override public void beforeIndexShardClosed(final ShardId shardId, final IndexShard indexShard, final boolean delete) { if (isRelevantForDegraphmalizer(indexShard)) { removeIndexShardListener(shardId, indexShard); } } private void addIndexShardListener(final IndexShard indexShard) { final String indexName = getIndexName(indexShard); final DegraphmalizerIndexShardListener shardListener = new DegraphmalizerIndexShardListener(updaterManager, indexName); final ShardId shardId = indexShard.shardId(); listeners.put(shardId, shardListener); indexShard.indexingService().addListener(shardListener); LOG.info("Index shard listener added for shard {}", shardId); } private void removeIndexShardListener(final ShardId shardId, final IndexShard indexShard) { final DegraphmalizerIndexShardListener shardListener = listeners.get(shardId); indexShard.indexingService().removeListener(shardListener); listeners.remove(shardId); LOG.info("Index shard listener removed for shard {}", shardId); } private boolean isRelevantForDegraphmalizer(final String index) { // Don't add index listeners for 'private' indices return !index.startsWith("_"); } private boolean isRelevantForDegraphmalizer(final IndexShard indexShard) { return isRelevantForDegraphmalizer(getIndexName(indexShard)); } private String getIndexName(final IndexShard indexShard) { return indexShard.shardId().index().name(); } }