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
This commit is contained in:
dengweisysu 2019-10-10 05:15:15 +08:00 committed by Nhat Nguyen
parent 302e09decf
commit dc4224fbdf
1 changed files with 3 additions and 0 deletions

View File

@ -1678,6 +1678,8 @@ public class Translog extends AbstractIndexShardComponent implements IndexShardC
* required generation * required generation
*/ */
public void trimUnreferencedReaders() throws IOException { 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()) { try (ReleasableLock ignored = writeLock.acquire()) {
if (closed.get()) { if (closed.get()) {
// we're shutdown potentially on some tragic event, don't delete anything // we're shutdown potentially on some tragic event, don't delete anything
@ -1705,6 +1707,7 @@ public class Translog extends AbstractIndexShardComponent implements IndexShardC
// We now update the checkpoint to ignore the file we are going to remove. // 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 // 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. // but crashed before we could delete the file.
// sync at once to make sure that there's at most one unreferenced generation.
current.sync(); current.sync();
deleteReaderFiles(reader); deleteReaderFiles(reader);
} }