Esempio n. 1
0
  public InternalEngine(EngineConfig engineConfig) throws EngineException {
    super(engineConfig);
    openMode = engineConfig.getOpenMode();
    this.versionMap = new LiveVersionMap();
    store.incRef();
    IndexWriter writer = null;
    Translog translog = null;
    SearcherManager manager = null;
    EngineMergeScheduler scheduler = null;
    boolean success = false;
    try {
      this.lastDeleteVersionPruneTimeMSec = engineConfig.getThreadPool().estimatedTimeInMillis();
      mergeScheduler =
          scheduler =
              new EngineMergeScheduler(engineConfig.getShardId(), engineConfig.getIndexSettings());
      this.dirtyLocks =
          new Object
              [Runtime.getRuntime().availableProcessors() * 10]; // we multiply it to have enough...
      for (int i = 0; i < dirtyLocks.length; i++) {
        dirtyLocks[i] = new Object();
      }
      throttle = new IndexThrottle();
      this.searcherFactory = new SearchFactory(logger, isClosed, engineConfig);
      try {
        writer = createWriter(openMode == EngineConfig.OpenMode.CREATE_INDEX_AND_TRANSLOG);
        indexWriter = writer;
        translog = openTranslog(engineConfig, writer);
        assert translog.getGeneration() != null;
      } catch (IOException | TranslogCorruptedException e) {
        throw new EngineCreationFailureException(shardId, "failed to create engine", e);
      } catch (AssertionError e) {
        // IndexWriter throws AssertionError on init, if asserts are enabled, if any files don't
        // exist, but tests that
        // randomly throw FNFE/NSFE can also hit this:
        if (ExceptionsHelper.stackTrace(e)
            .contains("org.apache.lucene.index.IndexWriter.filesExist")) {
          throw new EngineCreationFailureException(shardId, "failed to create engine", e);
        } else {
          throw e;
        }
      }

      this.translog = translog;
      manager = createSearcherManager();
      this.searcherManager = manager;
      this.versionMap.setManager(searcherManager);
      // don't allow commits until we are done with recovering
      allowCommits.compareAndSet(true, openMode != EngineConfig.OpenMode.OPEN_INDEX_AND_TRANSLOG);
      success = true;
    } finally {
      if (success == false) {
        IOUtils.closeWhileHandlingException(writer, translog, manager, scheduler);
        versionMap.clear();
        if (isClosed.get() == false) {
          // failure we need to dec the store reference
          store.decRef();
        }
      }
    }
    logger.trace("created new InternalEngine");
  }