commit | b958a96c1a31fce245f1c3b2c89702e6fb19a97a | [log] [tgz] |
---|---|---|
author | alexander.behm <alexander.behm@123451ca-8445-de46-9d55-352943316053> | Sun Jun 24 03:50:26 2012 +0000 |
committer | alexander.behm <alexander.behm@123451ca-8445-de46-9d55-352943316053> | Sun Jun 24 03:50:26 2012 +0000 |
tree | 2348ba1cea86d7cd100b847c46e89a9b0c27548b | |
parent | 68dc82ea73933513a199100bc5b87a6af52a41a6 [diff] |
Fixed a race in BufferCache.pin() that very rarely caused deadlock in the lsm multithreading tests. git-svn-id: https://hyracks.googlecode.com/svn/branches/hyracks_lsm_tree@1588 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 7abb20c..aa53a39 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
@@ -146,21 +146,11 @@ + BufferedFileHandle.getPageId(dpid) + " because all pages are pinned."); } if (!newPage) { - if (!cPage.valid) { - /* - * We got a buffer and we have pinned it. But its invalid. If - * its a new page, we just mark it as valid and return. Or else, - * while we hold the page lock, we get a write latch on the data - * and start a read. - */ - cPage.acquireWriteLatch(false); - try { - if (!cPage.valid) { - read(cPage); - } + // Resolve race of multiple threads trying to read the page from disk. + synchronized (cPage) { + if (!cPage.valid) { + read(cPage); cPage.valid = true; - } finally { - cPage.releaseWriteLatch(); } } } else {