Repository: asterixdb Updated Branches: refs/heads/master 547fc5293 -> 1eb3e7392
[ASTERIXDB-2398][STO] Ensure No Concurrent Access to FileMapManager - user model changes: no - storage format changes: no - interface changes: no Details: - Currently it is possible for a thread to access FileMapManager without holding the proper lock and therefore seeing a stale state of the map. This change ensures that all access to the map is synchronized on the same lock. Change-Id: Iea7fdb0b891b4ba2aaa528b42eab47b6f841672d Reviewed-on: https://asterix-gerrit.ics.uci.edu/2863 Sonar-Qube: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Contrib: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: abdullah alamoudi <bamou...@gmail.com> Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/1eb3e739 Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/1eb3e739 Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/1eb3e739 Branch: refs/heads/master Commit: 1eb3e7392ce09d1298819bea5bf932cc9226d3ba Parents: 547fc52 Author: Murtadha Hubail <mhub...@apache.org> Authored: Thu Aug 9 07:54:01 2018 -0700 Committer: Murtadha Hubail <mhub...@apache.org> Committed: Thu Aug 9 13:10:28 2018 -0700 ---------------------------------------------------------------------- .../hyracks/storage/common/buffercache/BufferCache.java | 8 +++++--- .../hyracks/storage/common/file/BufferedFileHandle.java | 2 +- .../apache/hyracks/storage/common/file/FileMapManager.java | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1eb3e739/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/BufferCache.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/BufferCache.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/BufferCache.java index f8b9a57..b35cefe 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/BufferCache.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/BufferCache.java @@ -849,9 +849,8 @@ public class BufferCache implements IBufferCacheInternal, ILifeCycleComponent { if (LOGGER.isEnabled(fileOpsLevel)) { LOGGER.log(fileOpsLevel, "Opening file: " + fileId + " in cache: " + this); } - BufferedFileHandle fInfo = null; try { - fInfo = getOrCreateFileHandle(fileId); + final BufferedFileHandle fInfo = getOrCreateFileHandle(fileId); if (fInfo.getFileHandle() == null) { // a new file synchronized (fInfo) { @@ -861,7 +860,10 @@ public class BufferCache implements IBufferCacheInternal, ILifeCycleComponent { closeOpeningFiles(fInfo); } // create, open, and map new file reference - FileReference fileRef = fileMapManager.lookupFileName(fileId); + FileReference fileRef; + synchronized (fileInfoMap) { + fileRef = fileMapManager.lookupFileName(fileId); + } IFileHandle fh = ioManager.open(fileRef, IIOManager.FileReadWriteMode.READ_WRITE, IIOManager.FileSyncMode.METADATA_ASYNC_DATA_ASYNC); fInfo.setFileHandle(fh); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1eb3e739/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/file/BufferedFileHandle.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/file/BufferedFileHandle.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/file/BufferedFileHandle.java index 1312d97..4f15588 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/file/BufferedFileHandle.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/file/BufferedFileHandle.java @@ -24,7 +24,7 @@ import org.apache.hyracks.api.io.IFileHandle; public class BufferedFileHandle { private final int fileId; - private IFileHandle handle; + private volatile IFileHandle handle; private final AtomicInteger refCount; public BufferedFileHandle(int fileId, IFileHandle handle) { http://git-wip-us.apache.org/repos/asf/asterixdb/blob/1eb3e739/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/file/FileMapManager.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/file/FileMapManager.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/file/FileMapManager.java index 32922d2..0f2703b 100644 --- a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/file/FileMapManager.java +++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/file/FileMapManager.java @@ -25,7 +25,9 @@ import java.util.Map; import org.apache.hyracks.api.exceptions.ErrorCode; import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.api.io.FileReference; +import org.apache.hyracks.util.annotations.NotThreadSafe; +@NotThreadSafe public class FileMapManager implements IFileMapManager { private static final long serialVersionUID = 1L;