Skip to content

Commit c9bcd87

Browse files
authored
HBASE-26654 ModifyTableDescriptorProcedure shoud load TableDescriptor while executing (#4034)
Signed-off-by: GeorryHuang <huangzhuoyue@apache.org>
1 parent bc5a5af commit c9bcd87

File tree

6 files changed

+32
-14
lines changed

6 files changed

+32
-14
lines changed

hbase-protocol-shaded/src/main/protobuf/server/master/MasterProcedure.proto

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,6 @@ enum ModifyTableDescriptorState {
655655
}
656656

657657
message ModifyTableDescriptorStateData {
658-
required TableSchema unmodified_table_schema = 1;
658+
required TableName table_name = 1;
659659
optional TableSchema modified_table_schema = 2;
660660
}

hbase-server/src/main/java/org/apache/hadoop/hbase/master/migrate/RollingUpgradeChore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ private boolean isCompletelyMigrateSFT(int concurrentCount){
121121
for (Map.Entry<String, TableDescriptor> entry : migrateSFTTables.entrySet()) {
122122
TableDescriptor tableDescriptor = entry.getValue();
123123
InitializeStoreFileTrackerProcedure proc = new InitializeStoreFileTrackerProcedure(
124-
procedureExecutor.getEnvironment(), tableDescriptor);
124+
procedureExecutor.getEnvironment(), tableDescriptor.getTableName());
125125
procedureExecutor.submitProcedure(proc);
126126
processingProcs.add(proc);
127127
}

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

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.apache.hadoop.hbase.master.procedure;
1919

2020
import java.io.IOException;
21+
import java.util.Objects;
2122
import java.util.Optional;
2223
import org.apache.hadoop.hbase.TableName;
2324
import org.apache.hadoop.hbase.client.TableDescriptor;
@@ -44,20 +45,21 @@ public abstract class ModifyTableDescriptorProcedure
4445

4546
private static final Logger LOG = LoggerFactory.getLogger(ModifyTableDescriptorProcedure.class);
4647

47-
private TableDescriptor unmodifiedTableDescriptor;
48+
private TableName tableName;
49+
4850
private TableDescriptor modifiedTableDescriptor;
4951

5052
protected ModifyTableDescriptorProcedure() {
5153
}
5254

53-
protected ModifyTableDescriptorProcedure(MasterProcedureEnv env, TableDescriptor unmodified) {
55+
protected ModifyTableDescriptorProcedure(MasterProcedureEnv env, TableName tableName) {
5456
super(env);
55-
this.unmodifiedTableDescriptor = unmodified;
57+
this.tableName = Objects.requireNonNull(tableName);
5658
}
5759

5860
@Override
5961
public TableName getTableName() {
60-
return unmodifiedTableDescriptor.getTableName();
62+
return tableName;
6163
}
6264

6365
@Override
@@ -82,7 +84,12 @@ protected Flow executeFromState(MasterProcedureEnv env, ModifyTableDescriptorSta
8284
try {
8385
switch (state) {
8486
case MODIFY_TABLE_DESCRIPTOR_PREPARE:
85-
Optional<TableDescriptor> modified = modify(env, unmodifiedTableDescriptor);
87+
TableDescriptor current = env.getMasterServices().getTableDescriptors().get(tableName);
88+
if (current == null) {
89+
LOG.info("Table {} does not exist, skip modifying", tableName);
90+
return Flow.NO_MORE_STATE;
91+
}
92+
Optional<TableDescriptor> modified = modify(env, current);
8693
if (modified.isPresent()) {
8794
modifiedTableDescriptor = modified.get();
8895
setNextState(ModifyTableDescriptorState.MODIFY_TABLE_DESCRIPTOR_UPDATE);
@@ -108,6 +115,15 @@ protected Flow executeFromState(MasterProcedureEnv env, ModifyTableDescriptorSta
108115
return Flow.HAS_MORE_STATE;
109116
}
110117

118+
@Override
119+
protected boolean holdLock(MasterProcedureEnv env) {
120+
// here we want to make sure that our modification result will not be overwrite by other MTPs,
121+
// so we set holdLock to true. Since we do not need to schedule any sub procedures, especially
122+
// no remote procedures, so it is OK for us a hold the lock all the time, it will not hurt the
123+
// availability too much.
124+
return true;
125+
}
126+
111127
@Override
112128
protected void rollbackState(MasterProcedureEnv env, ModifyTableDescriptorState state)
113129
throws IOException, InterruptedException {
@@ -141,7 +157,7 @@ protected ModifyTableDescriptorState getInitialState() {
141157
protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {
142158
super.serializeStateData(serializer);
143159
ModifyTableDescriptorStateData.Builder builder = ModifyTableDescriptorStateData.newBuilder()
144-
.setUnmodifiedTableSchema(ProtobufUtil.toTableSchema(unmodifiedTableDescriptor));
160+
.setTableName(ProtobufUtil.toProtoTableName(tableName));
145161
if (modifiedTableDescriptor != null) {
146162
builder.setModifiedTableSchema(ProtobufUtil.toTableSchema(modifiedTableDescriptor));
147163
}
@@ -153,7 +169,7 @@ protected void deserializeStateData(ProcedureStateSerializer serializer) throws
153169
super.deserializeStateData(serializer);
154170
ModifyTableDescriptorStateData data =
155171
serializer.deserialize(ModifyTableDescriptorStateData.class);
156-
unmodifiedTableDescriptor = ProtobufUtil.toTableDescriptor(data.getUnmodifiedTableSchema());
172+
tableName = ProtobufUtil.toTableName(data.getTableName());
157173
if (data.hasModifiedTableSchema()) {
158174
modifiedTableDescriptor = ProtobufUtil.toTableDescriptor(data.getModifiedTableSchema());
159175
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.apache.hadoop.hbase.regionserver.storefiletracker;
1919

2020
import java.util.Optional;
21+
import org.apache.hadoop.hbase.TableName;
2122
import org.apache.hadoop.hbase.client.TableDescriptor;
2223
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
2324
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
@@ -33,8 +34,8 @@ public class InitializeStoreFileTrackerProcedure extends ModifyTableDescriptorPr
3334

3435
public InitializeStoreFileTrackerProcedure(){}
3536

36-
public InitializeStoreFileTrackerProcedure(MasterProcedureEnv env, TableDescriptor unmodified) {
37-
super(env, unmodified);
37+
public InitializeStoreFileTrackerProcedure(MasterProcedureEnv env, TableName tableName) {
38+
super(env, tableName);
3839
}
3940

4041
@Override

hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/MigrateRSGroupProcedure.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import java.io.IOException;
2121
import java.util.Optional;
22+
import org.apache.hadoop.hbase.TableName;
2223
import org.apache.hadoop.hbase.client.TableDescriptor;
2324
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
2425
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
@@ -38,8 +39,8 @@ public class MigrateRSGroupProcedure extends ModifyTableDescriptorProcedure {
3839
public MigrateRSGroupProcedure() {
3940
}
4041

41-
public MigrateRSGroupProcedure(MasterProcedureEnv env, TableDescriptor unmodified) {
42-
super(env, unmodified);
42+
public MigrateRSGroupProcedure(MasterProcedureEnv env, TableName tableName) {
43+
super(env, tableName);
4344
}
4445

4546
@Override

hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupInfoManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ private void migrate(Collection<RSGroupInfo> groupList) {
528528
// master first and then region server, so after all the region servers has been reopened,
529529
// the new TableDescriptor will be loaded.
530530
MigrateRSGroupProcedure proc =
531-
new MigrateRSGroupProcedure(procExec.getEnvironment(), oldTd);
531+
new MigrateRSGroupProcedure(procExec.getEnvironment(), tableName);
532532
procExec.submitProcedure(proc);
533533
procs.add(proc);
534534
}

0 commit comments

Comments
 (0)