@Override public void run() { checkShutDown(); if (WorkerData.instance.nextBeat()) { try { TransactionContext.push(); doLaundryList(Singletons.getCoordinator()); } catch (Exception e) { e.printStackTrace(); } finally { TransactionContext.pop(); } } System.gc(); }
public void doLaundryList(Coordiantor coordinator) throws Exception { /* if configuration was updated and load all updates */ WorkerData.instance.checkGlobalConfig(coordinator); /* Check if host object initialized and if not make sure that * host/group exists in db */ coordinator.ensureHost(WorkerData.instance); /* Check CPU & Memory and up update * statistics */ agent.runStatistics(); coordinator.storeStatistics(WorkerData.instance); /* Check all active workers in the same group, * calculate next beat time * Update status of the workers and beet time * on the same machine if necessary. */ coordinator.ensureWorker(WorkerData.instance); Map<String, DomainTemplate> activeDomains = Singletons.getGlobalConfig().activeDomains(); List<BeeQueueDomain> domains = LazyList.morph(BeeQueueDomain.TO_DOMAIN, activeDomains.keySet()); coordinator.ensureDomains(domains); /* Process all messages and create stages, create runs for * unblocked stages. Pick runs to execute. Execute. */ coordinator.processEmittedMessages(); BeeQueueStage readyToRun = coordinator.pickStageToRun(); if (readyToRun != null) { RunHelper runHelper = new RunHelper(readyToRun, WorkerData.instance.worker); coordinator.storeRun(runHelper.run); runHelper.start(); coordinator.storeRun(runHelper.run); coordinator.updateStage(runHelper.stage); } /* Run ps. Identify all processes that currently executed. * Check all processes that finished on host an update ther stages * appropriately */ Map<Long, BeeQueueRun> notFinishedRuns = new LinkedHashMap<Long, BeeQueueRun>(); for (BeeQueueRun run : coordinator.allCurrentRuns(WorkerData.instance)) { File rc = new File(run.dir, "rc.log"); if (rc.exists()) { int returnCode = Integer.parseInt(Files.readAll(rc).trim()); run.state = returnCode == 0 ? RunState.SUCCESS : RunState.FAILURE; coordinator.storeRun(run); if (run.state == RunState.SUCCESS) { run.stage.newState = StageState.SUCCESS; } else { run.stage.newState = run.stage.retriesLeft > 0 ? StageState.READY : StageState.FAILURE; } coordinator.updateStage(run.stage); } else { notFinishedRuns.put(run.id, run); } } ProcRawData[] ps = agent.runProcessStatistics(); List<BeeQueueProcess> allActiveProcesses = coordinator.allActiveProcessesOnHost(WorkerData.instance.host); for (int i = 0; i < ps.length; i++) { ProcRawData procRawData = ps[i]; if (procRawData.env != null && procRawData.env.get(RunHelper.BQ_RUN_ID) != null) { BeeQueueProcess process = new BeeQueueProcess(); process.runId = Long.parseLong((String) procRawData.env.get(RunHelper.BQ_RUN_ID)); process.pid = "" + procRawData.pid; process.ppid = "" + procRawData.state.getPpid(); process.processName = procRawData.allArgs(); coordinator.storeProcess(process); allActiveProcesses.remove(process); BeeQueueRun runThatStillHaveProcesses = notFinishedRuns.remove(process.runId); if (runThatStillHaveProcesses != null) { runThatStillHaveProcesses.justUpTimeStamp = true; coordinator.storeRun(runThatStillHaveProcesses); } } } for (BeeQueueProcess process : allActiveProcesses) { process.down = true; coordinator.storeProcess(process); } if (notFinishedRuns.size() > 0) { ToStringUtil.out("Cannot detect any info about processes:\n", notFinishedRuns); } coordinator.updateFinishedJobsAndMessages(); }