Fixed a race in the BufferCache because fileInfoMap was not accessed in a synchronized block within pinSanityCheck().
git-svn-id: https://hyracks.googlecode.com/svn/branches/hyracks_lsm_tree@1136 123451ca-8445-de46-9d55-352943316053
diff --git a/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/buffercache/BufferCache.java b/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/buffercache/BufferCache.java
index f213ee6..58d731c 100644
--- a/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/buffercache/BufferCache.java
+++ b/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/buffercache/BufferCache.java
@@ -95,8 +95,11 @@
}
// check whether file has been created and opened
- int fileId = BufferedFileHandle.getFileId(dpid);
- BufferedFileHandle fInfo = fileInfoMap.get(fileId);
+ int fileId = BufferedFileHandle.getFileId(dpid);
+ BufferedFileHandle fInfo = null;
+ synchronized(fileInfoMap) {
+ fInfo = fileInfoMap.get(fileId);
+ }
if (fInfo == null) {
throw new HyracksDataException("pin called on a fileId " + fileId + " that has not been created.");
} else if (fInfo.getReferenceCount() <= 0) {
@@ -560,7 +563,7 @@
@Override
public void close() {
- closed = true;
+ closed = true;
synchronized (cleanerThread) {
cleanerThread.shutdownStart = true;
cleanerThread.notifyAll();
@@ -717,6 +720,9 @@
throw new HyracksDataException("Closed fileId: " + fileId + " more times than it was opened.");
}
}
+ if (LOGGER.isLoggable(Level.INFO)) {
+ LOGGER.info("Closed file: " + fileId + " in cache: " + this);
+ }
}
@Override