private boolean removeIndexUpdater(String indexName) {
    indexerRegistry.unregister(indexName);

    IndexUpdaterHandle handle = indexUpdaters.get(indexName);

    if (handle == null) {
      return true;
    }

    try {
      handle.stop();
      indexUpdaters.remove(indexName);
      log.info("Stopped indexer updater for index " + indexName);
      return true;
    } catch (Throwable t) {
      log.fatal("Failed to stop an IndexUpdater that should be stopped.", t);
      return false;
    }
  }
  @PreDestroy
  public void stop() {
    eventWorker.stop();
    eventWorkerThread.interrupt();
    try {
      Logs.logThreadJoin(eventWorkerThread);
      eventWorkerThread.join();
    } catch (InterruptedException e) {
      log.info("Interrupted while joining eventWorkerThread.");
    }

    for (IndexUpdaterHandle handle : indexUpdaters.values()) {
      try {
        handle.stop();
      } catch (InterruptedException e) {
        // Continue the stop procedure
      }
    }

    connectionManager.shutdown();
  }
  private void addIndexUpdater(IndexDefinition index) {
    IndexUpdaterHandle handle = null;
    try {
      IndexerConf indexerConf =
          IndexerConfBuilder.build(new ByteArrayInputStream(index.getConfiguration()), repository);

      ShardSelector shardSelector;
      if (index.getShardingConfiguration() == null) {
        shardSelector = DefaultShardSelectorBuilder.createDefaultSelector(index.getSolrShards());
      } else {
        shardSelector = JsonShardSelectorBuilder.build(index.getShardingConfiguration());
      }

      checkShardUsage(index.getName(), index.getSolrShards().keySet(), shardSelector.getShards());

      SolrShardManager solrShardMgr =
          new SolrShardManagerImpl(
              index.getName(),
              index.getSolrShards(),
              shardSelector,
              httpClient,
              solrClientConfig,
              true);
      IndexLocker indexLocker = new IndexLocker(zk, settings.getEnableLocking());
      IndexerMetrics indexerMetrics = new IndexerMetrics(index.getName());

      // create a deref map in case the indexer configuration contains deref fields
      DerefMap derefMap =
          indexerConf.containsDerefExpressions()
              ? DerefMapHbaseImpl.create(index.getName(), hbaseConf, repository.getIdGenerator())
              : null;

      // create and register the indexer
      Indexer indexer =
          new Indexer(
              index.getName(),
              indexerConf,
              repository,
              solrShardMgr,
              indexLocker,
              indexerMetrics,
              derefMap);
      indexerRegistry.register(indexer);

      IndexUpdaterMetrics updaterMetrics = new IndexUpdaterMetrics(index.getName());
      IndexUpdater indexUpdater =
          new IndexUpdater(
              indexer,
              repository,
              indexLocker,
              rowLog,
              updaterMetrics,
              derefMap,
              index.getQueueSubscriptionId());

      List<RemoteListenerHandler> listenerHandlers = new ArrayList<RemoteListenerHandler>();

      for (int i = 0; i < settings.getListenersPerIndex(); i++) {
        RemoteListenerHandler handler =
            new RemoteListenerHandler(
                rowLog, index.getQueueSubscriptionId(), indexUpdater, rowLogConfMgr, hostName);
        listenerHandlers.add(handler);
      }

      handle =
          new IndexUpdaterHandle(
              index, listenerHandlers, solrShardMgr, indexerMetrics, updaterMetrics);
      handle.start();

      indexUpdaters.put(index.getName(), handle);

      log.info("Started index updater for index " + index.getName());
    } catch (Throwable t) {
      if (t instanceof InterruptedException) {
        Thread.currentThread().interrupt();
      }

      log.error("Problem starting index updater for index " + index.getName(), t);

      if (handle != null) {
        // stop any listeners that might have been started
        try {
          handle.stop();
        } catch (Throwable t2) {
          if (t instanceof InterruptedException) {
            Thread.currentThread().interrupt();
          }
          log.error(
              "Problem stopping listeners for failed-to-start index updater for index '"
                  + index.getName()
                  + "'",
              t2);
        }
      }
    }
  }