Murtadha Hubail has submitted this change and it was merged. Change subject: [ASTERIXDB-2398][STO] Ensure No Concurrent Access to FileMapManager ......................................................................
[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 <[email protected]> Tested-by: Jenkins <[email protected]> Contrib: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Reviewed-by: abdullah alamoudi <[email protected]> --- M hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/BufferCache.java M hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/file/BufferedFileHandle.java M hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/file/FileMapManager.java 3 files changed, 8 insertions(+), 4 deletions(-) Approvals: Anon. E. Moose #1000171: abdullah alamoudi: Looks good to me, approved Jenkins: Verified; No violations found; ; Verified 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 @@ 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 @@ 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); 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 @@ public class BufferedFileHandle { private final int fileId; - private IFileHandle handle; + private volatile IFileHandle handle; private final AtomicInteger refCount; public BufferedFileHandle(int fileId, IFileHandle handle) { 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 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; -- To view, visit https://asterix-gerrit.ics.uci.edu/2863 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: Iea7fdb0b891b4ba2aaa528b42eab47b6f841672d Gerrit-PatchSet: 3 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Murtadha Hubail <[email protected]> Gerrit-Reviewer: Anon. E. Moose #1000171 Gerrit-Reviewer: Jenkins <[email protected]> Gerrit-Reviewer: Michael Blow <[email protected]> Gerrit-Reviewer: Murtadha Hubail <[email protected]> Gerrit-Reviewer: abdullah alamoudi <[email protected]>
