浏览代码

Fsync translog without writeLock before rolling (#45765)

Today, when rolling a new translog generation, we block all write
threads until a new generation is created. This choice is perfectly 
fine except in a highly concurrent environment with the translog 
async setting. We can reduce the blocking time by pre-sync the 
current generation without writeLock before rolling. The new step 
would fsync most of the data of the current generation without 
blocking write threads.

Close #45371
dengweisysu 6 年之前
父节点
当前提交
9f654fd67e
共有 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

@@ -1641,6 +1641,9 @@ public class Translog extends AbstractIndexShardComponent implements IndexShardC
      * @throws IOException if an I/O exception occurred during any file operations
      * @throws IOException if an I/O exception occurred during any file operations
      */
      */
     public void rollGeneration() throws IOException {
     public void rollGeneration() throws IOException {
+        // make sure we move most of the data to disk outside of the writeLock
+        // in order to reduce the time the lock is held since it's blocking all threads
+        sync();
         try (Releasable ignored = writeLock.acquire()) {
         try (Releasable ignored = writeLock.acquire()) {
             try {
             try {
                 final TranslogReader reader = current.closeIntoReader();
                 final TranslogReader reader = current.closeIntoReader();