Skip to content

Commit cb97f07

Browse files
fix(data-transfer): avoid task failure by processing exception messages (#2779)
* optimize error message * fix typo
1 parent 74b6fd5 commit cb97f07

1 file changed

Lines changed: 38 additions & 1 deletion

File tree

server/plugins/task-plugin-ob-mysql/src/main/java/com/oceanbase/odc/plugin/task/obmysql/datatransfer/task/BaseOceanBaseTransferJob.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.Collection;
2020
import java.util.Collections;
2121
import java.util.List;
22+
import java.util.Optional;
2223
import java.util.function.Predicate;
2324
import java.util.stream.Collectors;
2425

@@ -27,13 +28,15 @@
2728
import org.slf4j.Logger;
2829
import org.slf4j.LoggerFactory;
2930

31+
import com.oceanbase.odc.common.util.ExceptionUtils;
3032
import com.oceanbase.odc.core.shared.Verify;
3133
import com.oceanbase.odc.core.shared.constant.TaskStatus;
3234
import com.oceanbase.odc.plugin.task.api.datatransfer.DataTransferJob;
3335
import com.oceanbase.odc.plugin.task.api.datatransfer.model.DataTransferTaskResult;
3436
import com.oceanbase.odc.plugin.task.api.datatransfer.model.ObjectResult;
3537
import com.oceanbase.tools.loaddump.common.enums.DataFormat;
3638
import com.oceanbase.tools.loaddump.common.enums.ObjectType;
39+
import com.oceanbase.tools.loaddump.common.enums.ServerMode;
3740
import com.oceanbase.tools.loaddump.common.model.BaseParameter;
3841
import com.oceanbase.tools.loaddump.common.model.DumpParameter;
3942
import com.oceanbase.tools.loaddump.common.model.LoadParameter;
@@ -175,7 +178,12 @@ public DataTransferTaskResult call() throws Exception {
175178
if (dataContext != null) {
176179
dataContext.shutdownNow();
177180
}
178-
throw e;
181+
String rootMessage = Optional.ofNullable(ExceptionUtils.getRootCause(e)).orElseThrow(() -> e).getMessage();
182+
if (shouldEatException(rootMessage)) {
183+
LOGGER.warn(rootMessage);
184+
} else {
185+
throw e;
186+
}
179187
}
180188

181189
validAllTasksSuccessed();
@@ -242,6 +250,35 @@ private void syncWaitFinished(@NonNull TaskContext context, boolean isTransferSc
242250
throw new InterruptedException("loop interrupted");
243251
}
244252

253+
/**
254+
* @return a bool value. If it's true, the exception should be eaten.
255+
*/
256+
private boolean shouldEatException(String errorMessage) {
257+
if (StringUtils.isEmpty(errorMessage)) {
258+
return false;
259+
}
260+
if (errorMessage.contains("No subfiles are generated from path")) {
261+
return true;
262+
}
263+
if (errorMessage.contains("table or view does not exist")) {
264+
ServerMode serverMode = parameter.getConnectionKey().getServerMode();
265+
if (serverMode.isMysqlMode()) {
266+
LOGGER.warn(
267+
"The current user may lack access to the oceanbase database. "
268+
+ "You can execute the following SQL and retry the transfer task:\n"
269+
+ "grant select on oceanbase.* to {}",
270+
parameter.getUser());
271+
} else {
272+
LOGGER.warn(
273+
"The current user may lack of DBA permission. "
274+
+ "You can execute the following SQL and retry the transfer task:\n"
275+
+ "grant select any dictionary to {}",
276+
parameter.getUser());
277+
}
278+
}
279+
return false;
280+
}
281+
245282
private void shutdownContext(TaskContext context) {
246283
try {
247284
context.shutdown();

0 commit comments

Comments
 (0)