瀏覽代碼

Sync translog without lock before trim unreferenced readers (#47790)

This commit is similar to the optimization made in #45765. With this
change, we fsync most of the data of the current generation without
holding writeLock when trimming unreferenced readers.

Relates #45765
dengweisysu 6 年之前
父節點
當前提交
f749bacf34
共有 1 個文件被更改,包括 3 次插入0 次删除
  1. 3 0
      server/src/main/java/org/elasticsearch/index/translog/Translog.java

+ 3 - 0
server/src/main/java/org/elasticsearch/index/translog/Translog.java

@@ -1670,6 +1670,8 @@ public class Translog extends AbstractIndexShardComponent implements IndexShardC
      * required generation
      */
     public void trimUnreferencedReaders() throws IOException {
+        // move most of the data to disk to reduce the time the lock is held
+        sync();
         try (ReleasableLock ignored = writeLock.acquire()) {
             if (closed.get()) {
                 // we're shutdown potentially on some tragic event, don't delete anything
@@ -1697,6 +1699,7 @@ public class Translog extends AbstractIndexShardComponent implements IndexShardC
                 // We now update the checkpoint to ignore the file we are going to remove.
                 // Note that there is a provision in recoverFromFiles to allow for the case where we synced the checkpoint
                 // but crashed before we could delete the file.
+                // sync at once to make sure that there's at most one unreferenced generation.
                 current.sync();
                 deleteReaderFiles(reader);
             }