package simulator.utils; import java.io.File; import java.util.Calendar; import java.util.HashMap; import java.util.Iterator; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import simulator.workload.reader.archive.swf.SWFFields; import simulator.workload.reader.archive.swf.SWFParser; import simulator.workload.writer.swf.QcgSWFJobWriter; /** * * @author Marcin Krystek * */ public class WorkloadCalculator { protected static Log log = LogFactory.getLog(WorkloadCalculator.class); public static void main(String args[]){ WorkloadCalculator workloadCalculator = new WorkloadCalculator(); try { throw new RuntimeException("Nieladnie tak uruchamiac w ciemno ;). " + "Wybierz funkcje, ktora ma zostac wywolana"); //workloadCalculator.normalizeSubmitTime(args[0]); //workloadCalculator.removeIncorrectTasks(args[0]); } catch (Exception e) { e.printStackTrace(); } } /** * Rewrites swf file. Submit time of all tasks will be scaled down. * @param swfFileName */ public void normalizeSubmitTime(String swfFileName) throws Exception{ log.info("Start workload submit time normalization for "+swfFileName); File file = new File(swfFileName); String dirName = file.getParent(); String fileName = file.getName(); File newFile = new File(dirName, Calendar.getInstance().getTimeInMillis()+"_"+fileName); file.renameTo(newFile); QcgSWFJobWriter writer = new QcgSWFJobWriter(dirName, fileName); // write swf filed description writer.writeFieldDescriptionHeader(); SWFParser parser = new SWFParser(newFile.getAbsolutePath()); // rewrite swf header HashMap header = parser.loadHeader(); Set keys = header.keySet(); Iterator itr = keys.iterator(); while(itr.hasNext()){ String key = itr.next(); writer.writeComment(key, header.get(key)); } // rewrite tasks String task[] = parser.readTask(); long submitTimeOffset = Long.valueOf(task[SWFFields.DATA_SUBMIT_TIME]); task[SWFFields.DATA_SUBMIT_TIME] = "0"; writer.writeLine(task); while((task = parser.readTask()) != null){ long submitTime = Long.valueOf(task[SWFFields.DATA_SUBMIT_TIME]) - submitTimeOffset; task[SWFFields.DATA_SUBMIT_TIME] = String.valueOf(submitTime); writer.writeLine(task); } parser.close(); writer.close(); newFile.delete(); log.info("End workload submit time normalization"); } /** * Rewrites swf file and deletes all tasks which parameter RUN_TIME or REQUESTED_TIME or * number of ALLOCATED PRCESSORS or number of REQUESTED PROCESSORS equals -1. * @param swf file name */ public void removeIncorrectTasks(String swfFileName) throws Exception{ log.info("Start removing incorrect tasks for "+swfFileName); File file = new File(swfFileName); String dirName = file.getParent(); String fileName = file.getName(); File newFile = new File(dirName, Calendar.getInstance().getTimeInMillis()+"_"+fileName); file.renameTo(newFile); QcgSWFJobWriter writer = new QcgSWFJobWriter(dirName, fileName); // write swf filed description writer.writeFieldDescriptionHeader(); SWFParser parser = new SWFParser(newFile.getAbsolutePath()); // rewrite swf header HashMap header = parser.loadHeader(); Set keys = header.keySet(); Iterator itr = keys.iterator(); while(itr.hasNext()){ String key = itr.next(); writer.writeComment(key, header.get(key)); } // rewrite tasks String task[] = null; while((task = parser.readTask()) != null){ if("-1".equals(task[SWFFields.DATA_RUN_TIME])) { log.info("Removing task "+task[SWFFields.DATA_JOB_NUMBER] + ", RUN_TIME = -1"); continue; } if("-1".equals(task[SWFFields.DATA_REQUESTED_TIME])) { log.info("Removing task "+task[SWFFields.DATA_JOB_NUMBER] + ", REQUESTED_TIME = -1"); continue; } if("-1".equals(task[SWFFields.DATA_NUMBER_OF_ALLOCATED_PROCESSORS])){ log.info("Removing task "+task[SWFFields.DATA_JOB_NUMBER] + ", NUMBER_OF_ALLOCATED_PROCESSORS = -1"); continue; } if("-1".equals(task[SWFFields.DATA_REQUESTED_NUMBER_OF_PROCESSORS])){ log.info("Removing task "+task[SWFFields.DATA_JOB_NUMBER] + ", REQUESTED_NUMBER_OF_PROCESSORS = -1"); continue; } writer.writeLine(task); } parser.close(); writer.close(); newFile.delete(); log.info("End removing incorrect tasks"); } }