This is an automated email from the ASF dual-hosted git repository.

busbey pushed a commit to branch HBASE-22749
in repository https://gitbox.apache.org/repos/asf/hbase.git

commit 6518288e9ad3eee7c814ea87458f713ffb9a001b
Author: Vladimir Rodionov <vladrodio...@gmail.com>
AuthorDate: Fri Feb 14 11:18:31 2020 -0800

    HBASE-23840: revert IO optiized mode back to general during migration
---
 .../hadoop/hbase/mob/DefaultMobStoreCompactor.java | 28 ++++++++++++++++++++--
 .../org/apache/hadoop/hbase/mob/MobFileName.java   |  8 ++++++-
 2 files changed, 33 insertions(+), 3 deletions(-)

diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/DefaultMobStoreCompactor.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/DefaultMobStoreCompactor.java
index 661c57f..53d9479 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/DefaultMobStoreCompactor.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/DefaultMobStoreCompactor.java
@@ -98,6 +98,23 @@ public class DefaultMobStoreCompactor extends 
DefaultCompactor {
     }
   };
 
+  
+  /*
+   * Disable IO mode. IO mode can be forcefully disabled if compactor finds
+   * old MOB file (pre-distributed compaction). This means that migration has 
not 
+   * been completed yet. During data migration (upgrade) process only general 
compaction
+   * is allowed.
+   *  
+   */
+  
+  static ThreadLocal<Boolean> disableIO = new ThreadLocal<Boolean>() {
+
+    @Override
+    protected Boolean initialValue() {
+      return Boolean.FALSE;
+    }    
+  };
+  
   /*
    * Map : MOB file name - file length Can be expensive for large amount of 
MOB files.
    */
@@ -176,6 +193,8 @@ public class DefaultMobStoreCompactor extends 
DefaultCompactor {
         Path mobDir =
             MobUtils.getMobFamilyPath(conf, store.getTableName(), 
store.getColumnFamilyName());
         List<Path> mobFiles = 
MobUtils.getReferencedMobFiles(request.getFiles(), mobDir);
+        //reset disableIO
+        disableIO.set(Boolean.FALSE);
         if (mobFiles.size() > 0) {
           calculateMobLengthMap(mobFiles);
         }
@@ -192,6 +211,9 @@ public class DefaultMobStoreCompactor extends 
DefaultCompactor {
     HashMap<String, Long> map = mobLengthMap.get();
     map.clear();
     for (Path p : mobFiles) {
+      if (MobFileName.isOldMobFileName(p.getName())) {
+        disableIO.set(Boolean.TRUE);
+      }
       FileStatus st = fs.getFileStatus(p);
       long size = st.getLen();
       LOG.debug("Referenced MOB file={} size={}", p, size);
@@ -254,8 +276,10 @@ public class DefaultMobStoreCompactor extends 
DefaultCompactor {
     }
     long maxMobFileSize = 
conf.getLong(MobConstants.MOB_COMPACTION_MAX_FILE_SIZE_KEY,
       MobConstants.DEFAULT_MOB_COMPACTION_MAX_FILE_SIZE);
-    LOG.info("Compact MOB={} optimized={} maximum MOB file size={} major={} 
store={}", compactMOBs,
-      ioOptimizedMode, maxMobFileSize, major, getStoreInfo());
+    boolean ioOptimizedMode = this.ioOptimizedMode && !disableIO.get();
+    LOG.info("Compact MOB={} optimized configured={} optimized enabled={} 
maximum MOB file size={} "+
+      "major={} store={}", compactMOBs,
+      this.ioOptimizedMode, ioOptimizedMode, maxMobFileSize, major, 
getStoreInfo());
     // Since scanner.next() can return 'false' but still be delivering data,
     // we have to use a do/while loop.
     List<Cell> cells = new ArrayList<>();
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobFileName.java 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobFileName.java
index 64cfa4d..00668d5 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobFileName.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobFileName.java
@@ -40,7 +40,7 @@ import org.apache.hadoop.hbase.util.MD5Hash;
  * TTL easily. If this timestamp is older than the TTL, it's regarded as 
expired.
  */
 @InterfaceAudience.Private
-public final class MobFileName {
+public final class MobFileName{
   private final String date;
   private final String startKey;
   private final String uuid;
@@ -124,6 +124,7 @@ public final class MobFileName {
    */
   public static MobFileName create(String fileName) {
     // The format of a file name is md5HexString(0-31bytes) + date(32-39bytes) 
+ UUID
+    // + "_" + region
     // The date format is yyyyMMdd
     String startKey = fileName.substring(0, STARTKEY_END_INDEX);
     String date = fileName.substring(STARTKEY_END_INDEX, DATE_END_INDEX);
@@ -132,6 +133,11 @@ public final class MobFileName {
     return new MobFileName(startKey, date, uuid, regionName);
   }
 
+  
+  public static boolean isOldMobFileName(String name) {
+    return name.indexOf(REGION_SEP) < 0;
+  }
+  
   /**
    * get startKey from MobFileName.
    * @param fileName file name.

Reply via email to