Skip to content

Commit 70f2fef

Browse files
HBASE-28564 Refactor direct interactions of Reference file creations to SFT interface (#5939)
Signed-off-by: Andrew Purtell <apurtell@apache.org>
1 parent 344bf78 commit 70f2fef

69 files changed

Lines changed: 1089 additions & 445 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

hbase-server/src/main/java/org/apache/hadoop/hbase/io/HFileLink.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ public static String createFromHFileLink(final Configuration conf, final FileSys
463463
* Create the back reference name
464464
*/
465465
// package-private for testing
466-
static String createBackReferenceName(final String tableNameStr, final String regionName) {
466+
public static String createBackReferenceName(final String tableNameStr, final String regionName) {
467467

468468
return regionName + "." + tableNameStr.replace(TableName.NAMESPACE_DELIM, '=');
469469
}

hbase-server/src/main/java/org/apache/hadoop/hbase/io/Reference.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ public static Reference convert(final FSProtos.Reference r) {
195195
* delimiter, pb reads to EOF which may not be what you want).
196196
* @return This instance serialized as a delimited protobuf w/ a magic pb prefix.
197197
*/
198-
byte[] toByteArray() throws IOException {
198+
public byte[] toByteArray() throws IOException {
199199
return ProtobufUtil.prependPBMagic(convert().toByteArray());
200200
}
201201

hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,7 @@ private List<Path> mergeStoreFiles(MasterProcedureEnv env, HRegionFileSystem reg
631631
// to read the hfiles.
632632
storeFileInfo.setConf(storeConfiguration);
633633
Path refFile = mergeRegionFs.mergeStoreFile(regionFs.getRegionInfo(), family,
634-
new HStoreFile(storeFileInfo, hcd.getBloomFilterType(), CacheConfig.DISABLED));
634+
new HStoreFile(storeFileInfo, hcd.getBloomFilterType(), CacheConfig.DISABLED), tracker);
635635
mergedFiles.add(refFile);
636636
}
637637
}

hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -685,8 +685,9 @@ private Pair<List<Path>, List<Path>> splitStoreFiles(final MasterProcedureEnv en
685685
// table dir. In case of failure, the proc would go through this again, already existing
686686
// region dirs and split files would just be ignored, new split files should get created.
687687
int nbFiles = 0;
688-
final Map<String, Collection<StoreFileInfo>> files =
689-
new HashMap<String, Collection<StoreFileInfo>>(htd.getColumnFamilyCount());
688+
final Map<String, Pair<Collection<StoreFileInfo>, StoreFileTracker>> files =
689+
new HashMap<String, Pair<Collection<StoreFileInfo>, StoreFileTracker>>(
690+
htd.getColumnFamilyCount());
690691
for (ColumnFamilyDescriptor cfd : htd.getColumnFamilies()) {
691692
String family = cfd.getNameAsString();
692693
StoreFileTracker tracker =
@@ -709,7 +710,7 @@ private Pair<List<Path>, List<Path>> splitStoreFiles(final MasterProcedureEnv en
709710
}
710711
if (filteredSfis == null) {
711712
filteredSfis = new ArrayList<StoreFileInfo>(sfis.size());
712-
files.put(family, filteredSfis);
713+
files.put(family, new Pair(filteredSfis, tracker));
713714
}
714715
filteredSfis.add(sfi);
715716
nbFiles++;
@@ -732,10 +733,12 @@ private Pair<List<Path>, List<Path>> splitStoreFiles(final MasterProcedureEnv en
732733
final List<Future<Pair<Path, Path>>> futures = new ArrayList<Future<Pair<Path, Path>>>(nbFiles);
733734

734735
// Split each store file.
735-
for (Map.Entry<String, Collection<StoreFileInfo>> e : files.entrySet()) {
736+
for (Map.Entry<String, Pair<Collection<StoreFileInfo>, StoreFileTracker>> e : files
737+
.entrySet()) {
736738
byte[] familyName = Bytes.toBytes(e.getKey());
737739
final ColumnFamilyDescriptor hcd = htd.getColumnFamily(familyName);
738-
final Collection<StoreFileInfo> storeFiles = e.getValue();
740+
Pair<Collection<StoreFileInfo>, StoreFileTracker> storeFilesAndTracker = e.getValue();
741+
final Collection<StoreFileInfo> storeFiles = storeFilesAndTracker.getFirst();
739742
if (storeFiles != null && storeFiles.size() > 0) {
740743
final Configuration storeConfiguration =
741744
StoreUtils.createStoreConfiguration(env.getMasterConfiguration(), htd, hcd);
@@ -746,8 +749,9 @@ private Pair<List<Path>, List<Path>> splitStoreFiles(final MasterProcedureEnv en
746749
// is running in a regionserver's Store context, or we might not be able
747750
// to read the hfiles.
748751
storeFileInfo.setConf(storeConfiguration);
749-
StoreFileSplitter sfs = new StoreFileSplitter(regionFs, familyName,
750-
new HStoreFile(storeFileInfo, hcd.getBloomFilterType(), CacheConfig.DISABLED));
752+
StoreFileSplitter sfs =
753+
new StoreFileSplitter(regionFs, storeFilesAndTracker.getSecond(), familyName,
754+
new HStoreFile(storeFileInfo, hcd.getBloomFilterType(), CacheConfig.DISABLED));
751755
futures.add(threadPool.submit(sfs));
752756
}
753757
}
@@ -813,19 +817,19 @@ private void assertSplitResultFilesCount(final FileSystem fs,
813817
}
814818
}
815819

816-
private Pair<Path, Path> splitStoreFile(HRegionFileSystem regionFs, byte[] family, HStoreFile sf)
817-
throws IOException {
820+
private Pair<Path, Path> splitStoreFile(HRegionFileSystem regionFs, StoreFileTracker tracker,
821+
byte[] family, HStoreFile sf) throws IOException {
818822
if (LOG.isDebugEnabled()) {
819823
LOG.debug("pid=" + getProcId() + " splitting started for store file: " + sf.getPath()
820824
+ " for region: " + getParentRegion().getShortNameToLog());
821825
}
822826

823827
final byte[] splitRow = getSplitRow();
824828
final String familyName = Bytes.toString(family);
825-
final Path path_first =
826-
regionFs.splitStoreFile(this.daughterOneRI, familyName, sf, splitRow, false, splitPolicy);
827-
final Path path_second =
828-
regionFs.splitStoreFile(this.daughterTwoRI, familyName, sf, splitRow, true, splitPolicy);
829+
final Path path_first = regionFs.splitStoreFile(this.daughterOneRI, familyName, sf, splitRow,
830+
false, splitPolicy, tracker);
831+
final Path path_second = regionFs.splitStoreFile(this.daughterTwoRI, familyName, sf, splitRow,
832+
true, splitPolicy, tracker);
829833
if (LOG.isDebugEnabled()) {
830834
LOG.debug("pid=" + getProcId() + " splitting complete for store file: " + sf.getPath()
831835
+ " for region: " + getParentRegion().getShortNameToLog());
@@ -841,22 +845,25 @@ private class StoreFileSplitter implements Callable<Pair<Path, Path>> {
841845
private final HRegionFileSystem regionFs;
842846
private final byte[] family;
843847
private final HStoreFile sf;
848+
private final StoreFileTracker tracker;
844849

845850
/**
846851
* Constructor that takes what it needs to split
847852
* @param regionFs the file system
848853
* @param family Family that contains the store file
849854
* @param sf which file
850855
*/
851-
public StoreFileSplitter(HRegionFileSystem regionFs, byte[] family, HStoreFile sf) {
856+
public StoreFileSplitter(HRegionFileSystem regionFs, StoreFileTracker tracker, byte[] family,
857+
HStoreFile sf) {
852858
this.regionFs = regionFs;
853859
this.sf = sf;
854860
this.family = family;
861+
this.tracker = tracker;
855862
}
856863

857864
@Override
858865
public Pair<Path, Path> call() throws IOException {
859-
return splitStoreFile(regionFs, family, sf);
866+
return splitStoreFile(regionFs, tracker, family, sf);
860867
}
861868
}
862869

hbase-server/src/main/java/org/apache/hadoop/hbase/master/janitor/CatalogJanitor.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import org.apache.hadoop.hbase.MetaTableAccessor;
3636
import org.apache.hadoop.hbase.ScheduledChore;
3737
import org.apache.hadoop.hbase.TableName;
38+
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
39+
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
3840
import org.apache.hadoop.hbase.client.Connection;
3941
import org.apache.hadoop.hbase.client.ConnectionFactory;
4042
import org.apache.hadoop.hbase.client.Get;
@@ -50,6 +52,8 @@
5052
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
5153
import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
5254
import org.apache.hadoop.hbase.regionserver.HRegionFileSystem;
55+
import org.apache.hadoop.hbase.regionserver.storefiletracker.StoreFileTracker;
56+
import org.apache.hadoop.hbase.regionserver.storefiletracker.StoreFileTrackerFactory;
5357
import org.apache.hadoop.hbase.util.Bytes;
5458
import org.apache.hadoop.hbase.util.CommonFSUtils;
5559
import org.apache.hadoop.hbase.util.Pair;
@@ -422,7 +426,16 @@ private static Pair<Boolean, Boolean> checkRegionReferences(MasterServices servi
422426
try {
423427
HRegionFileSystem regionFs = HRegionFileSystem
424428
.openRegionFromFileSystem(services.getConfiguration(), fs, tabledir, region, true);
425-
boolean references = regionFs.hasReferences(tableDescriptor);
429+
ColumnFamilyDescriptor[] families = tableDescriptor.getColumnFamilies();
430+
boolean references = false;
431+
for (ColumnFamilyDescriptor cfd : families) {
432+
StoreFileTracker sft = StoreFileTrackerFactory.create(services.getConfiguration(),
433+
tableDescriptor, ColumnFamilyDescriptorBuilder.of(cfd.getNameAsString()), regionFs);
434+
references = references || sft.hasReferences();
435+
if (references) {
436+
break;
437+
}
438+
}
426439
return new Pair<>(Boolean.TRUE, references);
427440
} catch (IOException e) {
428441
LOG.error("Error trying to determine if region {} has references, assuming it does",

hbase-server/src/main/java/org/apache/hadoop/hbase/mob/CachedMobFile.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.hadoop.hbase.io.hfile.CacheConfig;
2626
import org.apache.hadoop.hbase.regionserver.BloomType;
2727
import org.apache.hadoop.hbase.regionserver.HStoreFile;
28+
import org.apache.hadoop.hbase.regionserver.storefiletracker.StoreFileTracker;
2829
import org.apache.yetus.audience.InterfaceAudience;
2930

3031
/**
@@ -41,10 +42,10 @@ public CachedMobFile(HStoreFile sf) {
4142
}
4243

4344
public static CachedMobFile create(FileSystem fs, Path path, Configuration conf,
44-
CacheConfig cacheConf) throws IOException {
45+
CacheConfig cacheConf, StoreFileTracker sft) throws IOException {
4546
// XXX: primaryReplica is only used for constructing the key of block cache so it is not a
4647
// critical problem if we pass the wrong value, so here we always pass true. Need to fix later.
47-
HStoreFile sf = new HStoreFile(fs, path, conf, cacheConf, BloomType.NONE, true);
48+
HStoreFile sf = new HStoreFile(fs, path, conf, cacheConf, BloomType.NONE, true, sft);
4849
return new CachedMobFile(sf);
4950
}
5051

hbase-server/src/main/java/org/apache/hadoop/hbase/mob/ExpiredMobFileCleaner.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,17 +56,17 @@ public class ExpiredMobFileCleaner extends Configured implements Tool {
5656
* @param tableName The current table name.
5757
* @param family The current family.
5858
*/
59-
public void cleanExpiredMobFiles(String tableName, ColumnFamilyDescriptor family)
59+
public void cleanExpiredMobFiles(TableDescriptor htd, ColumnFamilyDescriptor family)
6060
throws IOException {
6161
Configuration conf = getConf();
62-
TableName tn = TableName.valueOf(tableName);
62+
String tableName = htd.getTableName().getNameAsString();
6363
FileSystem fs = FileSystem.get(conf);
6464
LOG.info("Cleaning the expired MOB files of " + family.getNameAsString() + " in " + tableName);
6565
// disable the block cache.
6666
Configuration copyOfConf = new Configuration(conf);
6767
copyOfConf.setFloat(HConstants.HFILE_BLOCK_CACHE_SIZE_KEY, 0f);
6868
CacheConfig cacheConfig = new CacheConfig(copyOfConf);
69-
MobUtils.cleanExpiredMobFiles(fs, conf, tn, family, cacheConfig,
69+
MobUtils.cleanExpiredMobFiles(fs, conf, htd, family, cacheConfig,
7070
EnvironmentEdgeManager.currentTime());
7171
}
7272

@@ -105,7 +105,7 @@ public int run(String[] args) throws Exception {
105105
throw new IOException(
106106
"The minVersions of the column family is not 0, could not be handled by this cleaner");
107107
}
108-
cleanExpiredMobFiles(tableName, family);
108+
cleanExpiredMobFiles(htd, family);
109109
return 0;
110110
} finally {
111111
admin.close();

hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobFile.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.apache.hadoop.hbase.regionserver.BloomType;
3030
import org.apache.hadoop.hbase.regionserver.HStoreFile;
3131
import org.apache.hadoop.hbase.regionserver.StoreFileScanner;
32+
import org.apache.hadoop.hbase.regionserver.storefiletracker.StoreFileTracker;
3233
import org.apache.yetus.audience.InterfaceAudience;
3334

3435
/**
@@ -134,11 +135,11 @@ public void close() throws IOException {
134135
* @param cacheConf The CacheConfig.
135136
* @return An instance of the MobFile.
136137
*/
137-
public static MobFile create(FileSystem fs, Path path, Configuration conf, CacheConfig cacheConf)
138-
throws IOException {
138+
public static MobFile create(FileSystem fs, Path path, Configuration conf, CacheConfig cacheConf,
139+
StoreFileTracker sft) throws IOException {
139140
// XXX: primaryReplica is only used for constructing the key of block cache so it is not a
140141
// critical problem if we pass the wrong value, so here we always pass true. Need to fix later.
141-
HStoreFile sf = new HStoreFile(fs, path, conf, cacheConf, BloomType.NONE, true);
142+
HStoreFile sf = new HStoreFile(fs, path, conf, cacheConf, BloomType.NONE, true, sft);
142143
return new MobFile(sf);
143144
}
144145
}

hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobFileCache.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333
import org.apache.hadoop.fs.FileSystem;
3434
import org.apache.hadoop.fs.Path;
3535
import org.apache.hadoop.hbase.io.hfile.CacheConfig;
36+
import org.apache.hadoop.hbase.regionserver.StoreContext;
37+
import org.apache.hadoop.hbase.regionserver.storefiletracker.StoreFileTracker;
38+
import org.apache.hadoop.hbase.regionserver.storefiletracker.StoreFileTrackerFactory;
3639
import org.apache.hadoop.hbase.util.IdLock;
3740
import org.apache.yetus.audience.InterfaceAudience;
3841
import org.slf4j.Logger;
@@ -198,9 +201,11 @@ public void evictFile(String fileName) {
198201
* @param cacheConf The current MobCacheConfig
199202
* @return A opened mob file.
200203
*/
201-
public MobFile openFile(FileSystem fs, Path path, CacheConfig cacheConf) throws IOException {
204+
public MobFile openFile(FileSystem fs, Path path, CacheConfig cacheConf,
205+
StoreContext storeContext) throws IOException {
206+
StoreFileTracker sft = StoreFileTrackerFactory.create(conf, false, storeContext);
202207
if (!isCacheEnabled) {
203-
MobFile mobFile = MobFile.create(fs, path, conf, cacheConf);
208+
MobFile mobFile = MobFile.create(fs, path, conf, cacheConf, sft);
204209
mobFile.open();
205210
return mobFile;
206211
} else {
@@ -214,7 +219,7 @@ public MobFile openFile(FileSystem fs, Path path, CacheConfig cacheConf) throws
214219
if (map.size() > mobFileMaxCacheSize) {
215220
evict();
216221
}
217-
cached = CachedMobFile.create(fs, path, conf, cacheConf);
222+
cached = CachedMobFile.create(fs, path, conf, cacheConf, sft);
218223
cached.open();
219224
map.put(fileName, cached);
220225
miss.increment();

hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobFileCleanerChore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ protected void chore() {
8787
for (ColumnFamilyDescriptor hcd : htd.getColumnFamilies()) {
8888
if (hcd.isMobEnabled() && hcd.getMinVersions() == 0) {
8989
try {
90-
cleaner.cleanExpiredMobFiles(htd.getTableName().getNameAsString(), hcd);
90+
cleaner.cleanExpiredMobFiles(htd, hcd);
9191
} catch (IOException e) {
9292
LOG.error("Failed to clean the expired mob files table={} family={}",
9393
htd.getTableName().getNameAsString(), hcd.getNameAsString(), e);

0 commit comments

Comments
 (0)