From a0631b72406ee855405c803528e915b6aae342ce Mon Sep 17 00:00:00 2001 From: zhangduo Date: Fri, 26 Jun 2015 08:10:05 +0800 Subject: [PATCH] HBASE-13970 NPE during compaction in trunk --- .../hbase/regionserver/compactions/Compactor.java | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/Compactor.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/Compactor.java index 26fef53..78a5cac 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/Compactor.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/Compactor.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -222,6 +223,24 @@ public abstract class Compactor { } /** + * Used to prevent compaction name conflict when multiple compactions running parallel on the + * same store. + */ + private static final AtomicInteger NAME_COUNTER = new AtomicInteger(0); + + private String generateCompactionName() { + int counter; + for (;;) { + counter = NAME_COUNTER.get(); + int next = counter == Integer.MAX_VALUE ? 0 : counter + 1; + if (NAME_COUNTER.compareAndSet(counter, next)) { + break; + } + } + return store.getRegionInfo().getRegionNameAsString() + "#" + + store.getFamily().getNameAsString() + "#" + counter; + } + /** * Performs the compaction. * @param scanner Where to read from. * @param writer Where to write to. @@ -242,8 +261,7 @@ public abstract class Compactor { if (LOG.isDebugEnabled()) { lastMillis = EnvironmentEdgeManager.currentTime(); } - String compactionName = - store.getRegionInfo().getRegionNameAsString() + "#" + store.getFamily().getNameAsString(); + String compactionName = generateCompactionName(); long now = 0; boolean hasMore; ScannerContext scannerContext = -- 1.9.1