public StageRunner(StageGroup stageGroup, File baseDirectory, int pipelinePort, boolean performanceLogging, int loggingPort, ShutdownHandler shutdownHandler) { this.stageGroup = stageGroup; this.baseDirectory = baseDirectory; this.targetDirectory = new File(baseDirectory, stageGroup.getName()); this.pipelinePort = pipelinePort; this.performanceLogging = performanceLogging; this.loggingPort = loggingPort; this.shutdownHandler = shutdownHandler; timesStarted = 0; }
public void addGroup(StageGroup g) { stageGroups.put(g.getName(), g); }
public void addRunner(StageRunner runner) { runnerMap.put(runner.getStageGroup().getName(), runner); }
/** * Destroys the JVM running this stage and removes it's working files. * Should a JVM shutdown fail, it will throw an IllegalStateException. */ public void destroy() { logger.debug("Attempting to destroy JVM running stage group " + stageGroup.getName()); boolean success = stageDestroyer.killAll(); if (success) { logger.debug("... destruction successful"); } else { logger.error("JVM running stage group " + stageGroup.getName() + " was not killed"); throw new IllegalStateException("Orphaned process for " + stageGroup.getName()); } removeFiles(); wasKilled = true; }
private Set<String> getChangedGroups(Pipeline newPipeline) { HashSet<String> list = new HashSet<String>(); for(StageGroup group : pipeline.getStageGroups()) { if(!newPipeline.hasGroup(group.getName()) || !group.equals(newPipeline.getGroup(group.getName()))) { list.add(group.getName()); } } return list; }
private void removeFiles() { long start = System.currentTimeMillis(); IOException ex = null; do { try { FileUtils.deleteDirectory(targetDirectory); return; } catch (IOException e) { ex = e; try { Thread.sleep(50); } catch (InterruptedException e1) { logger.error("Interrupted while waiting on delete"); Thread.currentThread().interrupt(); return; } } } while (start + 5000 > System.currentTimeMillis()); logger.error("Unable to delete the directory " + targetDirectory.getAbsolutePath() + ", containing Stage Group " + stageGroup.getName(), ex); }
public void run() { started = true; if (!prepared) { logger.error("The StageRunner was not prepared prior to being started. Aborting!"); return; } if (stageGroup.isEmpty()) { logger.info("Stage group " + stageGroup.getName() + " has no stages, and can not be started."); return; } do { logger.info("Starting stage group " + stageGroup.getName() + ". Times started so far: " + timesStarted); timesStarted++; boolean cleanShutdown = runGroup(); if (cleanShutdown) { return; } if (!hasQueried()) { logger.error("The stage group " + stageGroup.getName() + " did not start. It will not be restarted until configuration changes."); return; } } while ((timesToRetry == -1 || timesToRetry >= timesStarted) && !shutdownHandler.isShuttingDown()); logger.error("Stage group " + stageGroup.getName() + " has failed and cannot be restarted. "); }
private void writeProperties(StageGroup stageGroup) { DBObject q = reader.getGroupQuery(stageGroup.getName()); WriteResult result = stages.update(q, getGroupDBObject(stageGroup), true, false, concern); if (logger.isDebugEnabled()) { logger.debug("Wrote properties for group '{}', operation updated '{}' objects, got message '{}'", stageGroup.getName(), result.getN(), result); } }
@Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } Pipeline other = (Pipeline) obj; if(other.getStageGroups().size()==getStageGroups().size()) { for(StageGroup g : other.getStageGroups()) { if(!hasGroup(g.getName()) || !g.equals(getGroup(g.getName()))) { return false; } } return true; } return false; }
private void addMissingGroups(Pipeline newPipeline) { for(StageGroup group : newPipeline.getStageGroups()) { if(!pipeline.hasGroup(group.getName())) { pipeline.addGroup(group); if(attachFiles(group)) { sm.addRunner(new StageRunner(group, new File(namespace), port, conf.isPerformanceLogging(), conf.getLoggingPort(), shutdownHandler)); } else { logger.error("Was unable to start the stage group '"+group.getName()+"' due to missing libraries."); } } } }
public void write(StageGroup stageGroup) throws IOException { writeProperties(stageGroup); for (Stage s : stageGroup.getStages()) { write(s, stageGroup.getName()); } }
cmdLine.addArgument("${classpath}", false); cmdLine.addArgument(GroupStarter.class.getCanonicalName()); cmdLine.addArgument(stageGroup.getName()); cmdLine.addArgument("localhost"); cmdLine.addArgument("" + pipelinePort); Process p = cl.exec(cmdLine, null); new StreamLogger( String.format("%s (stdout)", stageGroup.getName()), p.getInputStream() ).start(); new StreamLogger( String.format("%s (stderr)", stageGroup.getName()), p.getErrorStream() ).start(); logger.error("Stage group " + stageGroup.getName() + " terminated unexpectedly with exit value " + exitValue); return false;
obj.put(MongoPipelineReader.NAME_KEY, group.getName());