You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ra...@apache.org on 2015/02/18 04:58:33 UTC

hbase git commit: HBASE-13013 - Add read lock to ExpiredMobFileCleanerChore (Jingcheng Du)

Repository: hbase
Updated Branches:
  refs/heads/hbase-11339 2c4934eda -> 8f5dae471


HBASE-13013 - Add read lock to ExpiredMobFileCleanerChore (Jingcheng Du)


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/8f5dae47
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/8f5dae47
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/8f5dae47

Branch: refs/heads/hbase-11339
Commit: 8f5dae471a9da95b144ecc15010028ba1ce7120c
Parents: 2c4934e
Author: Ramkrishna <ra...@intel.com>
Authored: Wed Feb 18 09:27:41 2015 +0530
Committer: Ramkrishna <ra...@intel.com>
Committed: Wed Feb 18 09:27:41 2015 +0530

----------------------------------------------------------------------
 .../master/ExpiredMobFileCleanerChore.java      | 37 +++++++++++++++++++-
 .../hbase/master/MobFileCompactionChore.java    |  4 +++
 2 files changed, 40 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/8f5dae47/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ExpiredMobFileCleanerChore.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ExpiredMobFileCleanerChore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ExpiredMobFileCleanerChore.java
index 30b5be3..cc0d0aa 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ExpiredMobFileCleanerChore.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ExpiredMobFileCleanerChore.java
@@ -18,6 +18,7 @@
 
 package org.apache.hadoop.hbase.master;
 
+import java.io.IOException;
 import java.util.Map;
 
 import org.apache.commons.logging.Log;
@@ -27,8 +28,11 @@ import org.apache.hadoop.hbase.Chore;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.TableDescriptors;
+import org.apache.hadoop.hbase.exceptions.LockTimeoutException;
+import org.apache.hadoop.hbase.master.TableLockManager.TableLock;
 import org.apache.hadoop.hbase.mob.ExpiredMobFileCleaner;
 import org.apache.hadoop.hbase.mob.MobConstants;
+import org.apache.hadoop.hbase.mob.MobUtils;
 
 /**
  * The Class ExpiredMobFileCleanerChore for running cleaner regularly to remove the expired
@@ -39,12 +43,14 @@ public class ExpiredMobFileCleanerChore extends Chore {
 
   private static final Log LOG = LogFactory.getLog(ExpiredMobFileCleanerChore.class);
   private final HMaster master;
+  private TableLockManager tableLockManager;
   private ExpiredMobFileCleaner cleaner;
 
   public ExpiredMobFileCleanerChore(HMaster master) {
     super(master.getServerName() + "-ExpiredMobFileCleanerChore", master.getConfiguration().getInt(
         MobConstants.MOB_CLEANER_PERIOD, MobConstants.DEFAULT_MOB_CLEANER_PERIOD), master);
     this.master = master;
+    this.tableLockManager = master.getTableLockManager();
     cleaner = new ExpiredMobFileCleaner();
   }
 
@@ -56,7 +62,36 @@ public class ExpiredMobFileCleanerChore extends Chore {
       for (HTableDescriptor htd : map.values()) {
         for (HColumnDescriptor hcd : htd.getColumnFamilies()) {
           if (hcd.isMobEnabled() && hcd.getMinVersions() == 0) {
-            cleaner.cleanExpiredMobFiles(htd.getTableName().getNameAsString(), hcd);
+            // clean only for mob-enabled column.
+            // obtain a read table lock before cleaning, synchronize with MobFileCompactionChore.
+            boolean tableLocked = false;
+            TableLock lock = null;
+            try {
+              // the tableLockManager might be null in testing. In that case, it is lock-free.
+              if (tableLockManager != null) {
+                lock = tableLockManager.readLock(MobUtils.getTableLockName(htd.getTableName()),
+                  "Run ExpiredMobFileCleanerChore");
+                lock.acquire();
+              }
+              tableLocked = true;
+              cleaner.cleanExpiredMobFiles(htd.getTableName().getNameAsString(), hcd);
+            } catch (LockTimeoutException e) {
+              LOG.info("Fail to acquire the lock because of timeout, maybe a"
+                + " MobFileCompactor is running", e);
+            } catch (Exception e) {
+              LOG.error(
+                "Fail to clean the expired mob files for the column " + hcd.getNameAsString()
+                  + " in the table " + htd.getNameAsString(), e);
+            } finally {
+              if (lock != null && tableLocked) {
+                try {
+                  lock.release();
+                } catch (IOException e) {
+                  LOG.error(
+                    "Fail to release the write lock for the table " + htd.getNameAsString(), e);
+                }
+              }
+            }
           }
         }
       }

http://git-wip-us.apache.org/repos/asf/hbase/blob/8f5dae47/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MobFileCompactionChore.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MobFileCompactionChore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MobFileCompactionChore.java
index 9973619..12491af 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MobFileCompactionChore.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MobFileCompactionChore.java
@@ -37,6 +37,7 @@ import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.TableDescriptors;
 import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.exceptions.LockTimeoutException;
 import org.apache.hadoop.hbase.master.TableLockManager.TableLock;
 import org.apache.hadoop.hbase.mob.MobConstants;
 import org.apache.hadoop.hbase.mob.MobUtils;
@@ -103,6 +104,9 @@ public class MobFileCompactionChore extends Chore{
             }
             tableLocked = true;
             compactor.compact();
+          } catch (LockTimeoutException e) {
+            LOG.info("Fail to acquire the lock because of timeout, maybe a major compaction or an"
+              + " ExpiredMobFileCleanerChore is running", e);
           } catch (Exception e) {
             LOG.error("Fail to compact the mob files for the column " + hcd.getNameAsString()
               + " in the table " + htd.getNameAsString(), e);