--- a/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java +++ b/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java @@ -377,6 +377,23 @@ public class StoreFile extends SchemaConfigured { p.getParent().getName()), nameStrippedOfSuffix); } + /* + * Return the original hfile name referred to by a Reference. + * @param filename reference file name. + * @return the original hfile name. + * @throws IllegalArgumentException when file name regex fails to match. + */ + public static String getReferredToFileName(final String refFileName) { + Matcher m = REF_NAME_PATTERN.matcher(refFileName); + if (m == null || !m.matches()) { + LOG.warn("Failed match of store file name " + refFileName); + throw new IllegalArgumentException("Failed match of store file name " + refFileName); + } + + // return the file name stripped of suffix + return m.group(1); + } + /** * @return True if this file was made by a major compaction. */ diff --git a/src/main/java/org/apache/hadoop/hbase/snapshot/SnapshotReferenceUtil.java b/src/main/java/org/apache/hadoop/hbase/snapshot/SnapshotReferenceUtil.java index eee2057..af819f6 100644 --- a/src/main/java/org/apache/hadoop/hbase/snapshot/SnapshotReferenceUtil.java +++ b/src/main/java/org/apache/hadoop/hbase/snapshot/SnapshotReferenceUtil.java @@ -37,6 +37,7 @@ import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.io.Reference; import org.apache.hadoop.hbase.io.HFileLink; +import org.apache.hadoop.hbase.regionserver.StoreFile; import org.apache.hadoop.hbase.regionserver.wal.HLog; import org.apache.hadoop.hbase.util.FSUtils; import org.apache.hadoop.hbase.util.FSVisitor; @@ -223,6 +224,13 @@ public final class SnapshotReferenceUtil { if (HFileLink.isHFileLink(hfile)) { names.add(HFileLink.getReferencedHFileName(hfile)); } else { + // If we have a Reference, we want to include its parent hfile + // because we still depend on it and we don't want to lose it to + // cleaners. + if (StoreFile.isReference(hfile)) { + names.add(StoreFile.getReferredToFileName(hfile)); + } + names.add(hfile); } }