@@ -112,38 +112,17 @@ protected Flow executeFromState(
112112 deleteDatabaseSchema .getName ());
113113
114114 // Submit RegionDeleteTasks
115- OfferRegionMaintainTasksPlan dataRegionDeleteTaskOfferPlan =
116- new OfferRegionMaintainTasksPlan ();
117115 List <TRegionReplicaSet > regionReplicaSets =
118116 env .getAllReplicaSets (deleteDatabaseSchema .getName ());
119- List <TRegionReplicaSet > schemaRegionReplicaSets = new ArrayList <>();
117+ OfferRegionMaintainTasksPlan regionDeleteTaskOfferPlan =
118+ buildDataRegionDeleteTaskOfferPlan (regionReplicaSets );
119+ List <TRegionReplicaSet > schemaRegionReplicaSets =
120+ getSchemaRegionReplicaSets (regionReplicaSets );
120121 regionReplicaSets .forEach (
121- regionReplicaSet -> {
122- // Clear heartbeat cache along the way
123- env .getConfigManager ()
124- .getLoadManager ()
125- .removeRegionGroupRelatedCache (regionReplicaSet .getRegionId ());
126-
127- if (regionReplicaSet
128- .getRegionId ()
129- .getType ()
130- .equals (TConsensusGroupType .SchemaRegion )) {
131- schemaRegionReplicaSets .add (regionReplicaSet );
132- } else {
133- regionReplicaSet
134- .getDataNodeLocations ()
135- .forEach (
136- targetDataNode ->
137- dataRegionDeleteTaskOfferPlan .appendRegionMaintainTask (
138- new RegionDeleteTask (
139- targetDataNode , regionReplicaSet .getRegionId ())));
140- }
141- });
142-
143- if (!dataRegionDeleteTaskOfferPlan .getRegionMaintainTaskList ().isEmpty ()) {
144- // submit async data region delete task
145- env .getConfigManager ().getConsensusManager ().write (dataRegionDeleteTaskOfferPlan );
146- }
122+ regionReplicaSet ->
123+ env .getConfigManager ()
124+ .getLoadManager ()
125+ .removeRegionGroupRelatedCache (regionReplicaSet .getRegionId ()));
147126
148127 // try sync delete schemaengine region
149128 DataNodeAsyncRequestContext <TConsensusGroupId , TSStatus > asyncClientHandler =
@@ -166,7 +145,7 @@ protected Flow executeFromState(
166145 .sendAsyncRequestWithRetry (asyncClientHandler );
167146 for (Map .Entry <Integer , TSStatus > entry :
168147 asyncClientHandler .getResponseMap ().entrySet ()) {
169- if (entry .getValue (). getCode () == TSStatusCode . SUCCESS_STATUS . getStatusCode ( )) {
148+ if (isRegionDeleteCompleted ( entry .getValue ())) {
170149 LOG .info (
171150 "[DeleteDatabaseProcedure] Successfully delete SchemaRegion[{}] on {}" ,
172151 asyncClientHandler .getRequest (entry .getKey ()),
@@ -181,16 +160,17 @@ protected Flow executeFromState(
181160 }
182161
183162 if (!schemaRegionDeleteTaskMap .isEmpty ()) {
184- // submit async schemaengine region delete task for failed sync execution
185- OfferRegionMaintainTasksPlan schemaRegionDeleteTaskOfferPlan =
186- new OfferRegionMaintainTasksPlan ();
187- schemaRegionDeleteTaskMap
188- .values ()
189- .forEach (schemaRegionDeleteTaskOfferPlan ::appendRegionMaintainTask );
190- env .getConfigManager ().getConsensusManager ().write (schemaRegionDeleteTaskOfferPlan );
163+ // submit async schemaengine region delete tasks for failed sync executions
164+ appendFailedSchemaRegionDeleteTasks (
165+ regionDeleteTaskOfferPlan , schemaRegionDeleteTaskMap );
191166 }
192167 }
193168
169+ if (!offerRegionDeleteTasks (env , regionDeleteTaskOfferPlan )) {
170+ setNextState (DeleteStorageGroupState .DELETE_DATABASE_SCHEMA );
171+ return Flow .HAS_MORE_STATE ;
172+ }
173+
194174 env .getConfigManager ()
195175 .getLoadManager ()
196176 .clearDataPartitionPolicyTable (deleteDatabaseSchema .getName ());
@@ -212,6 +192,8 @@ protected Flow executeFromState(
212192 } else if (getCycles () > RETRY_THRESHOLD ) {
213193 setFailure (
214194 new ProcedureException ("[DeleteDatabaseProcedure] Delete DatabaseSchema failed" ));
195+ } else {
196+ setNextState (DeleteStorageGroupState .DELETE_DATABASE_SCHEMA );
215197 }
216198 }
217199 } catch (ConsensusException | TException | IOException e ) {
@@ -230,12 +212,67 @@ protected Flow executeFromState(
230212 e );
231213 if (getCycles () > RETRY_THRESHOLD ) {
232214 setFailure (new ProcedureException ("[DeleteDatabaseProcedure] State stuck at " + state ));
215+ } else {
216+ setNextState (state );
233217 }
234218 }
235219 }
236220 return Flow .HAS_MORE_STATE ;
237221 }
238222
223+ static boolean isRegionDeleteCompleted (TSStatus status ) {
224+ return status .getCode () == TSStatusCode .SUCCESS_STATUS .getStatusCode ()
225+ || status .getCode () == TSStatusCode .REGION_NOT_EXIST .getStatusCode ();
226+ }
227+
228+ static OfferRegionMaintainTasksPlan buildDataRegionDeleteTaskOfferPlan (
229+ List <TRegionReplicaSet > regionReplicaSets ) {
230+ OfferRegionMaintainTasksPlan offerPlan = new OfferRegionMaintainTasksPlan ();
231+ regionReplicaSets .stream ()
232+ .filter (
233+ regionReplicaSet ->
234+ regionReplicaSet .getRegionId ().getType () == TConsensusGroupType .DataRegion )
235+ .forEach (
236+ regionReplicaSet ->
237+ regionReplicaSet
238+ .getDataNodeLocations ()
239+ .forEach (
240+ targetDataNode ->
241+ offerPlan .appendRegionMaintainTask (
242+ new RegionDeleteTask (
243+ targetDataNode , regionReplicaSet .getRegionId ()))));
244+ return offerPlan ;
245+ }
246+
247+ private static List <TRegionReplicaSet > getSchemaRegionReplicaSets (
248+ List <TRegionReplicaSet > regionReplicaSets ) {
249+ List <TRegionReplicaSet > schemaRegionReplicaSets = new ArrayList <>();
250+ regionReplicaSets .stream ()
251+ .filter (
252+ regionReplicaSet ->
253+ regionReplicaSet .getRegionId ().getType () == TConsensusGroupType .SchemaRegion )
254+ .forEach (schemaRegionReplicaSets ::add );
255+ return schemaRegionReplicaSets ;
256+ }
257+
258+ static void appendFailedSchemaRegionDeleteTasks (
259+ OfferRegionMaintainTasksPlan offerPlan ,
260+ Map <Integer , RegionDeleteTask > failedSchemaRegionDeleteTasks ) {
261+ failedSchemaRegionDeleteTasks .values ().forEach (offerPlan ::appendRegionMaintainTask );
262+ }
263+
264+ private boolean offerRegionDeleteTasks (
265+ ConfigNodeProcedureEnv env , OfferRegionMaintainTasksPlan offerPlan )
266+ throws ConsensusException {
267+ return offerPlan .getRegionMaintainTaskList ().isEmpty ()
268+ || isRegionDeleteTaskOfferSuccessful (
269+ env .getConfigManager ().getConsensusManager ().write (offerPlan ));
270+ }
271+
272+ static boolean isRegionDeleteTaskOfferSuccessful (TSStatus status ) {
273+ return status .getCode () == TSStatusCode .SUCCESS_STATUS .getStatusCode ();
274+ }
275+
239276 @ Override
240277 protected void rollbackState (ConfigNodeProcedureEnv env , DeleteStorageGroupState state )
241278 throws IOException , InterruptedException {
0 commit comments