Skip to content

Commit 15e8d8a

Browse files
wchevreuilApache9
authored andcommitted
HBASE-26326 CreateTableProcedure fails when FileBasedStoreFileTracker… (#3721)
Signed-off-by: Duo Zhang <zhangduo@apache.org> Signed-off-by: Josh Elser <elserj@apache.org>
1 parent d439884 commit 15e8d8a

File tree

8 files changed

+49
-30
lines changed

8 files changed

+49
-30
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import org.apache.hadoop.hbase.client.RegionInfo;
3333
import org.apache.hadoop.hbase.client.RegionReplicaUtil;
3434
import org.apache.hadoop.hbase.client.TableDescriptor;
35-
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
3635
import org.apache.hadoop.hbase.client.TableState;
3736
import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
3837
import org.apache.hadoop.hbase.master.MasterFileSystem;
@@ -270,9 +269,8 @@ private void preCreate(final MasterProcedureEnv env)
270269
(newRegions != null ? newRegions.size() : 0));
271270
}
272271

273-
TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableDescriptor);
274-
StoreFileTrackerFactory.persistTrackerConfig(env.getMasterConfiguration(), builder);
275-
tableDescriptor = builder.build();
272+
tableDescriptor = StoreFileTrackerFactory.updateWithTrackerConfigs(env.getMasterConfiguration(),
273+
tableDescriptor);
276274

