From 5110dc73fc6d29a786d93bf46c34342a7ecc85ed Mon Sep 17 00:00:00 2001 From: Sean Busbey Date: Tue, 12 Feb 2019 23:26:01 -0600 Subject: [PATCH] HBASE-21884 avoid autoboxing in ugi ref counting for secure bulk load --- .../hbase/regionserver/SecureBulkLoadManager.java | 35 +++++++++++++--------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SecureBulkLoadManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SecureBulkLoadManager.java index 566a6b688f..f0b8910bce 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SecureBulkLoadManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SecureBulkLoadManager.java @@ -29,6 +29,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiFunction; import java.util.function.Consumer; +import org.apache.commons.lang3.mutable.MutableInt; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; @@ -110,7 +111,7 @@ public class SecureBulkLoadManager { private Path baseStagingDir; private UserProvider userProvider; - private ConcurrentHashMap ugiReferenceCounter; + private ConcurrentHashMap ugiReferenceCounter; private Connection conn; SecureBulkLoadManager(Configuration conf, Connection conn) { @@ -182,27 +183,33 @@ public class SecureBulkLoadManager { private void incrementUgiReference(UserGroupInformation ugi) { - ugiReferenceCounter.merge(ugi, 1, new BiFunction() { - @Override - public Integer apply(Integer oldvalue, Integer value) { - return ++oldvalue; + // if we haven't seen this ugi before, make a new counter + ugiReferenceCounter.compute(ugi, (key, value) -> { + if (value == null) { + value = new MutableInt(1); + } else { + value.increment(); } + return value; }); } private void decrementUgiReference(UserGroupInformation ugi) { - ugiReferenceCounter.computeIfPresent(ugi, - new BiFunction() { - @Override - public Integer apply(UserGroupInformation key, Integer value) { - return value > 1 ? --value : null; - } - }); + // if the count drops below 1 we remove the entry by returning null + ugiReferenceCounter.computeIfPresent(ugi, (key, value) -> { + if (value.intValue() > 1) { + value.decrement(); + } else { + value = null; + } + return value; + }); } private boolean isUserReferenced(UserGroupInformation ugi) { - Integer count = ugiReferenceCounter.get(ugi); - return count != null && count > 0; + // if the ugi is in the map, based on invariants above + // the count must be above zero + return ugiReferenceCounter.containsKey(ugi); } public Map> secureBulkLoadHFiles(final HRegion region, -- 2.16.1