Skip to content

Commit fe281b1

Browse files
ClI changes for workloads (#34)
* workload cli changes * fix for list_workloads * support to run mutiple workloads * storing list of all workloads * workloads cli changes * review changes cli * edge case for other runs * review change for files * fixes for cli changes * minor changes * .gitignore updated Co-authored-by: shaharuk-yb <[email protected]>
1 parent 6b6ba3d commit fe281b1

File tree

3 files changed

+188
-10
lines changed

3 files changed

+188
-10
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
docker/**/*.zip
44
docker/**/output
55
results
6+
allWorkloads.txt
67

78
### SQLite ###
89
**/*.db
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
type: YUGABYTE
2+
driver: com.yugabyte.Driver
3+
url: jdbc:yugabytedb://localhost:5433/yugabyte?sslmode=disable&ApplicationName=featurebench&reWriteBatchedInserts=true
4+
username: yugabyte
5+
password:
6+
batchsize: 128
7+
isolation: TRANSACTION_REPEATABLE_READ
8+
loaderthreads: 1
9+
terminals: 1
10+
collect_pg_stat_statements: true
11+
works:
12+
work:
13+
time_secs: 10
14+
rate: 1000
15+
warmup: 0
16+
microbenchmark:
17+
class: com.oltpbenchmark.benchmarks.featurebench.customworkload.YBDefaultMicroBenchmark
18+
properties:
19+
setAutoCommit : true
20+
create:
21+
- DROP TABLE IF EXISTS demo100col;
22+
- CREATE TABLE demo100col (id INT, col1 TEXT, col2 TEXT, col3 TEXT, col4 TEXT, col5 TEXT, col6 TEXT, col7 TEXT, col8 TEXT, col9 TEXT, col10 TEXT, col11 TEXT, col12 TEXT, col13 TEXT, col14 TEXT, col15 TEXT, col16 TEXT, col17 TEXT, col18 TEXT, col19 TEXT, col20 TEXT, col21 TEXT, col22 TEXT, col23 TEXT, col24 TEXT, col25 TEXT, col26 TEXT, col27 TEXT, col28 TEXT, col29 TEXT, col30 TEXT, col31 TEXT, col32 TEXT, col33 TEXT, col34 TEXT, col35 TEXT, col36 TEXT, col37 TEXT, col38 TEXT, col39 TEXT, col40 TEXT, col41 TEXT, col42 TEXT, col43 TEXT, col44 TEXT, col45 TEXT, col46 TEXT, col47 TEXT, col48 TEXT, col49 TEXT, col50 TEXT, col51 TEXT, col52 TEXT, col53 TEXT, col54 TEXT, col55 TEXT, col56 TEXT, col57 TEXT, col58 TEXT, col59 TEXT, col60 TEXT, col61 TEXT, col62 TEXT, col63 TEXT, col64 TEXT, col65 TEXT, col66 TEXT, col67 TEXT, col68 TEXT, col69 TEXT, col70 TEXT, col71 TEXT, col72 TEXT, col73 TEXT, col74 TEXT, col75 TEXT, col76 TEXT, col77 TEXT, col78 TEXT, col79 TEXT, col80 TEXT, col81 TEXT, col82 TEXT, col83 TEXT, col84 TEXT, col85 TEXT, col86 TEXT, col87 TEXT, col88 TEXT, col89 TEXT, col90 TEXT, col91 TEXT, col92 TEXT, col93 TEXT, col94 TEXT, col95 TEXT, col96 TEXT, col97 TEXT, col98 TEXT, col99 TEXT, col100 TEXT, primary key (id ASC)) ;
23+
loadRules:
24+
- table: demo100col
25+
rows: 10
26+
columns:
27+
- name: id
28+
util: PrimaryIntGen
29+
params:
30+
- 1
31+
- 1000
32+
- name: col
33+
count: 100
34+
util: RandomStringNumeric
35+
params:
36+
- 128
37+
executeRules:
38+
- workload: RangeScan1
39+
run:
40+
- name: ReadQuery1
41+
weight: 50
42+
queries:
43+
- query: SELECT * FROM demo100col WHERE id < 10
44+
45+
- name: WriteQuery1
46+
weight: 50
47+
queries:
48+
- query: UPDATE demo100col set col2 = ? where id = ?
49+
bindings:
50+
- util: RandomAString
51+
params:
52+
- 10
53+
- 20
54+
- util: RandomNumber
55+
params:
56+
- 1
57+
- 1000
58+
59+
60+
- workload: RangeScan2
61+
run:
62+
- name: ReadQuery2
63+
weight: 50
64+
queries:
65+
- query: SELECT * FROM demo100col WHERE id < 10
66+
67+
- name: WriteQuery2
68+
weight: 50
69+
queries:
70+
- query: UPDATE demo100col set col3 = ? where id = ?
71+
bindings:
72+
- util: RandomAString
73+
params:
74+
- 10
75+
- 20
76+
- util: RandomNumber
77+
params:
78+
- 1
79+
- 1000
80+
- workload: RangeScan3
81+
run:
82+
- name: ReadQuery3
83+
weight: 50
84+
queries:
85+
- query: SELECT * FROM demo100col WHERE id < 50
86+
87+
- name: WriteQuery3
88+
weight: 50
89+
queries:
90+
- query: UPDATE demo100col set col4 = ? where id = ?
91+
bindings:
92+
- util: RandomAString
93+
params:
94+
- 10
95+
- 20
96+
- util: RandomNumber
97+
params:
98+
- 1
99+
- 1000

src/main/java/com/oltpbenchmark/DBWorkload.java

+88-10
Original file line numberDiff line numberDiff line change
@@ -198,21 +198,69 @@ public static void main(String[] args) throws Exception {
198198
numTxnTypes = xmlConfig.configurationsAt("transactiontypes" + pluginTest + "/transactiontype").size();
199199
}
200200

201-
List<HierarchicalConfiguration<ImmutableNode>> workloads = xmlConfig.configurationsAt("microbenchmark/properties/executeRules");
201+
List<HierarchicalConfiguration<ImmutableNode>> workloads =
202+
xmlConfig.configurationsAt("microbenchmark/properties/executeRules");
202203

203-
int totalworkcount = plugin.equalsIgnoreCase("featurebench") ? (workloads == null ? 1 : (workloads.size() == 0 ? 1 : workloads.size())) : 1;
204+
int totalWorkloadCount =
205+
plugin.equalsIgnoreCase("featurebench") ?
206+
(workloads == null ? 1 : (workloads.size() == 0 ? 1 : workloads.size())) : 1;
204207

205208
boolean createDone = false;
206209
boolean loadDone = false;
207210

208-
for (int workcount = 1; workcount <= totalworkcount; workcount++) {
209211

210-
List<HierarchicalConfiguration<ImmutableNode>> executeRules = (workloads == null || workloads.size() == 0) ? null : workloads.get(workcount - 1).configurationsAt("run");
211-
if (executeRules == null) {
212-
LOG.info("Starting Workload " + workcount);
212+
Set<String> uniqueRunWorkloads = new HashSet<>();
213+
List<String> workloadsFromExecuteRules = new ArrayList<>();
214+
215+
if (workloads != null && workloads.size() != 0) {
216+
for (int workCount = 1; workCount <= totalWorkloadCount; workCount++) {
217+
workloadsFromExecuteRules.add(workloads.get(workCount - 1)
218+
.containsKey("workload") ? workloads.get(workCount - 1)
219+
.getString("workload") : String.valueOf(workCount));
220+
}
221+
}
222+
223+
String fileForAllWorkloadList = "allWorkloads" + ".txt";
224+
try (PrintStream ps = new PrintStream(FileUtil.joinPath(fileForAllWorkloadList))) {
225+
if (workloads != null && workloads.size() != 0) {
226+
System.out.println("All Workloads:");
227+
for (int workCount = 1; workCount <= totalWorkloadCount; workCount++) {
228+
ps.println((workloads.get(workCount - 1)
229+
.containsKey("workload") ? workloads.get(workCount - 1).getString("workload") : workCount));
230+
System.out.println((workloads.get(workCount - 1)
231+
.containsKey("workload") ? workloads.get(workCount - 1).getString("workload") : workCount));
232+
}
233+
}
234+
}
235+
236+
if (isBooleanOptionSet(argsLine, "execute")) {
237+
String targetWorkloads;
238+
List<String> RunWorkloads;
239+
if ((argsLine.hasOption("workloads")) && !argsLine.getOptionValue("workloads").isEmpty()) {
240+
targetWorkloads = argsLine.getOptionValue("workloads");
241+
RunWorkloads = List.of(targetWorkloads.trim().split("\\s*,\\s*"));
242+
uniqueRunWorkloads.addAll(RunWorkloads);
243+
uniqueRunWorkloads.forEach(uniqueWorkload -> {
244+
if (workloadsFromExecuteRules.contains(uniqueWorkload)) {
245+
LOG.info("Workload: " + uniqueWorkload + " will be scheduled to run");
246+
} else {
247+
throw new RuntimeException("Wrong workload name provided in --workloads args: " + uniqueWorkload);
248+
}
249+
});
213250
} else {
214-
LOG.info("Starting Workload " + (workloads.get(workcount - 1).containsKey("workload") ? workloads.get(workcount - 1).getString("workload") : workcount));
251+
workloadsFromExecuteRules
252+
.forEach(workloadFromExecuteRule -> LOG.info("Workload: "
253+
+ workloadFromExecuteRule + " will be scheduled to run"));
215254
}
255+
}
256+
257+
258+
for (int workCount = 1; workCount <= totalWorkloadCount; workCount++) {
259+
260+
List<HierarchicalConfiguration<ImmutableNode>> executeRules =
261+
(workloads == null || workloads.size() == 0) ? null : workloads.get(workCount - 1)
262+
.configurationsAt("run");
263+
216264

217265
boolean isExecutePresent = xmlConfig.containsKey("microbenchmark/properties/execute");
218266
boolean isExecuteTrue = false;
@@ -570,12 +618,41 @@ public static void main(String[] args) throws Exception {
570618
LOG.debug("Skipping loading benchmark database records");
571619
}
572620

621+
622+
if (isBooleanOptionSet(argsLine, "execute") && (argsLine.hasOption("workloads")) && executeRules != null) {
623+
String val = workloads.get(workCount - 1).getString("workload");
624+
if (uniqueRunWorkloads.contains(val)) {
625+
LOG.info("Starting Workload " + (workloads.get(workCount - 1).containsKey("workload") ? workloads.get(workCount - 1).getString("workload") : workCount));
626+
try {
627+
Results r = runWorkload(benchList, intervalMonitor, workCount);
628+
writeOutputs(r, activeTXTypes, argsLine, xmlConfig, executeRules == null ? null : workloads.get(workCount - 1).getString("workload"));
629+
writeHistograms(r);
630+
631+
if (argsLine.hasOption("json-histograms")) {
632+
String histogram_json = writeJSONHistograms(r);
633+
String fileName = argsLine.getOptionValue("json-histograms");
634+
FileUtil.writeStringToFile(new File(fileName), histogram_json);
635+
LOG.info("Histograms JSON Data: " + fileName);
636+
}
637+
} catch (Throwable ex) {
638+
LOG.error("Unexpected error when executing benchmarks.", ex);
639+
System.exit(1);
640+
}
641+
}
642+
}
643+
644+
573645
// Execute Workload
574-
if (isBooleanOptionSet(argsLine, "execute")) {
646+
else if (isBooleanOptionSet(argsLine, "execute")) {
647+
if (executeRules == null) {
648+
LOG.info("Starting Workload " + workCount);
649+
} else {
650+
LOG.info("Starting Workload " + (workloads.get(workCount - 1).containsKey("workload") ? workloads.get(workCount - 1).getString("workload") : workCount));
651+
}
575652
// Bombs away!
576653
try {
577-
Results r = runWorkload(benchList, intervalMonitor, workcount);
578-
writeOutputs(r, activeTXTypes, argsLine, xmlConfig, executeRules == null ? null : workloads.get(workcount - 1).getString("workload"));
654+
Results r = runWorkload(benchList, intervalMonitor, workCount);
655+
writeOutputs(r, activeTXTypes, argsLine, xmlConfig, executeRules == null ? null : workloads.get(workCount - 1).getString("workload"));
579656
writeHistograms(r);
580657

581658
if (argsLine.hasOption("json-histograms")) {
@@ -613,6 +690,7 @@ private static Options buildOptions(XMLConfiguration pluginConfig) {
613690
options.addOption("d", "directory", true, "Base directory for the result files, default is current directory");
614691
options.addOption(null, "dialects-export", true, "Export benchmark SQL to a dialects file");
615692
options.addOption("jh", "json-histograms", true, "Export histograms to JSON file");
693+
options.addOption("workloads", "workloads", true, "Run some specific workloads");
616694
return options;
617695
}
618696

0 commit comments

Comments
 (0)