Skip to content

Commit a7fe80d

Browse files
committed
asim: fix one-off formatting in rand testing
Previously, some one-off formatting introduced extra lines in the randomized testing output. This commit fixes the issue and makes the formatting approach more consistent and principled.
1 parent c0b15a2 commit a7fe80d

File tree

13 files changed

+132
-134
lines changed

13 files changed

+132
-134
lines changed

pkg/kv/kvserver/asim/gen/generator.go

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,14 @@ type MultiLoad []BasicLoad
103103
var _ LoadGen = MultiLoad{}
104104

105105
func (ml MultiLoad) String() string {
106-
var str string
107-
for _, load := range ml {
108-
str += load.String()
106+
var buf strings.Builder
107+
for i, load := range ml {
108+
_, _ = fmt.Fprintf(&buf, "%s", load.String())
109+
if i != len(ml)-1 {
110+
_, _ = fmt.Fprintf(&buf, "\n")
111+
}
109112
}
110-
return str
113+
return buf.String()
111114
}
112115

113116
func (ml MultiLoad) Generate(seed int64, settings *config.SimulationSettings) []workload.Generator {
@@ -161,7 +164,7 @@ func (bl BasicLoad) String() string {
161164
} else {
162165
_, _ = fmt.Fprintf(&buf, "%d-%dB/op, ", bl.MinBlockSize, bl.MaxBlockSize)
163166
}
164-
fmt.Fprintf(&buf, "%gops/s]\n", bl.Rate)
167+
fmt.Fprintf(&buf, "%gops/s]", bl.Rate)
165168
return buf.String()
166169
}
167170

@@ -420,11 +423,14 @@ type MultiRanges []BasicRanges
420423
var _ RangeGen = MultiRanges{}
421424

422425
func (mr MultiRanges) String() string {
423-
var str string
424-
for _, ranges := range mr {
425-
str += fmt.Sprintf("%s\n", ranges.String())
426+
var buf strings.Builder
427+
for i, ranges := range mr {
428+
_, _ = fmt.Fprintf(&buf, "%s", ranges.String())
429+
if i != len(mr)-1 {
430+
_, _ = fmt.Fprintf(&buf, "\n")
431+
}
426432
}
427-
return str
433+
return buf.String()
428434
}
429435

430436
func (mr MultiRanges) Generate(
@@ -439,8 +445,11 @@ func (mr MultiRanges) Generate(
439445
}
440446
state.LoadRangeInfo(s, rangeInfos...)
441447
var buf strings.Builder
442-
for _, str := range rangeInfoStrings {
443-
_, _ = fmt.Fprintf(&buf, "%s\n", str)
448+
for i, str := range rangeInfoStrings {
449+
_, _ = fmt.Fprintf(&buf, "%s", str)
450+
if i != len(rangeInfoStrings)-1 {
451+
_, _ = fmt.Fprintf(&buf, "\n")
452+
}
444453
}
445454
return s, buf.String()
446455
}

pkg/kv/kvserver/asim/gen/printer.go

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,11 @@ import (
1919
// Returns an empty string if no changes are found.
2020
func compareSettingsToDefault(settings config.SimulationSettings) string {
2121
defaultSettings := config.DefaultSimulationSettings()
22-
var changes []string
23-
2422
// Use reflection to compare all fields
2523
settingsVal := reflect.ValueOf(settings)
2624
defaultVal := reflect.ValueOf(*defaultSettings)
2725
settingsType := reflect.TypeOf(settings)
26+
var buf strings.Builder
2827

2928
for i := 0; i < settingsVal.NumField(); i++ {
3029
field := settingsType.Field(i)
@@ -39,18 +38,17 @@ func compareSettingsToDefault(settings config.SimulationSettings) string {
3938
}
4039

4140
if !reflect.DeepEqual(settingsFieldVal.Interface(), defaultFieldVal.Interface()) {
42-
changes = append(changes, fmt.Sprintf("\t%s: %v (default: %v)",
41+
if buf.Len() != 0 {
42+
_, _ = fmt.Fprintf(&buf, "\n")
43+
}
44+
_, _ = fmt.Fprintf(&buf, "\t%s: %v (default: %v)",
4345
field.Name,
4446
settingsFieldVal.Interface(),
45-
defaultFieldVal.Interface()))
47+
defaultFieldVal.Interface())
4648
}
4749
}
4850

49-
if len(changes) == 0 {
50-
return ""
51-
}
52-
53-
return strings.Join(changes, "\n")
51+
return buf.String()
5452
}
5553

5654
// generateClusterVisualization generates a visualization of the cluster state.
@@ -82,14 +80,21 @@ func generateClusterVisualization(
8280
if buf == nil {
8381
return
8482
}
85-
_, _ = fmt.Fprintf(buf, "Cluster Set Up\n")
86-
_, _ = fmt.Fprintf(buf, "%v", s.NodesString())
87-
_, _ = fmt.Fprintf(buf, "Key Space\n%s", rangeStateStr)
88-
_, _ = fmt.Fprintf(buf, "Event\n%s", eventGen.String())
89-
_, _ = fmt.Fprintf(buf, "Workload Set Up\n%s", loadGen.String())
90-
91-
// Only print settings section if there are changes from defaults.
92-
if settingsChanges := compareSettingsToDefault(settings); settingsChanges != "" {
93-
_, _ = fmt.Fprintf(buf, "Changed Settings\n%s\n", settingsChanges)
83+
// Helper function to return "empty" if string is empty, otherwise return the string
84+
emptyIfBlank := func(s string) string {
85+
if s == "" {
86+
return "\tempty"
87+
}
88+
return s
9489
}
90+
clusterSetUp := emptyIfBlank(s.NodesString())
91+
rangeState := emptyIfBlank(rangeStateStr)
92+
event := emptyIfBlank(eventGen.String())
93+
workloadSetUp := emptyIfBlank(loadGen.String())
94+
settingsChanges := emptyIfBlank(compareSettingsToDefault(settings))
95+
_, _ = fmt.Fprintf(buf, "Cluster Set Up\n%s\n", clusterSetUp)
96+
_, _ = fmt.Fprintf(buf, "Key Space\n%s\n", rangeState)
97+
_, _ = fmt.Fprintf(buf, "Event\n%s\n", event)
98+
_, _ = fmt.Fprintf(buf, "Workload Set Up\n%s\n", workloadSetUp)
99+
_, _ = fmt.Fprintf(buf, "Changed Settings\n%s", settingsChanges)
95100
}

pkg/kv/kvserver/asim/scheduled/scheduled_event_executor.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,12 @@ func (e *eventExecutor) PrintEventSummary() string {
7272
mutationEvents, assertionEvents := 0, 0
7373
var buf strings.Builder
7474
sort.Sort(e.scheduledEvents)
75-
for _, e := range e.scheduledEvents {
76-
_, _ = fmt.Fprintf(&buf, "%v\n", e)
77-
if e.IsMutationEvent() {
75+
for i, event := range e.scheduledEvents {
76+
_, _ = fmt.Fprintf(&buf, "%v", event)
77+
if i != len(e.scheduledEvents)-1 {
78+
_, _ = fmt.Fprintf(&buf, "\n")
79+
}
80+
if event.IsMutationEvent() {
7881
mutationEvents++
7982
} else {
8083
assertionEvents++
@@ -102,12 +105,15 @@ func (e *eventExecutor) PrintEventsExecuted() string {
102105
panic("unexpected")
103106
}
104107
if len(e.scheduledEvents) == 0 {
105-
return fmt.Sprintln("no events were scheduled")
108+
return "no events were scheduled"
106109
} else {
107110
buf := strings.Builder{}
108111
buf.WriteString(fmt.Sprintf("%d events executed:\n", len(e.scheduledEvents)))
109-
for _, event := range e.scheduledEvents {
110-
buf.WriteString(fmt.Sprintln(event.String()))
112+
for i, event := range e.scheduledEvents {
113+
_, _ = fmt.Fprintf(&buf, "%v", event.String())
114+
if i != len(e.scheduledEvents)-1 {
115+
_, _ = fmt.Fprintf(&buf, "\n")
116+
}
111117
}
112118
return buf.String()
113119
}

pkg/kv/kvserver/asim/state/impl.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1436,7 +1436,7 @@ func (s *state) NodesString() string {
14361436
return cmp.Compare(a.nodeID, b.nodeID)
14371437
})
14381438

1439-
for _, n := range nodes {
1439+
for nID, n := range nodes {
14401440
_, _ = fmt.Fprintf(&buf, "\tn%d(", n.nodeID)
14411441
for _, locality := range n.desc.Locality.Tiers {
14421442
_, _ = fmt.Fprintf(&buf, "%s,", locality.Value)
@@ -1458,7 +1458,10 @@ func (s *state) NodesString() string {
14581458
_, _ = fmt.Fprintf(&buf, ",")
14591459
}
14601460
}
1461-
_, _ = fmt.Fprintf(&buf, "}\n")
1461+
_, _ = fmt.Fprintf(&buf, "}")
1462+
if nID != len(nodes)-1 {
1463+
_, _ = fmt.Fprintf(&buf, "\n")
1464+
}
14621465
}
14631466
return buf.String()
14641467
}

pkg/kv/kvserver/asim/tests/datadriven_simulation_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -584,13 +584,13 @@ func TestDataDriven(t *testing.T) {
584584
sample+1, failString)
585585
}
586586
}
587-
_, _ = fmt.Fprintf(&buf, "==========================\n")
587+
_, _ = fmt.Fprint(&buf, "==========================\n")
588588
})
589589
}
590590
writeStateStrToFile(t, filepath.Join(plotDir, fmt.Sprintf("%s_setup.txt", name)), stateStrForOnce, rewrite)
591591
if full {
592-
_, _ = fmt.Fprintf(&buf, stateStrForOnce)
593-
_, _ = fmt.Fprintf(&buf, "==========================\n")
592+
_, _ = fmt.Fprintf(&buf, "%v\n", stateStrForOnce)
593+
_, _ = fmt.Fprint(&buf, "==========================\n")
594594
}
595595
return buf.String()
596596
case "assertion":

pkg/kv/kvserver/asim/tests/output.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -149,21 +149,29 @@ func (tr testResultsReport) String() string {
149149
buf.WriteString(fmt.Sprintf("sample%d: start running\n", nthSample))
150150
if failed || tr.flags.Has(OutputConfigGen) {
151151
buf.WriteString(fmt.Sprintf("configurations generated using seed %d\n", output.seed))
152-
buf.WriteString(fmt.Sprintf("\t%v\n", output.clusterGen))
153-
buf.WriteString(fmt.Sprintf("\t%v\n", output.rangeGen))
154-
buf.WriteString(fmt.Sprintf("%v", output.loadGen))
155-
buf.WriteString(fmt.Sprintf("\t%v\n", output.eventGen))
152+
clusterGenStr, rangeGenStr, loadGenStr, eventGenStr :=
153+
output.clusterGen.String(), output.rangeGen.String(), output.loadGen.String(), output.eventGen.String()
154+
emptyIfBlank := func(s string) string {
155+
if s == "" {
156+
return "empty"
157+
}
158+
return s
159+
}
160+
buf.WriteString(fmt.Sprintf("\t%v\n", emptyIfBlank(clusterGenStr)))
161+
buf.WriteString(fmt.Sprintf("\t%v\n", emptyIfBlank(rangeGenStr)))
162+
buf.WriteString(fmt.Sprintf("%v\n", emptyIfBlank(loadGenStr)))
163+
buf.WriteString(fmt.Sprintf("\t%v\n", emptyIfBlank(eventGenStr)))
156164
}
157165
if failed || tr.flags.Has(OutputInitialState) {
158166
buf.WriteString(fmt.Sprintf("initial state at %s:\n", output.initialTime.Format("2006-01-02 15:04:05")))
159-
buf.WriteString(fmt.Sprintf("%v\n", output.initialStateStr))
167+
buf.WriteString(fmt.Sprintf("\t%v\n", output.initialStateStr))
160168
}
161169
if failed || tr.flags.Has(OutputTopology) {
162170
topology := output.history.S.Topology()
163171
buf.WriteString(fmt.Sprintf("topology:\n%s", topology.String()))
164172
}
165173
if failed || tr.flags.Has(OutputEvents) {
166-
buf.WriteString(output.eventExecutor.PrintEventsExecuted())
174+
buf.WriteString(fmt.Sprintf("%v\n", output.eventExecutor.PrintEventsExecuted()))
167175
}
168176
if failed {
169177
buf.WriteString(fmt.Sprintf("sample%d: failed assertion\n%s\n", nthSample, output.reason))

pkg/kv/kvserver/asim/tests/testdata/generated/example_rebalancing/example_rebalancing_setup.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ Event
1313
Workload Set Up
1414
[1,10000): 95%r large-block [128-256B/op, 7000ops/s]
1515
Changed Settings
16-
StateExchangeDelay: 20s (default: 500ms)
16+
StateExchangeDelay: 20s (default: 500ms)

pkg/kv/kvserver/asim/tests/testdata/non_rand/mma_skewed_cpu_skewed_write.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,10 @@ Key Space
6565
[1,10000): 36(rf=3), 256MiB, [{s1*,s2,s3}:36]
6666
[10001,20000): 36(rf=3), 256MiB, [{s4*,s5,s6}:36]
6767
Event
68-
set LBRebalancingMode to 4
68+
set LBRebalancingMode to 3
6969
Workload Set Up
7070
[1,10000): read-only high-cpu [500.00cpu-us/op, 1B/op, 1000ops/s]
7171
[10001,20000): write-only large-block [0.00cpu-us/write(raft), 1000B/op, 20000ops/s]
7272
Changed Settings
73-
ReplicateQueueEnabled: false (default: true)
74-
LeaseQueueEnabled: false (default: true)
7573
SplitQueueEnabled: false (default: true)
7674
==========================

0 commit comments

Comments
 (0)