Skip to content

Commit 9dbcd93

Browse files
committed
[fix][dingo-exec] Interrupt with infinite regionSplit exception
1 parent df6ab2f commit 9dbcd93

File tree

5 files changed

+55
-51
lines changed

5 files changed

+55
-51
lines changed

dingo-calcite/src/main/java/io/dingodb/calcite/executor/ShowIndexFromTableExecutor.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.dingodb.common.meta.SchemaState;
2222
import io.dingodb.meta.DdlService;
2323
import io.dingodb.meta.entity.Column;
24+
import io.dingodb.meta.entity.IndexTable;
2425
import io.dingodb.meta.entity.InfoSchema;
2526
import io.dingodb.meta.entity.Table;
2627

@@ -95,7 +96,11 @@ public Object[] getIndexCol(Table index, String columnName, int seqIndex, boolea
9596
Object[] val = new Object[16];
9697
val[0] = tableName;
9798
val[1] = unique ? "1" : "0";
98-
val[2] = index.getName();
99+
if (index instanceof IndexTable) {
100+
val[2] = index.getName();
101+
} else {
102+
val[2] = "PRIMARY";
103+
}
99104
val[3] = seqIndex;
100105
val[4] = columnName;
101106
val[5] = 'A';

dingo-exec/src/main/java/io/dingodb/exec/operator/NewCalcDistributionOperator.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717
package io.dingodb.exec.operator;
1818

1919
import io.dingodb.common.concurrent.Executors;
20+
import io.dingodb.common.config.DingoConfiguration;
2021
import io.dingodb.common.log.LogUtils;
2122
import io.dingodb.common.partition.RangeDistribution;
2223
import io.dingodb.common.util.ByteArrayUtils;
24+
import io.dingodb.common.util.Optional;
2325
import io.dingodb.common.util.RangeUtils;
2426
import io.dingodb.common.util.Utils;
2527
import io.dingodb.exec.dag.Vertex;
@@ -157,13 +159,30 @@ private static CompletableFuture<Boolean> push(
157159
copyContext.setDistribution(distribution);
158160
return vertex.getSoleEdge().transformToNext(copyContext, null);
159161
};
162+
Integer maxRetry = Optional.mapOrGet(DingoConfiguration.instance()
163+
.find("retry", int.class), __ -> __, () -> 30);
160164
return CompletableFuture.supplyAsync(
161165
supplier, Executors.executor(
162166
"operator-" + vertex.getTask().getJobId() + "-"
163167
+ vertex.getTask().getId() + "-" + vertex.getId() + "-" + distribution.getId()))
164168
.exceptionally(ex -> {
165169
if (ex != null) {
166170
if (ex.getCause() instanceof RegionSplitException) {
171+
int retry;
172+
if (param.getSplitRetry().containsKey(distribution.getId())) {
173+
int retryCnt = param.getSplitRetry().get(distribution.getId());
174+
retry = retryCnt + 1;
175+
} else {
176+
retry = 1;
177+
}
178+
if (retry > 10) {
179+
MetaService.root().invalidateDistribution(param.getTd().getTableId());
180+
}
181+
if (retry > maxRetry) {
182+
LogUtils.error(log, ex.getMessage(), ex);
183+
throw new RuntimeException("The number of split retries exceeds the maximum limit");
184+
}
185+
param.getSplitRetry().put(distribution.getId(), retry);
167186
NavigableMap<ByteArrayUtils.ComparableByteArray, RangeDistribution> tmpDistribution =
168187
MetaService.root().getRangeDistribution(param.getTd().getTableId());
169188
DistributionSourceParam copyParam = param.copy(

dingo-exec/src/main/java/io/dingodb/exec/operator/params/DistributionSourceParam.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.fasterxml.jackson.annotation.JsonProperty;
2020
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
2121
import com.fasterxml.jackson.annotation.JsonTypeName;
22+
import io.dingodb.common.CommonId;
2223
import io.dingodb.common.partition.RangeDistribution;
2324
import io.dingodb.common.util.ByteArrayUtils;
2425
import io.dingodb.common.util.Optional;
@@ -30,7 +31,9 @@
3031
import lombok.Getter;
3132
import lombok.Setter;
3233

34+
import java.util.Map;
3335
import java.util.NavigableMap;
36+
import java.util.concurrent.ConcurrentHashMap;
3437

3538
@Getter
3639
@JsonTypeName("distributionSource")
@@ -62,6 +65,8 @@ public class DistributionSourceParam extends SourceParam {
6265
private int keepOrder;
6366
@JsonProperty("concurrencyLevel")
6467
private final int concurrencyLevel;
68+
@Setter
69+
private Map<CommonId, Integer> splitRetry = new ConcurrentHashMap<>();
6570

6671
public DistributionSourceParam(
6772
Table td,

dingo-executor/src/main/java/io/dingodb/server/executor/ddl/JobTableUtil.java

Lines changed: 23 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,12 @@
4242
@Slf4j
4343
public final class JobTableUtil {
4444
private static final String updateDDLJobSQL = "update mysql.dingo_ddl_job set job_meta = '%s' where job_id = %d";
45-
private static final String getJobSQL = "select job_meta, processing, job_id from mysql.dingo_ddl_job where job_id in (select min(job_id) from mysql.dingo_ddl_job group by schema_ids, table_ids, processing) and %s reorg %s order by processing desc, job_id";
46-
private static final String getJobsSQL = "select job_meta, processing, job_id, table_ids from mysql.dingo_ddl_job where job_id in (select min(job_id) from mysql.dingo_ddl_job group by schema_ids, table_ids) %s order by processing desc, job_id";
45+
private static final String getJobSQL = "select job_meta, processing, job_id from mysql.dingo_ddl_job where "
46+
+ "job_id in (select min(job_id) from mysql.dingo_ddl_job group by schema_ids, table_ids, processing) "
47+
+ "and %s reorg %s order by processing desc, job_id";
48+
private static final String getJobsSQL = "select job_meta, processing, job_id, table_ids from mysql.dingo_ddl_job"
49+
+ " where job_id in (select min(job_id) from mysql.dingo_ddl_job group by schema_ids, table_ids) %s "
50+
+ "order by processing desc, job_id";
4751
private static final ObjectMapper objectMapper = new ObjectMapper();
4852
private static final int general = 0;
4953
private static final int reorg = 1;
@@ -78,9 +82,18 @@ public static String deleteDDLJob(Session session, DdlJob job) {
7882

7983
public static String addHistoryDDLJob2Table(Session session, DdlJob job, boolean updateRawArgs) {
8084
String time = DateTimeUtils.dateFormat(new Date(System.currentTimeMillis()), "yyyy-MM-dd HH:mm:ss");
81-
String sql = "insert into mysql.dingo_ddl_history(job_id, job_meta, schema_name, table_name, schema_ids, table_ids, create_time) values (%d, %s, %s, %s, %s, %s, %s)";
82-
sql = String.format(sql, job.getId(), Utils.quoteForSql(""), Utils.quoteForSql(job.getSchemaName()), Utils.quoteForSql(job.getTableName()), Utils.quoteForSql(job.getSchemaId()), Utils.quoteForSql(job.getTableId()), Utils.quoteForSql(time));
83-
session.executeUpdate(sql);
85+
String sql = "insert into mysql.dingo_ddl_history(job_id, job_meta, schema_name, table_name, schema_ids, "
86+
+ "table_ids, create_time) values (%d, %s, %s, %s, %s, %s, %s)";
87+
try {
88+
byte[] meta = job.encode(updateRawArgs);
89+
String jobMeta = new String(meta);
90+
sql = String.format(sql, job.getId(), Utils.quoteForSql(jobMeta), Utils.quoteForSql(job.getSchemaName()),
91+
Utils.quoteForSql(job.getTableName()), Utils.quoteForSql(job.getSchemaId()),
92+
Utils.quoteForSql(job.getTableId()), Utils.quoteForSql(time));
93+
session.executeUpdate(sql);
94+
} catch (Exception e) {
95+
LogUtils.error(log, e.getMessage(), e);
96+
}
8497
return null;
8598
}
8699

@@ -104,39 +117,17 @@ public static void cleanMDLInfo(long jobId) {
104117
DingoMetrics.timer("delMdlKeyEtcd").update(sub, TimeUnit.MILLISECONDS);
105118
}
106119

107-
public static Pair<DdlJob, String> getGenerateJob(Session session) {
108-
try {
109-
return getJob(session, general, job1 -> {
110-
if (job1.getActionType() == ActionType.ActionDropSchema) {
111-
String sql = "select job_id from mysql.dingo_ddl_job where schema_ids = %s and processing limit 1";
112-
sql = String.format(sql, Utils.quoteForSql(job1.getSchemaId()));
113-
return checkJobIsRunnable(session, sql);
114-
}
115-
String sql = "select job_id from mysql.dingo_ddl_job t1, (select table_ids from mysql.dingo_ddl_job where job_id = %d) t2 where " +
116-
" processing and t2.table_ids = t1.table_ids";
117-
sql = String.format(sql, job1.getId());
118-
return checkJobIsRunnable(session, sql);
119-
});
120-
} catch (Exception e) {
121-
LogUtils.error(log, e.getMessage(), e);
122-
return Pair.of(null, e.getMessage());
123-
}
124-
}
125-
126120
public static Pair<List<DdlJob>, String> getGenerateJobs(Session session) {
127121
try {
128122
return getJobs(session, general, job1 -> {
129123
Session session1 = SessionUtil.INSTANCE.getSession();
130124
try {
131125
if (job1.getActionType() == ActionType.ActionDropSchema) {
132-
String sql = "select job_id from mysql.dingo_ddl_job where schema_ids = %s and processing limit 1";
126+
String sql = "select job_id from mysql.dingo_ddl_job where schema_ids = %s " +
127+
"and processing limit 1";
133128
sql = String.format(sql, Utils.quoteForSql(job1.getSchemaId()));
134129
return checkJobIsRunnable(session1, sql);
135130
}
136-
// String sql = "select job_id from mysql.dingo_ddl_job t1, (select table_ids from mysql.dingo_ddl_job where job_id = %d) t2 where " +
137-
// " processing and t2.table_ids = t1.table_ids";
138-
// sql = String.format(sql, job1.getId());
139-
// return checkJobIsRunnable(session1, sql);
140131
return Pair.of(false, null);
141132
} finally {
142133
SessionUtil.INSTANCE.closeSession(session1);
@@ -205,7 +196,9 @@ public static Pair<List<DdlJob>, String> getJobs(
205196
return Pair.of(ddlJobList, null);
206197
}
207198

208-
public static Pair<DdlJob, String> getJob(Session session, int jobType, Function<DdlJob, Pair<Boolean, String>> filter) {
199+
public static Pair<DdlJob, String> getJob(
200+
Session session, int jobType, Function<DdlJob, Pair<Boolean, String>> filter
201+
) {
209202
String not = "not";
210203
if (jobType == 1) {
211204
not = "";
@@ -285,25 +278,6 @@ public static String markJobProcessing(Session session, String sql, int retry) {
285278
}
286279
}
287280

288-
public static Pair<DdlJob, String> getReorgJob(Session session) {
289-
try {
290-
Timer.Context timeCtx = DingoMetrics.getTimeContext("reorgJob");
291-
Pair<DdlJob, String> res = getJob(session, reorg, job1 -> {
292-
String sql = "select job_id from mysql.dingo_ddl_job where "
293-
+ "(schema_ids = %s and type = %d and processing) "
294-
+ " or (table_ids = %s and processing) "
295-
+ " limit 1";
296-
sql = String.format(sql, Utils.quoteForSql(job1.getSchemaId()), job1.getActionType().getCode(), Utils.quoteForSql(job1.getTableId()));
297-
return checkJobIsRunnable(session, sql);
298-
});
299-
timeCtx.stop();
300-
return res;
301-
} catch (Exception e) {
302-
LogUtils.error(log, e.getMessage(), e);
303-
return Pair.of(null, e.getMessage());
304-
}
305-
}
306-
307281
public static String removeDDLReorgHandle(Session session, long jobId, MetaElement[] elements) {
308282
if (elements.length == 0) {
309283
return null;

dingo-store-proxy/src/main/java/io/dingodb/store/proxy/ddl/DdlHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ public static void insertDDLJobs2Table(DdlJob job, boolean updateRawArgs) {
9898
sqlBuilder.append(
9999
String.format(
100100
format, job.getId(), job.mayNeedReorg(), Utils.quoteForSql(job.job2SchemaIDs()),
101-
Utils.quoteForSql(job.job2TableIDs()), Utils.quoteForSql(jobMeta), job.getActionType().getCode(), !job.notStarted()
101+
Utils.quoteForSql(job.job2TableIDs()), Utils.quoteForSql(jobMeta), job.getActionType().getCode(),
102+
!job.notStarted()
102103
)
103104
);
104105
String sql = sqlBuilder.toString();

0 commit comments

Comments
 (0)