@@ -77,20 +77,20 @@ public class MysqlDagStateStoreWithDagNodes implements DagStateStoreWithDagNodes
77
77
protected final GsonSerDe <List <JobExecutionPlan >> serDe ;
78
78
private final JobExecutionPlanDagFactory jobExecPlanDagFactory ;
79
79
80
- // todo add a column that tells if it is a running dag or a failed dag
81
- protected static final String CREATE_TABLE_STATEMENT = "CREATE TABLE IF NOT EXISTS %s ("
82
- + "dag_node_id VARCHAR(" + ServiceConfigKeys . MAX_DAG_NODE_ID_LENGTH + ") CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, "
83
- + "parent_dag_id VARCHAR(" + ServiceConfigKeys .MAX_DAG_ID_LENGTH + ") NOT NULL, "
84
- + "dag_node JSON NOT NULL, "
85
- + "modified_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , "
86
- + "PRIMARY KEY (dag_node_id), "
87
- + "UNIQUE INDEX dag_node_index (dag_node_id), "
88
- + "INDEX dag_index (parent_dag_id))" ;
89
-
90
- protected static final String INSERT_STATEMENT = "INSERT INTO %s (dag_node_id, parent_dag_id, dag_node) "
91
- + "VALUES (?, ?, ?) AS new ON DUPLICATE KEY UPDATE dag_node = new.dag_node" ;
92
- protected static final String GET_DAG_NODES_STATEMENT = "SELECT dag_node FROM %s WHERE parent_dag_id = ?" ;
93
- protected static final String GET_DAG_NODE_STATEMENT = "SELECT dag_node FROM %s WHERE dag_node_id = ?" ;
80
+ protected static final String CREATE_TABLE_STATEMENT =
81
+ "CREATE TABLE IF NOT EXISTS %s (" + "dag_node_id VARCHAR(" + ServiceConfigKeys . MAX_DAG_NODE_ID_LENGTH
82
+ + ") CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, " + "parent_dag_id VARCHAR( "
83
+ + ServiceConfigKeys .MAX_DAG_ID_LENGTH + ") NOT NULL, " + "dag_node JSON NOT NULL, "
84
+ + "modified_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , "
85
+ + "is_failed_dag INT NOT NULL DEFAULT 0 , "
86
+ + "PRIMARY KEY (dag_node_id), " + "UNIQUE INDEX dag_node_index (dag_node_id), "
87
+ + "INDEX dag_index (parent_dag_id))" ;
88
+
89
+ protected static final String INSERT_STATEMENT =
90
+ "INSERT INTO %s (dag_node_id, parent_dag_id, dag_node, is_failed_dag ) "
91
+ + "VALUES (?, ?, ?, ? ) AS new ON DUPLICATE KEY UPDATE dag_node = new.dag_node, is_failed_dag = new.is_failed_dag " ;
92
+ protected static final String GET_DAG_NODES_STATEMENT = "SELECT dag_node,is_failed_dag FROM %s WHERE parent_dag_id = ?" ;
93
+ protected static final String GET_DAG_NODE_STATEMENT = "SELECT dag_node,is_failed_dag FROM %s WHERE dag_node_id = ?" ;
94
94
protected static final String DELETE_DAG_STATEMENT = "DELETE FROM %s WHERE parent_dag_id = ?" ;
95
95
private final ContextAwareCounter totalDagCount ;
96
96
@@ -105,7 +105,8 @@ public MysqlDagStateStoreWithDagNodes(Config config, Map<URI, TopologySpec> topo
105
105
DataSource dataSource = MysqlDataSourceFactory .get (config , SharedResourcesBrokerFactory .getImplicitBroker ());
106
106
107
107
try (Connection connection = dataSource .getConnection ();
108
- PreparedStatement createStatement = connection .prepareStatement (String .format (CREATE_TABLE_STATEMENT , tableName ))) {
108
+ PreparedStatement createStatement = connection .prepareStatement (
109
+ String .format (CREATE_TABLE_STATEMENT , tableName ))) {
109
110
createStatement .executeUpdate ();
110
111
connection .commit ();
111
112
} catch (SQLException e ) {
@@ -126,12 +127,11 @@ public MysqlDagStateStoreWithDagNodes(Config config, Map<URI, TopologySpec> topo
126
127
}
127
128
128
129
@ Override
129
- public void writeCheckpoint (Dag <JobExecutionPlan > dag )
130
- throws IOException {
130
+ public void writeCheckpoint (Dag <JobExecutionPlan > dag ) throws IOException {
131
131
DagManager .DagId dagId = DagManagerUtils .generateDagId (dag );
132
132
boolean newDag = false ;
133
133
for (Dag .DagNode <JobExecutionPlan > dagNode : dag .getNodes ()) {
134
- if (updateDagNode (dagId , dagNode ) == 1 ) {
134
+ if (updateDagNode (dagId , dagNode , dag . isFailedDag () ) == 1 ) {
135
135
newDag = true ;
136
136
}
137
137
}
@@ -153,7 +153,8 @@ public boolean cleanUp(DagManager.DagId dagId) throws IOException {
153
153
return deleteStatement .executeUpdate () != 0 ;
154
154
} catch (SQLException e ) {
155
155
throw new IOException (String .format ("Failure deleting dag for %s" , dagId ), e );
156
- }}, true );
156
+ }
157
+ }, true );
157
158
this .totalDagCount .dec ();
158
159
return true ;
159
160
}
@@ -167,7 +168,8 @@ public void cleanUp(String dagId) throws IOException {
167
168
@ Override
168
169
public List <Dag <JobExecutionPlan >> getDags () throws IOException {
169
170
throw new NotSupportedException (getClass ().getSimpleName () + " does not need this legacy API that originated with "
170
- + "the DagManager that is replaced by DagProcessingEngine" ); }
171
+ + "the DagManager that is replaced by DagProcessingEngine" );
172
+ }
171
173
172
174
@ Override
173
175
public Dag <JobExecutionPlan > getDag (DagManager .DagId dagId ) throws IOException {
@@ -195,33 +197,37 @@ private Dag<JobExecutionPlan> convertDagNodesIntoDag(Set<Dag.DagNode<JobExecutio
195
197
}
196
198
197
199
@ Override
198
- public int updateDagNode (DagManager .DagId parentDagId , Dag .DagNode <JobExecutionPlan > dagNode ) throws IOException {
200
+ public int updateDagNode (DagManager .DagId parentDagId , Dag .DagNode <JobExecutionPlan > dagNode , boolean isFailedDag )
201
+ throws IOException {
199
202
String dagNodeId = dagNode .getValue ().getId ().toString ();
200
203
return dbStatementExecutor .withPreparedStatement (String .format (INSERT_STATEMENT , tableName ), insertStatement -> {
201
204
try {
202
205
insertStatement .setString (1 , dagNodeId );
203
206
insertStatement .setString (2 , parentDagId .toString ());
204
207
insertStatement .setString (3 , this .serDe .serialize (Collections .singletonList (dagNode .getValue ())));
208
+ insertStatement .setInt (4 , isFailedDag ? 1 : 0 );
205
209
return insertStatement .executeUpdate ();
206
210
} catch (SQLException e ) {
207
211
throw new IOException (String .format ("Failure adding dag node for %s" , dagNodeId ), e );
208
- }}, true );
212
+ }
213
+ }, true );
209
214
}
210
215
211
216
@ Override
212
217
public Set <Dag .DagNode <JobExecutionPlan >> getDagNodes (DagManager .DagId parentDagId ) throws IOException {
213
- return dbStatementExecutor .withPreparedStatement (String .format (GET_DAG_NODES_STATEMENT , tableName ), getStatement -> {
214
- getStatement .setString (1 , parentDagId .toString ());
215
- HashSet <Dag .DagNode <JobExecutionPlan >> dagNodes = new HashSet <>();
216
- try (ResultSet rs = getStatement .executeQuery ()) {
217
- while (rs .next ()) {
218
- dagNodes .add (new Dag .DagNode <>(this .serDe .deserialize (rs .getString (1 )).get (0 )));
219
- }
220
- return dagNodes ;
221
- } catch (SQLException e ) {
222
- throw new IOException (String .format ("Failure get dag nodes for dag %s" , parentDagId ), e );
223
- }
224
- }, true );
218
+ return dbStatementExecutor .withPreparedStatement (String .format (GET_DAG_NODES_STATEMENT , tableName ),
219
+ getStatement -> {
220
+ getStatement .setString (1 , parentDagId .toString ());
221
+ HashSet <Dag .DagNode <JobExecutionPlan >> dagNodes = new HashSet <>();
222
+ try (ResultSet rs = getStatement .executeQuery ()) {
223
+ while (rs .next ()) {
224
+ dagNodes .add (new Dag .DagNode <>(this .serDe .deserialize (rs .getString (1 )).get (0 ), rs .getBoolean (2 )));
225
+ }
226
+ return dagNodes ;
227
+ } catch (SQLException e ) {
228
+ throw new IOException (String .format ("Failure get dag nodes for dag %s" , parentDagId ), e );
229
+ }
230
+ }, true );
225
231
}
226
232
227
233
@ Override
@@ -230,7 +236,7 @@ public Optional<Dag.DagNode<JobExecutionPlan>> getDagNode(DagNodeId dagNodeId) t
230
236
getStatement .setString (1 , dagNodeId .toString ());
231
237
try (ResultSet rs = getStatement .executeQuery ()) {
232
238
if (rs .next ()) {
233
- return Optional .of (new Dag .DagNode <>(this .serDe .deserialize (rs .getString (1 )).get (0 )));
239
+ return Optional .of (new Dag .DagNode <>(this .serDe .deserialize (rs .getString (1 )).get (0 ), rs . getBoolean ( 2 ) ));
234
240
}
235
241
return Optional .empty ();
236
242
} catch (SQLException e ) {
0 commit comments