From 03b63795f07169f6cdba0f47e11b96933953db20 Mon Sep 17 00:00:00 2001 From: Amy Tai Date: Thu, 11 Nov 2021 11:34:50 -0800 Subject: [PATCH] Add functionality in benchmarking code to optionally provide a hand-optimized DDlog program file. In that case, /tmp/program.dl is not compiled using sql-ddlog compiler. Instead, we just copy over contents of the hand-optimized file into /tmp/program.dl. Signed-off-by: Amy Tai --- .../com/vmware/dcm/DDlogDBConnectionPool.java | 46 ++++++++++++------- .../java/com/vmware/dcm/EmulatedCluster.java | 10 ++-- .../com/vmware/dcm/WorkloadReplayTest.java | 3 +- 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/k8s-scheduler/src/main/java/com/vmware/dcm/DDlogDBConnectionPool.java b/k8s-scheduler/src/main/java/com/vmware/dcm/DDlogDBConnectionPool.java index 965b7c77..79f0717e 100644 --- a/k8s-scheduler/src/main/java/com/vmware/dcm/DDlogDBConnectionPool.java +++ b/k8s-scheduler/src/main/java/com/vmware/dcm/DDlogDBConnectionPool.java @@ -9,6 +9,7 @@ import com.vmware.ddlog.util.sql.H2SqlStatement; import ddlogapi.DDlogAPI; import ddlogapi.DDlogException; +import org.apache.commons.io.FileUtils; import org.jooq.DSLContext; import org.jooq.SQLDialect; import org.jooq.conf.ParamCastMode; @@ -17,10 +18,9 @@ import org.jooq.impl.DSL; import org.jooq.tools.jdbc.MockConnection; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; +import javax.annotation.Nullable; +import java.io.*; +import java.nio.Buffer; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -33,11 +33,18 @@ public class DDlogDBConnectionPool implements IConnectionPool { private final List scopedViews; private DDlogJooqProvider provider; + private final String ddlogFile; public DDlogDBConnectionPool() { + this.ddlogFile = null; scopedViews = new ArrayList<>(); } + public DDlogDBConnectionPool(String ddlogFile) { + this.ddlogFile = ddlogFile; + this.scopedViews = new ArrayList<>(); + } + @Override public DSLContext getConnectionToDb() { final MockConnection connection = new MockConnection(provider); @@ -61,19 +68,26 @@ public void addScopedViews(List statements) { scopedViews.addAll(statements); } - private static void compileAndLoad(final List ddl, final List createIndexStatements) + private static void compileAndLoad(final List ddl, final List createIndexStatements, + final String ddlogFile) throws IOException, DDlogException { - final Translator t = new Translator(null); - CalciteToPrestoTranslator ctopTranslator = new CalciteToPrestoTranslator(); - ddl.forEach(x -> t.translateSqlStatement(ctopTranslator.toPresto(x))); - createIndexStatements.forEach(t::translateCreateIndexStatement); - - final DDlogProgram dDlogProgram = t.getDDlogProgram(); final String fileName = "/tmp/program.dl"; - File tmp = new File(fileName); - BufferedWriter bw = new BufferedWriter(new FileWriter(tmp)); - bw.write(dDlogProgram.toString()); - bw.close(); + if (ddlogFile != null) { + // don't compile, instead use this ddlogFile + // Copy ddlogFile contents to fileName + FileUtils.copyFile(new File(ddlogFile), new File(fileName)); + } else { + final Translator t = new Translator(null); + CalciteToPrestoTranslator ctopTranslator = new CalciteToPrestoTranslator(); + ddl.forEach(x -> t.translateSqlStatement(ctopTranslator.toPresto(x))); + createIndexStatements.forEach(t::translateCreateIndexStatement); + + final DDlogProgram dDlogProgram = t.getDDlogProgram(); + File tmp = new File(fileName); + BufferedWriter bw = new BufferedWriter(new FileWriter(tmp)); + bw.write(dDlogProgram.toString()); + bw.close(); + } DDlogAPI.CompilationResult result = new DDlogAPI.CompilationResult(true); final String ddlogHome = System.getenv("DDLOG_HOME"); assertNotNull(ddlogHome); @@ -104,7 +118,7 @@ private void setupDDlog(boolean seal) { DDlogAPI ddlogAPI = null; if (seal) { - compileAndLoad(tablesInCalcite, createIndexStatements); + compileAndLoad(tablesInCalcite, createIndexStatements, ddlogFile); ddlogAPI = new DDlogAPI(1, false); } diff --git a/k8s-scheduler/src/main/java/com/vmware/dcm/EmulatedCluster.java b/k8s-scheduler/src/main/java/com/vmware/dcm/EmulatedCluster.java index d0aa836f..934096a8 100644 --- a/k8s-scheduler/src/main/java/com/vmware/dcm/EmulatedCluster.java +++ b/k8s-scheduler/src/main/java/com/vmware/dcm/EmulatedCluster.java @@ -51,9 +51,9 @@ class EmulatedCluster { public void runTraceLocally(final int numNodes, final String traceFileName, final int cpuScaleDown, final int memScaleDown, final int timeScaleDown, final int startTimeCutOff, - final int affinityRequirementsProportion, final boolean scopeOn) + final int affinityRequirementsProportion, final boolean scopeOn, final String ddlogFile) throws Exception { - final IConnectionPool dbConnectionPool = new DDlogDBConnectionPool(); // new DBConnectionPool(); + final IConnectionPool dbConnectionPool = new DDlogDBConnectionPool(ddlogFile); // new DBConnectionPool(); if (dbConnectionPool instanceof DDlogDBConnectionPool) { ((DDlogDBConnectionPool) dbConnectionPool).buildDDlog(false); } @@ -184,6 +184,8 @@ public static void runWorkload(final String[] args) throws Exception { "P, from 0 to 100, indicating the proportion of pods that have affinity requirements"); options.addOption("S", "scopeOn", false, "enable auto-scope in scheduler"); + options.addOption("df", "ddlogFile", true, + "specify which ddlog program.dl to use"); final CommandLineParser parser = new DefaultParser(); final CommandLine cmd = parser.parse(options, args); final int numNodes = Integer.parseInt(cmd.getOptionValue("numNodes")); @@ -195,13 +197,15 @@ public static void runWorkload(final String[] args) throws Exception { final int affinityRequirementsProportion = Integer.parseInt(cmd.hasOption("proportion") ? cmd.getOptionValue("proportion") : "0"); final boolean scopeOn = cmd.hasOption("scopeOn"); + final String ddlogFile = cmd.getOptionValue("ddlogFile"); + assert affinityRequirementsProportion >= 0 && affinityRequirementsProportion <= 100; LOG.info("Running experiment with parameters: numNodes: {}, traceFile: {}, cpuScaleDown: {}, " + "memScaleDown: {}, timeScaleDown: {}, startTimeCutOff: {}, proportion: {}, scopeOn: {}", numNodes, traceFile, cpuScaleDown, memScaleDown, timeScaleDown, startTimeCutOff, affinityRequirementsProportion, scopeOn); emulatedCluster.runTraceLocally(numNodes, traceFile, cpuScaleDown, memScaleDown, timeScaleDown, - startTimeCutOff, affinityRequirementsProportion, scopeOn); + startTimeCutOff, affinityRequirementsProportion, scopeOn, ddlogFile); } public static void main(final String[] args) throws Exception { diff --git a/k8s-scheduler/src/test/java/com/vmware/dcm/WorkloadReplayTest.java b/k8s-scheduler/src/test/java/com/vmware/dcm/WorkloadReplayTest.java index e18e89cb..89867d00 100644 --- a/k8s-scheduler/src/test/java/com/vmware/dcm/WorkloadReplayTest.java +++ b/k8s-scheduler/src/test/java/com/vmware/dcm/WorkloadReplayTest.java @@ -12,7 +12,8 @@ public class WorkloadReplayTest { @Test public void runTest() throws Exception { final String[] args = - {"-n", "500", "-f", "test-data.txt", "-c", "100", "-m", "200", "-t", "100", "-s", "1000"}; + {"-n", "500", "-f", "test-data.txt", "-c", "100", "-m", "200", "-t", "100", "-s", "1000", "-df", + "../artifacts/optimized_ddlog_programs/preempt_program.dl.dl"}; EmulatedCluster.runWorkload(args); }