277275
final MasterCoprocessorHost cpHost = env.getMasterCoprocessorHost();
278276
if (cpHost != null) {

hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/FileBasedStoreFileTracker.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,14 @@ class FileBasedStoreFileTracker extends StoreFileTrackerBase {
5656

5757
public FileBasedStoreFileTracker(Configuration conf, boolean isPrimaryReplica, StoreContext ctx) {
5858
super(conf, isPrimaryReplica, ctx);
59-
backedFile = new StoreFileListFile(ctx);
59+
//CreateTableProcedure needs to instantiate the configured SFT impl, in order to update table
60+
//descriptors with the SFT impl specific configs. By the time this happens, the table has no
61+
//regions nor stores yet, so it can't create a proper StoreContext.
62+
if (ctx != null) {
63+
backedFile = new StoreFileListFile(ctx);
64+
} else {
65+
backedFile = null;
66+
}
6067
}
6168

6269
@Override

hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/MigrationStoreFileTracker.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Collection;
2222
import java.util.List;
2323
import org.apache.hadoop.conf.Configuration;
24+
import org.apache.hadoop.hbase.client.TableDescriptor;
2425
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
2526
import org.apache.hadoop.hbase.procedure2.util.StringUtils;
2627
import org.apache.hadoop.hbase.regionserver.StoreContext;
@@ -88,17 +89,6 @@ void set(List<StoreFileInfo> files) {
8889
"Should not call this method on " + getClass().getSimpleName());
8990
}
9091

91-
@Override
92-
public void persistConfiguration(TableDescriptorBuilder builder) {
93-
super.persistConfiguration(builder);
94-
if (StringUtils.isEmpty(builder.getValue(SRC_IMPL))) {
95-
builder.setValue(SRC_IMPL, src.getTrackerName());
96-
}
97-
if (StringUtils.isEmpty(builder.getValue(DST_IMPL))) {
98-
builder.setValue(DST_IMPL, dst.getTrackerName());
99-
}
100-
}
101-
10292
static Class<? extends StoreFileTracker> getSrcTrackerClass(Configuration conf) {
10393
return StoreFileTrackerFactory.getStoreFileTrackerClassForMigration(conf, SRC_IMPL);
10494
}

hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/StoreFileTracker.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Collection;
2222
import java.util.List;
2323

24+
import org.apache.hadoop.hbase.client.TableDescriptor;
2425
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
2526
import org.apache.hadoop.hbase.regionserver.CreateStoreFileWriterParams;
2627
import org.apache.hadoop.hbase.regionserver.StoreFileInfo;
@@ -75,13 +76,13 @@ void replace(Collection<StoreFileInfo> compactedFiles, Collection<StoreFileInfo>
7576
StoreFileWriter createWriter(CreateStoreFileWriterParams params) throws IOException;
7677

7778
/**
78-
* Saves StoreFileTracker implementations specific configurations into the table descriptors.
79+
* Adds StoreFileTracker implementations specific configurations into the table descriptor.
7980
* <p/>
8081
* This is used to avoid accidentally data loss when changing the cluster level store file tracker
8182
* implementation, and also possible misconfiguration between master and region servers.
8283
* <p/>
8384
* See HBASE-26246 for more details.
8485
* @param builder The table descriptor builder for the given table.
8586
*/
86-
void persistConfiguration(TableDescriptorBuilder builder);
87+
TableDescriptorBuilder updateWithTrackerConfigs(TableDescriptorBuilder builder);
8788
}

hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/StoreFileTrackerBase.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@
2525
import org.apache.hadoop.conf.Configuration;
2626
import org.apache.hadoop.fs.Path;
2727
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
28+
import org.apache.hadoop.hbase.client.TableDescriptor;
2829
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
2930
import org.apache.hadoop.hbase.io.compress.Compression;
3031
import org.apache.hadoop.hbase.io.crypto.Encryption;
3132
import org.apache.hadoop.hbase.io.hfile.CacheConfig;
3233
import org.apache.hadoop.hbase.io.hfile.HFile;
3334
import org.apache.hadoop.hbase.io.hfile.HFileContext;
3435
import org.apache.hadoop.hbase.io.hfile.HFileContextBuilder;
35-
import org.apache.hadoop.hbase.procedure2.util.StringUtils;
3636
import org.apache.hadoop.hbase.regionserver.CreateStoreFileWriterParams;
3737
import org.apache.hadoop.hbase.regionserver.StoreContext;
3838
import org.apache.hadoop.hbase.regionserver.StoreFileInfo;
@@ -83,10 +83,9 @@ public final void replace(Collection<StoreFileInfo> compactedFiles,
8383
}
8484

8585
@Override
86-
public void persistConfiguration(TableDescriptorBuilder builder) {
87-
if (StringUtils.isEmpty(builder.getValue(TRACKER_IMPL))) {
88-
builder.setValue(TRACKER_IMPL, getTrackerName());
89-
}
86+
public TableDescriptorBuilder updateWithTrackerConfigs(TableDescriptorBuilder builder) {
87+
builder.setValue(TRACKER_IMPL, getTrackerName());
88+
return builder;
9089
}
9190

9291
protected final String getTrackerName() {

hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/storefiletracker/StoreFileTrackerFactory.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@
2424
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
2525
import org.apache.hadoop.hbase.client.TableDescriptor;
2626
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
27+
import org.apache.hadoop.hbase.procedure2.util.StringUtils;
2728
import org.apache.hadoop.hbase.regionserver.HRegionFileSystem;
2829
import org.apache.hadoop.hbase.regionserver.StoreContext;
30+
2931
import org.apache.hadoop.hbase.regionserver.StoreUtils;
3032
import org.apache.hadoop.hbase.util.ReflectionUtils;
3133
import org.apache.yetus.audience.InterfaceAudience;
@@ -158,12 +160,18 @@ static StoreFileTrackerBase createForMigration(Configuration conf, String config
158160
return ReflectionUtils.newInstance(tracker, conf, isPrimaryReplica, ctx);
159161
}
160162

161-
public static void persistTrackerConfig(Configuration conf, TableDescriptorBuilder builder) {
162-
TableDescriptor tableDescriptor = builder.build();
163-
ColumnFamilyDescriptor cfDesc = tableDescriptor.getColumnFamilies()[0];
164-
StoreContext context = StoreContext.getBuilder().withColumnFamilyDescriptor(cfDesc).build();
165-
StoreFileTracker tracker = StoreFileTrackerFactory.create(conf, true, context);
166-
tracker.persistConfiguration(builder);
163+
public static TableDescriptor updateWithTrackerConfigs(Configuration conf,
164+
TableDescriptor descriptor) {
165+
//CreateTableProcedure needs to instantiate the configured SFT impl, in order to update table
166+
//descriptors with the SFT impl specific configs. By the time this happens, the table has no
167+
//regions nor stores yet, so it can't create a proper StoreContext.
168+
if (StringUtils.isEmpty(descriptor.getValue(TRACKER_IMPL))) {
169+
StoreFileTracker tracker =
170+
StoreFileTrackerFactory.create(conf, true, null);
171+
TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(descriptor);
172+
return tracker.updateWithTrackerConfigs(builder).build();
173+
}
174+
return descriptor;
167175
}
168176

169177
// should not use MigrationStoreFileTracker for new family

hbase-server/src/test/java/org/apache/hadoop/hbase/master/procedure/TestCreateTableProcedure.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.apache.hadoop.hbase.procedure2.Procedure;
4040
import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
4141
import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility;
42+
import org.apache.hadoop.hbase.regionserver.storefiletracker.StoreFileTrackerFactory;
4243
import org.apache.hadoop.hbase.regionserver.storefiletracker.TestStoreFileTracker;
4344
import org.apache.hadoop.hbase.testclassification.MasterTests;
4445
import org.apache.hadoop.hbase.testclassification.MediumTests;
@@ -105,6 +106,21 @@ public void testCreateWithTrackImpl() throws Exception {
105106
assertEquals(trackerName, htd.getValue(TRACKER_IMPL));
106107
}
107108

109+
@Test
110+
public void testCreateWithFileBasedStoreTrackerImpl() throws Exception {
111+
ProcedureExecutor<MasterProcedureEnv> procExec = getMasterProcedureExecutor();
112+
procExec.getEnvironment().getMasterConfiguration().set(StoreFileTrackerFactory.TRACKER_IMPL,
113+
StoreFileTrackerFactory.Trackers.FILE.name());
114+
final TableName tableName = TableName.valueOf(name.getMethodName());
115+
TableDescriptor htd = MasterProcedureTestingUtility.createHTD(tableName, F1);
116+
RegionInfo[] regions = ModifyRegionUtils.createRegionInfos(htd, null);
117+
long procId = ProcedureTestingUtility.submitAndWait(procExec,
118+
new CreateTableProcedure(procExec.getEnvironment(), htd, regions));
119+
ProcedureTestingUtility.assertProcNotFailed(procExec.getResult(procId));
120+
htd = getMaster().getTableDescriptors().get(tableName);
121+
assertEquals(StoreFileTrackerFactory.Trackers.FILE.name(), htd.getValue(TRACKER_IMPL));
122+
}
123+
108124
@Test
109125
public void testCreateWithoutColumnFamily() throws Exception {
110126
final ProcedureExecutor<MasterProcedureEnv> procExec = getMasterProcedureExecutor();

hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/storefiletracker/TestStoreFileTracker.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public class TestStoreFileTracker extends DefaultStoreFileTracker {
4040

4141
public TestStoreFileTracker(Configuration conf, boolean isPrimaryReplica, StoreContext ctx) {
4242
super(conf, isPrimaryReplica, ctx);
43-
if (ctx.getRegionFileSystem() != null) {
43+
if (ctx != null && ctx.getRegionFileSystem() != null) {
4444
this.storeId = ctx.getRegionInfo().getEncodedName() + "-" + ctx.getFamily().getNameAsString();
4545
LOG.info("created storeId: {}", storeId);
4646
trackedFiles.computeIfAbsent(storeId, v -> new ArrayList<>());

0 commit comments

Comments
 (0)