HBASE-15955 Disable action in CatalogJanitor#setEnabled should wait for active cleanup scan to finish (Stephen Yuan Jiang)
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/de1b5ff7 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/de1b5ff7 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/de1b5ff7 Branch: refs/heads/hbase-12439 Commit: de1b5ff7761b899691085e147c885e15897a562c Parents: 21e9827 Author: Stephen Yuan Jiang <syuanjiang...@gmail.com> Authored: Fri Jun 3 15:48:48 2016 -0700 Committer: Stephen Yuan Jiang <syuanjiang...@gmail.com> Committed: Fri Jun 3 15:49:23 2016 -0700 ---------------------------------------------------------------------- .../org/apache/hadoop/hbase/master/CatalogJanitor.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/de1b5ff7/hbase-server/src/main/java/org/apache/hadoop/hbase/master/CatalogJanitor.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/CatalogJanitor.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/CatalogJanitor.java index b9abc65..c93b307 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/CatalogJanitor.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/CatalogJanitor.java @@ -48,6 +48,7 @@ import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.FSUtils; import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.hbase.util.PairOfSameType; +import org.apache.hadoop.hbase.util.Threads; import org.apache.hadoop.hbase.util.Triple; /** @@ -86,7 +87,17 @@ public class CatalogJanitor extends ScheduledChore { * @param enabled */ public boolean setEnabled(final boolean enabled) { - return this.enabled.getAndSet(enabled); + boolean alreadyEnabled = this.enabled.getAndSet(enabled); + // If disabling is requested on an already enabled chore, we could have an active + // scan still going on, callers might not be aware of that and do further action thinkng + // that no action would be from this chore. In this case, the right action is to wait for + // the active scan to complete before exiting this function. + if (!enabled && alreadyEnabled) { + while (alreadyRunning.get()) { + Threads.sleepWithoutInterrupt(100); + } + } + return alreadyEnabled; } boolean getEnabled() {