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 11:17:12 UTC
[hbase] branch branch-2 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
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2 by this push:
new e3c27d3 HBASE-22447 Check refCount before free block in BucketCache
e3c27d3 is described below
commit e3c27d33a734e2ed5c585e21abe854c6e1e0ea3c
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 1cc94e8..ee8a82a 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
@@ -562,37 +562,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) {
@@ -1054,8 +1023,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();
@@ -1674,7 +1650,7 @@ public class BucketCache implements BlockCache, HeapSize {
if (bucketEntry != null) {
int refCount = bucketEntry.decrementRefCountAndGet();
if (refCount == 0 && bucketEntry.isMarkedForEvict()) {
- forceEvict(cacheKey);
+ evictBlock(cacheKey);
}
}
}