You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by bi...@apache.org on 2019/05/22 08:27:10 UTC
[hbase] branch branch-2.1 updated: HBASE-22447 Check refCount
before free block in BucketCache
This is an automated email from the ASF dual-hosted git repository.
binlijin pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new 81dc712 HBASE-22447 Check refCount before free block in BucketCache
81dc712 is described below
commit 81dc71277970631dd366c7d11363e1f3dd172931
Author: binlijin <bi...@apache.org>
AuthorDate: Wed May 22 16:19:08 2019 +0800
HBASE-22447 Check refCount before free block in BucketCache
---
.../hadoop/hbase/io/hfile/bucket/BucketCache.java | 44 +++++-----------------
1 file changed, 10 insertions(+), 34 deletions(-)
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java
index f52d8af..22fea50 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java
@@ -554,37 +554,6 @@ public class BucketCache implements BlockCache, HeapSize {
return evictBlock(cacheKey, true);
}
- // does not check for the ref count. Just tries to evict it if found in the
- // bucket map
- private boolean forceEvict(BlockCacheKey cacheKey) {
- if (!cacheEnabled) {
- return false;
- }
- RAMQueueEntry removedBlock = checkRamCache(cacheKey);
- BucketEntry bucketEntry = backingMap.get(cacheKey);
- if (bucketEntry == null) {
- if (removedBlock != null) {
- cacheStats.evicted(0, cacheKey.isPrimary());
- return true;
- } else {
- return false;
- }
- }
- ReentrantReadWriteLock lock = offsetLock.getLock(bucketEntry.offset());
- try {
- lock.writeLock().lock();
- if (backingMap.remove(cacheKey, bucketEntry)) {
- blockEvicted(cacheKey, bucketEntry, removedBlock == null);
- } else {
- return false;
- }
- } finally {
- lock.writeLock().unlock();
- }
- cacheStats.evicted(bucketEntry.getCachedTime(), cacheKey.isPrimary());
- return true;
- }
-
private RAMQueueEntry checkRamCache(BlockCacheKey cacheKey) {
RAMQueueEntry removedBlock = ramCache.remove(cacheKey);
if (removedBlock != null) {
@@ -1046,8 +1015,15 @@ public class BucketCache implements BlockCache, HeapSize {
ReentrantReadWriteLock lock = offsetLock.getLock(bucketEntries[i].offset());
try {
lock.writeLock().lock();
- if (backingMap.remove(key, bucketEntries[i])) {
- blockEvicted(key, bucketEntries[i], false);
+ int refCount = bucketEntries[i].getRefCount();
+ if (refCount == 0) {
+ if (backingMap.remove(key, bucketEntries[i])) {
+ blockEvicted(key, bucketEntries[i], false);
+ } else {
+ bucketEntries[i].markForEvict();
+ }
+ } else {
+ bucketEntries[i].markForEvict();
}
} finally {
lock.writeLock().unlock();
@@ -1666,7 +1642,7 @@ public class BucketCache implements BlockCache, HeapSize {
if (bucketEntry != null) {
int refCount = bucketEntry.decrementRefCountAndGet();
if (refCount == 0 && bucketEntry.isMarkedForEvict()) {
- forceEvict(cacheKey);
+ evictBlock(cacheKey);
}
}
}