/** * Return an object with the proper objects loaded * * @param args * @return * @throws Exception */ public static ArgumentsParser load(String args[], String... required) throws Exception { ArgumentsParser au = new ArgumentsParser(); au.process(args, required); // System.out.println("catalog: " + au.catalog); // System.out.println("catalog_db: " + au.catalog_db); // System.out.println("workload: " + au.workload); // System.out.println("workload.limit: " + au.workload_limit); // System.out.println("stats: " + au.stats); return (au); }
/** * MAIN! * * @param vargs * @throws Exception */ public static void main(String[] vargs) throws Exception { ArgumentsParser args = ArgumentsParser.load(vargs); args.require( ArgumentsParser.PARAM_CATALOG, ArgumentsParser.PARAM_WORKLOAD, ArgumentsParser.PARAM_PARTITION_PLAN, ArgumentsParser.PARAM_DESIGNER_INTERVALS // ArgumentsParser.PARAM_DESIGNER_HINTS ); assert (args.workload.getTransactionCount() > 0) : "No transactions were loaded from " + args.workload; if (args.hasParam(ArgumentsParser.PARAM_CATALOG_HOSTS)) { ClusterConfiguration cc = new ClusterConfiguration(args.getParam(ArgumentsParser.PARAM_CATALOG_HOSTS)); args.updateCatalog(FixCatalog.cloneCatalog(args.catalog, cc), null); } // If given a PartitionPlan, then update the catalog File pplan_path = new File(args.getParam(ArgumentsParser.PARAM_PARTITION_PLAN)); if (pplan_path.exists()) { PartitionPlan pplan = new PartitionPlan(); pplan.load(pplan_path, args.catalog_db); if (args.getBooleanParam(ArgumentsParser.PARAM_PARTITION_PLAN_REMOVE_PROCS, false)) { for (Procedure catalog_proc : pplan.proc_entries.keySet()) { pplan.setNullProcParameter(catalog_proc); } // FOR } if (args.getBooleanParam(ArgumentsParser.PARAM_PARTITION_PLAN_RANDOM_PROCS, false)) { for (Procedure catalog_proc : pplan.proc_entries.keySet()) { pplan.setRandomProcParameter(catalog_proc); } // FOR } pplan.apply(args.catalog_db); System.out.println("Applied PartitionPlan '" + pplan_path + "' to catalog\n" + pplan); System.out.print(StringUtil.DOUBLE_LINE); if (args.hasParam(ArgumentsParser.PARAM_PARTITION_PLAN_OUTPUT)) { String output = args.getParam(ArgumentsParser.PARAM_PARTITION_PLAN_OUTPUT); if (output.equals("-")) output = pplan_path.getAbsolutePath(); pplan.save(new File(output)); System.out.println("Saved PartitionPlan to '" + output + "'"); } } else { System.err.println("PartitionPlan file '" + pplan_path + "' does not exist. Ignoring..."); } System.out.flush(); int num_intervals = args.num_intervals; // getIntParam(ArgumentsParser.PARAM_DESIGNER_INTERVALS); TimeIntervalCostModel<SingleSitedCostModel> costmodel = new TimeIntervalCostModel<SingleSitedCostModel>( args.catalogContext, SingleSitedCostModel.class, num_intervals); if (args.hasParam(ArgumentsParser.PARAM_DESIGNER_HINTS)) costmodel.applyDesignerHints(args.designer_hints); double cost = costmodel.estimateWorkloadCost(args.catalogContext, args.workload); Map<String, Object> m = new LinkedHashMap<String, Object>(); m.put("PARTITIONS", CatalogUtil.getNumberOfPartitions(args.catalog_db)); m.put("INTERVALS", args.num_intervals); m.put("EXEC COST", costmodel.last_execution_cost); m.put("SKEW COST", costmodel.last_skew_cost); m.put("TOTAL COST", cost); m.put("PARTITIONS TOUCHED", costmodel.getTxnPartitionAccessHistogram().getSampleCount()); System.out.println(StringUtil.formatMaps(m)); // long total = 0; m.clear(); // for (int i = 0; i < num_intervals; i++) { // SingleSitedCostModel cm = costmodel.getCostModel(i); // Histogram<Integer> h = cm.getTxnPartitionAccessHistogram(); // m.put(String.format("Interval %02d", i), // cm.getTxnPartitionAccessHistogram()); // total += h.getSampleCount(); // h.setKeepZeroEntries(true); // for (Integer partition : // CatalogUtil.getAllPartitionIds(args.catalog_db)) { // if (h.contains(partition) == false) h.put(partition, 0); // } // System.out.println(StringUtil.box("Interval #" + i, "+", 100) + "\n" // + h); // System.out.println(); // } // FOR // System.out.println(StringUtil.formatMaps(m)); // System.err.println("TOTAL: " + total); }