Skip to content

Commit 8b1f12c

Browse files
committed
PLUGIN-1823: Rework
1 parent ac813f0 commit 8b1f12c

File tree

9 files changed

+236
-194
lines changed

9 files changed

+236
-194
lines changed

database-commons/src/main/java/io/cdap/plugin/db/action/AbstractDBAction.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,12 @@
1616

1717
package io.cdap.plugin.db.action;
1818

19-
import dev.failsafe.Failsafe;
20-
import dev.failsafe.RetryPolicy;
2119
import io.cdap.cdap.etl.api.FailureCollector;
2220
import io.cdap.cdap.etl.api.PipelineConfigurer;
2321
import io.cdap.cdap.etl.api.action.Action;
2422
import io.cdap.cdap.etl.api.action.ActionContext;
2523
import io.cdap.plugin.common.db.DBErrorDetailsProvider;
2624
import io.cdap.plugin.util.DBUtils;
27-
import io.cdap.plugin.util.RetryPolicyUtil;
2825

2926
import java.sql.Driver;
3027
import java.sql.SQLException;
@@ -36,6 +33,7 @@ public abstract class AbstractDBAction extends Action {
3633
private static final String JDBC_PLUGIN_ID = "driver";
3734
private final QueryConfig config;
3835
private final Boolean enableAutoCommit;
36+
3937
public AbstractDBAction(QueryConfig config, Boolean enableAutoCommit) {
4038
this.config = config;
4139
this.enableAutoCommit = enableAutoCommit;
@@ -46,8 +44,7 @@ public void run(ActionContext context) throws Exception {
4644
Class<? extends Driver> driverClass = context.loadPluginClass(JDBC_PLUGIN_ID);
4745
DBRun executeQuery = new DBRun(config, driverClass, enableAutoCommit);
4846
try {
49-
Failsafe.with(RetryPolicyUtil.createConnectionRetryPolicy(config.getInitialRetryDuration(),
50-
config.getMaxRetryDuration(), config.getMaxRetryCount())).run(()-> executeQuery.run());
47+
executeQuery.run();
5148
} catch (Exception e) {
5249
if (e instanceof SQLException) {
5350
DBErrorDetailsProvider dbe = new DBErrorDetailsProvider();

database-commons/src/main/java/io/cdap/plugin/db/action/AbstractDBArgumentSetter.java

Lines changed: 44 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package io.cdap.plugin.db.action;
1818

1919
import dev.failsafe.Failsafe;
20+
import dev.failsafe.RetryPolicy;
2021
import io.cdap.cdap.etl.api.FailureCollector;
2122
import io.cdap.cdap.etl.api.PipelineConfigurer;
2223
import io.cdap.cdap.etl.api.StageConfigurer;
@@ -43,9 +44,12 @@ public class AbstractDBArgumentSetter extends Action {
4344

4445
private static final String JDBC_PLUGIN_ID = "driver";
4546
private final ArgumentSetterConfig config;
47+
private final RetryPolicy<Object> retryPolicy;
4648

4749
public AbstractDBArgumentSetter(ArgumentSetterConfig config) {
4850
this.config = config;
51+
this.retryPolicy = RetryPolicyUtil.getRetryPolicy(config.getInitialRetryDuration(), config.getMaxRetryDuration(),
52+
config.getMaxRetryCount());
4953
}
5054

5155
@Override
@@ -94,10 +98,11 @@ public void configurePipeline(PipelineConfigurer pipelineConfigurer)
9498
*/
9599
private void processArguments(Class<? extends Driver> driverClass,
96100
FailureCollector failureCollector, SettableArguments settableArguments)
97-
throws SQLException, IllegalAccessException, InstantiationException {
101+
throws SQLException, IllegalAccessException, InstantiationException {
98102
DriverCleanup driverCleanup;
103+
99104
driverCleanup = DBUtils.ensureJDBCDriverIsAvailable(driverClass, config.getConnectionString(),
100-
config.getJdbcPluginName());
105+
config.getJdbcPluginName());
101106
Properties connectionProperties = new Properties();
102107
connectionProperties.putAll(config.getConnectionArguments());
103108
try {
@@ -108,46 +113,51 @@ private void processArguments(Class<? extends Driver> driverClass,
108113
}
109114

110115
private void executeWithRetry(FailureCollector failureCollector, SettableArguments settableArguments,
111-
Properties connectionProperties) {
112-
Failsafe.with(RetryPolicyUtil.createConnectionRetryPolicy(config.getInitialRetryDuration(),
113-
config.getMaxRetryDuration(), config.getMaxRetryCount())).run(() -> {
114-
try (Connection connection = DriverManager
115-
.getConnection(config.getConnectionString(), connectionProperties)) {
116-
ResultSet resultSet;
117-
try (Statement statement = connection.createStatement()) {
118-
resultSet = statement.executeQuery(config.getQuery());
119-
}
120-
boolean hasRecord = resultSet.next();
121-
if (!hasRecord) {
122-
failureCollector.addFailure("No record found.",
123-
"The argument selection conditions must match only one record.");
124-
return;
125-
}
126-
if (settableArguments != null) {
127-
setArguments(resultSet, settableArguments);
128-
}
129-
if (resultSet.next()) {
130-
failureCollector
131-
.addFailure("More than one records found.",
132-
"The argument selection conditions must match only one record.");
133-
}
116+
Properties connectionProperties) throws SQLException {
117+
try (Connection connection = createConnectionWithRetry(connectionProperties)) {
118+
ResultSet resultSet;
119+
try (Statement statement = createStatementWithRetry(connection)) {
120+
resultSet = Failsafe.with(retryPolicy).get(() -> statement.executeQuery(config.getQuery()));
121+
}
122+
boolean hasRecord = resultSet.next();
123+
if (!hasRecord) {
124+
failureCollector.addFailure("No record found.",
125+
"The argument selection conditions must match only one record.");
126+
return;
127+
}
128+
if (settableArguments != null) {
129+
setArguments(resultSet, failureCollector, settableArguments);
134130
}
135-
});
131+
if (resultSet.next()) {
132+
failureCollector
133+
.addFailure("More than one records found.",
134+
"The argument selection conditions must match only one record.");
135+
}
136+
}
137+
}
138+
139+
private Connection createConnectionWithRetry(Properties connectionProperties) {
140+
return Failsafe.with(retryPolicy).<Connection>get(() -> DriverManager
141+
.getConnection(config.getConnectionString(), connectionProperties));
142+
}
143+
144+
private Statement createStatementWithRetry(Connection connection) {
145+
return Failsafe.with(retryPolicy).<Statement>get(() -> connection.createStatement());
136146
}
137147

138148
/**
139149
* Converts column from jdbc results set into pipeline arguments
140150
*
141151
* @param resultSet - result set from db {@link ResultSet}
152+
* @param failureCollector - context failure collector @{link FailureCollector}
142153
* @param arguments - context argument setter {@link SettableArguments}
154+
* @throws SQLException - raises {@link SQLException} when configuration is not valid
143155
*/
144-
private void setArguments(ResultSet resultSet, SettableArguments arguments) {
145-
Failsafe.with(RetryPolicyUtil.createConnectionRetryPolicy(config.getInitialRetryDuration(),
146-
config.getMaxRetryDuration(), config.getMaxRetryCount())).run(() -> {
147-
String[] columns = config.getArgumentsColumns().split(",");
148-
for (String column : columns) {
149-
arguments.set(column, resultSet.getString(column));
150-
}
151-
});
156+
private void setArguments(ResultSet resultSet, FailureCollector failureCollector,
157+
SettableArguments arguments) throws SQLException {
158+
String[] columns = config.getArgumentsColumns().split(",");
159+
for (String column : columns) {
160+
arguments.set(column, resultSet.getString(column));
161+
}
152162
}
153163
}

database-commons/src/main/java/io/cdap/plugin/db/action/AbstractQueryAction.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,11 @@
1616

1717
package io.cdap.plugin.db.action;
1818

19-
import dev.failsafe.Failsafe;
2019
import io.cdap.cdap.etl.api.FailureCollector;
2120
import io.cdap.cdap.etl.api.PipelineConfigurer;
2221
import io.cdap.cdap.etl.api.batch.BatchActionContext;
2322
import io.cdap.cdap.etl.api.batch.PostAction;
2423
import io.cdap.plugin.util.DBUtils;
25-
import io.cdap.plugin.util.RetryPolicyUtil;
2624

2725
import java.sql.Driver;
2826

@@ -53,8 +51,7 @@ public void run(BatchActionContext batchContext) throws Exception {
5351

5452
Class<? extends Driver> driverClass = batchContext.loadPluginClass(JDBC_PLUGIN_ID);
5553
DBRun executeQuery = new DBRun(config, driverClass, enableAutoCommit);
56-
Failsafe.with(RetryPolicyUtil.createConnectionRetryPolicy(config.getInitialRetryDuration(),
57-
config.getMaxRetryDuration(), config.getMaxRetryCount())).run(() -> executeQuery.run());
54+
executeQuery.run();
5855
}
5956

6057
@Override

database-commons/src/main/java/io/cdap/plugin/db/action/DBRun.java

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package io.cdap.plugin.db.action;
1818

1919
import dev.failsafe.Failsafe;
20+
import dev.failsafe.RetryPolicy;
2021
import io.cdap.plugin.util.DBUtils;
2122
import io.cdap.plugin.util.DriverCleanup;
2223
import io.cdap.plugin.util.RetryPolicyUtil;
@@ -36,60 +37,64 @@ public class DBRun {
3637
private final QueryConfig config;
3738
private final Class<? extends Driver> driverClass;
3839
private boolean enableAutoCommit;
40+
private final RetryPolicy<Object> retryPolicy;
3941

4042
public DBRun(QueryConfig config, Class<? extends Driver> driverClass, Boolean enableAutocommit) {
4143
this.config = config;
4244
this.driverClass = driverClass;
4345
if (enableAutocommit != null) {
4446
this.enableAutoCommit = enableAutocommit;
4547
}
48+
this.retryPolicy = RetryPolicyUtil.getRetryPolicy(config.getInitialRetryDuration(), config.getMaxRetryDuration(),
49+
config.getMaxRetryCount());
4650
}
4751

4852
/**
4953
* Uses a configured JDBC driver to execute a SQL statement. The configurations of which JDBC driver
5054
* to use and which connection string to use come from the plugin configuration.
5155
*/
5256
public void run() throws SQLException, InstantiationException, IllegalAccessException {
53-
5457
DriverCleanup driverCleanup = null;
5558
try {
5659
driverCleanup = DBUtils.ensureJDBCDriverIsAvailable(driverClass, config.getConnectionString(),
5760
config.getJdbcPluginName());
5861

5962
Properties connectionProperties = new Properties();
6063
connectionProperties.putAll(config.getConnectionArguments());
61-
Failsafe.with(RetryPolicyUtil.createConnectionRetryPolicy(config.getInitialRetryDuration(),
62-
config.getMaxRetryDuration(), config.getMaxRetryCount())).run(() -> {
63-
try (Connection connection = DriverManager.getConnection(config.getConnectionString(), connectionProperties)) {
64-
executeInitQueries(connection, config.getInitQueries());
64+
try (Connection connection = createConnectionWithRetry(connectionProperties)) {
65+
executeInitQueries(connection, config.getInitQueries());
66+
if (!enableAutoCommit) {
67+
connection.setAutoCommit(false);
68+
}
69+
try (Statement statement = createStatementWithRetry(connection)) {
70+
Failsafe.with(retryPolicy).run(() -> statement.execute(config.query));
71+
6572
if (!enableAutoCommit) {
66-
connection.setAutoCommit(false);
67-
}
68-
try (Statement statement = connection.createStatement()) {
69-
statement.execute(config.query);
70-
if (!enableAutoCommit) {
71-
connection.commit();
72-
}
73+
connection.commit();
7374
}
7475
}
75-
});
76+
}
7677
} finally {
7778
if (driverCleanup != null) {
7879
driverCleanup.destroy();
7980
}
8081
}
8182
}
8283

83-
private void executeInitQueries(Connection connection, List<String> initQueries) {
84+
private void executeInitQueries(Connection connection, List<String> initQueries) throws SQLException {
85+
for (String query : initQueries) {
86+
try (Statement statement = createStatementWithRetry(connection)) {
87+
Failsafe.with(retryPolicy).run(() -> statement.execute(query));
88+
}
89+
}
90+
}
8491

85-
Failsafe.with(RetryPolicyUtil.createConnectionRetryPolicy(config.getInitialRetryDuration(),
86-
config.getMaxRetryDuration(), config.getMaxRetryCount()))
87-
.run(() -> {
88-
for (String query : initQueries) {
89-
try (Statement statement = connection.createStatement()) {
90-
statement.execute(query);
91-
}
92-
}
93-
});
92+
private Connection createConnectionWithRetry(Properties connectionProperties) {
93+
return Failsafe.with(retryPolicy).<Connection>get(() -> DriverManager
94+
.getConnection(config.getConnectionString(), connectionProperties));
95+
}
96+
97+
private Statement createStatementWithRetry(Connection connection) {
98+
return Failsafe.with(retryPolicy).<Statement>get(() -> connection.createStatement());
9499
}
95100
}

database-commons/src/main/java/io/cdap/plugin/db/connector/AbstractDBSpecificConnector.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,16 +174,15 @@ protected String getStratifiedQuery(String tableName, int limit, String strata,
174174

175175
protected Schema loadTableSchema(Connection connection, String query, @Nullable Integer timeoutSec, String sessionID)
176176
throws SQLException {
177-
return Failsafe.with(RetryPolicyUtil.createConnectionRetryPolicy(config.getInitialRetryDuration(),
178-
config.getMaxRetryDuration(), config.getMaxRetryCount())).get(() -> {
179177
Statement statement = connection.createStatement();
180178
statement.setMaxRows(1);
181179
if (timeoutSec != null) {
182180
statement.setQueryTimeout(timeoutSec);
183181
}
184-
ResultSet resultSet = statement.executeQuery(query);
182+
ResultSet resultSet = Failsafe.with(RetryPolicyUtil.getRetryPolicy(config.getInitialRetryDuration(),
183+
config.getMaxRetryDuration(), config.getMaxRetryCount()))
184+
.get(() -> statement.executeQuery(query));
185185
return Schema.recordOf("outputSchema", getSchemaReader(sessionID).getSchemaFields(resultSet));
186-
});
187186
}
188187

189188
protected void setConnectionProperties(Map<String, String> properties, ConnectorSpecRequest request) {

0 commit comments

Comments
 (0)