docs: @Override
      public void doRun() {
          if (!cluster.isConnected()) {
              LOG.info("Cluster not connected yet, delaying index field type initialization until it is reachable.");
              while (true) {
                  try {
                      cluster.waitForConnectedAndDeflectorHealthy();
                      break;
                  } catch (InterruptedException | TimeoutException e) {
                      LOG.warn("Interrupted or timed out waiting for Elasticsearch cluster, checking again.");
                  }
              }
          }
  
          // We are NOT using IndexSetRegistry#getAll() here because of this: https://github.com/Graylog2/graylog2-server/issues/4625
          indexSetService.findAll().forEach(indexSetConfig -> {
              final String indexSetId = indexSetConfig.id();
              final String indexSetTitle = indexSetConfig.title();
              final Set<IndexFieldTypesDTO> existingIndexTypes = ImmutableSet.copyOf(dbService.findForIndexSet(indexSetId));
  
              final IndexSet indexSet = mongoIndexSetFactory.create(indexSetConfig);
  
              // On startup we check that we have the field types for all existing indices
              LOG.debug("Updating index field types for index set <{}/{}>", indexSetTitle, indexSetId);
              poller.poll(indexSet, existingIndexTypes).forEach(dbService::upsert);
  
              // Make sure we have a polling job for the index set
              if (!futures.containsKey(indexSetId)) {
                  schedule(indexSet);
              }
  
              // Cleanup orphaned field type entries that haven't been removed by the event handler
              dbService.findForIndexSet(indexSetId).stream()
                      .filter(types -> !indices.exists(types.indexName()))
                      .forEach(types -> dbService.delete(types.id()));
          });
      }