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;
 

Reply via email to