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.