1818package org .apache .hadoop .hbase .master .procedure ;
1919
2020import java .io .IOException ;
21+ import java .util .Objects ;
2122import java .util .Optional ;
2223import org .apache .hadoop .hbase .TableName ;
2324import 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 }
0 commit comments