예제 #1
0
 private void recoverFromTranslog(TranslogRecoveryPerformer handler) throws IOException {
   Translog.TranslogGeneration translogGeneration = translog.getGeneration();
   final int opsRecovered;
   try {
     Translog.Snapshot snapshot = translog.newSnapshot();
     opsRecovered = handler.recoveryFromSnapshot(this, snapshot);
   } catch (Throwable e) {
     throw new EngineException(shardId, "failed to recover from translog", e);
   }
   // flush if we recovered something or if we have references to older translogs
   // note: if opsRecovered == 0 and we have older translogs it means they are corrupted or 0
   // length.
   assert allowCommits.get() == false : "commits are allowed but shouldn't";
   allowCommits.set(true); // we are good - now we can commit
   if (opsRecovered > 0) {
     logger.trace(
         "flushing post recovery from translog. ops recovered [{}]. committed translog id [{}]. current id [{}]",
         opsRecovered,
         translogGeneration == null ? null : translogGeneration.translogFileGeneration,
         translog.currentFileGeneration());
     flush(true, true);
   } else if (translog.isCurrent(translogGeneration) == false) {
     commitIndexWriter(
         indexWriter,
         translog,
         lastCommittedSegmentInfos.getUserData().get(Engine.SYNC_COMMIT_ID));
   }
 }
예제 #2
0
 private void commitIndexWriter(IndexWriter writer, Translog translog, String syncId)
     throws IOException {
   ensureCanFlush();
   try {
     Translog.TranslogGeneration translogGeneration = translog.getGeneration();
     logger.trace(
         "committing writer with translog id [{}]  and sync id [{}] ",
         translogGeneration.translogFileGeneration,
         syncId);
     Map<String, String> commitData = new HashMap<>(2);
     commitData.put(
         Translog.TRANSLOG_GENERATION_KEY,
         Long.toString(translogGeneration.translogFileGeneration));
     commitData.put(Translog.TRANSLOG_UUID_KEY, translogGeneration.translogUUID);
     if (syncId != null) {
       commitData.put(Engine.SYNC_COMMIT_ID, syncId);
     }
     indexWriter.setCommitData(commitData);
     writer.commit();
   } catch (Throwable ex) {
     failEngine("lucene commit failed", ex);
     throw ex;
   }
 }
예제 #3
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");
  }