Repository: hbase Updated Branches: refs/heads/branch-1.2 9446b99a5 -> 424457540
HBASE-13970 NPE during compaction in trunk Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/42445754 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/42445754 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/42445754 Branch: refs/heads/branch-1.2 Commit: 42445754057e442ecd9c2b0117b2e3560742ef06 Parents: 9446b99 Author: zhangduo <zhang...@wandoujia.com> Authored: Fri Jun 26 08:10:05 2015 +0800 Committer: zhangduo <zhang...@wandoujia.com> Committed: Thu Jul 2 21:37:53 2015 +0800 ---------------------------------------------------------------------- .../regionserver/compactions/Compactor.java | 22 ++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/42445754/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/Compactor.java ---------------------------------------------------------------------- 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 d3a82dd..2c34c70 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 =