public void attachJobGraph(List<JobVertex> topologicallySorted) throws JobException { LOG.debug("Attaching {} topologically sorted vertices to existing job graph with {} " + "vertices and {} intermediate results.", topologicallySorted.size(), tasks.size(), intermediateResults.size()); final ArrayList<ExecutionJobVertex> newExecJobVertices = new ArrayList<>(topologicallySorted.size()); createExecutionJobVertex(topologicallySorted); for (JobVertex jobVertex : topologicallySorted) { if (jobVertex.isInputVertex() && !jobVertex.isStoppable()) { this.isStoppable = false; } ExecutionJobVertex ejv = tasks.get(jobVertex.getID()); ejv.connectToPredecessors(this.intermediateResults); for (IntermediateResult res : ejv.getProducedDataSets()) { IntermediateResult previousDataSet = this.intermediateResults.putIfAbsent(res.getId(), res); if (previousDataSet != null) { throw new JobException(String.format("Encountered two intermediate data set with ID %s : previous=[%s] / new=[%s]", res.getId(), res, previousDataSet)); } } this.verticesInCreationOrder.add(ejv); this.numVerticesTotal += ejv.getParallelism(); newExecJobVertices.add(ejv); } terminationFuture = new CompletableFuture<>(); failoverStrategy.notifyNewVertices(newExecJobVertices); }
failoverStrategy.onTaskFailure(execution, ex);
LOG.info("Job recovers via failover strategy: {}", failoverStrategy.getStrategyName());
failoverStrategy.onTaskFailure(execution, ex);
LOG.info("Job recovers via failover strategy: {}", failoverStrategy.getStrategyName());
failoverStrategy.notifyNewVertices(newExecJobVertices);
failoverStrategy.onTaskFailure(execution, ex);
LOG.info("Job recovers via failover strategy: {}", failoverStrategy.getStrategyName());
failoverStrategy.notifyNewVertices(newExecJobVertices);
failoverStrategy.onTaskFailure(execution, ex);
LOG.info("Job recovers via failover strategy: {}", failoverStrategy.getStrategyName());
failoverStrategy.notifyNewVertices(newExecJobVertices);