HBASE-20280 Fix possibility of deadlocking in refreshFileConnections

When prefetch on open is specified, there is a deadlocking case
where if the prefetch is cancelled, the PrefetchExecutor interrupts
the threads if necessary, when that happens in FileIOEngine, it
causes an ClosedByInterruptException which is a subclass of
ClosedChannelException. If we retry all ClosedChannelExceptions,
this will lock as this access is expected to be interrupted.
This change removes calling refreshFileConnections for
ClosedByInterruptExceptions.

Signed-off-by: Andrew Purtell <apurtell@apache.org>
This commit is contained in:
Zach York 2018-03-15 16:46:40 -07:00 committed by Andrew Purtell
parent a601c57f97
commit 6f1aa0edff
1 changed files with 3 additions and 0 deletions

View File

@ -22,6 +22,7 @@ import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.ClosedByInterruptException;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.FileChannel;
import java.util.Arrays;
@ -229,6 +230,8 @@ public class FileIOEngine implements IOEngine {
}
try {
accessLen = accessor.access(fileChannel, buffer, accessOffset);
} catch (ClosedByInterruptException e) {
throw e;
} catch (ClosedChannelException e) {
LOG.warn("Caught ClosedChannelException accessing BucketCache, reopening file. ", e);
refreshFileConnection(accessFileNum);