From 0dfae767e834d2a6927cfe3cb482df7efac13274 Mon Sep 17 00:00:00 2001 From: Willem Kaufmann Date: Thu, 12 Dec 2024 16:36:23 -0500 Subject: [PATCH] `producer_worker`: revert use of `ValueGenerator::Generate()` Using the modified `Generate()` function was a lot slower than just simply making an empty payload: ``` Benchmark_random_payload10-32 2445903 485.2 ns/op Benchmark_random_payload100-32 678870 1773 ns/op Benchmark_random_payload1000-32 105667 13700 ns/op Benchmark_random_payload1e4-32 9104 126782 ns/op Benchmark_random_payload1e5-32 1135 1151425 ns/op Benchmark_random_payload1e6-32 100 13046547 ns/op ========================================================== Benchmark_empty_payload10-32 79950942 20.54 ns/op Benchmark_empty_payload100-32 24089101 54.78 ns/op Benchmark_empty_payload1000-32 3789248 366.1 ns/op Benchmark_empty_payload1e4-32 670096 2059 ns/op Benchmark_empty_payload1e5-32 58912 23021 ns/op Benchmark_empty_payload1e6-32 5600 290045 ns/op ``` As can be seen, generating the random payload and ensuring it is UTF-8 valid is orders of magnitude slower than the empty payload. Revert the use of `Generate()` here in place of the empty payload. However, if the user has indicated they want to validate the latest key-value pair produced, generate a `(value-{%018d}, offset)` message in the record. This does mean that message sizes that are less than 24 bytes are not honored if the `validate-latest-values` flag is passed. --- pkg/worker/verifier/producer_worker.go | 19 +++++++++++++++++-- pkg/worker/worker.go | 4 ---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/pkg/worker/verifier/producer_worker.go b/pkg/worker/verifier/producer_worker.go index 982d8f4..c53bc58 100644 --- a/pkg/worker/verifier/producer_worker.go +++ b/pkg/worker/verifier/producer_worker.go @@ -121,10 +121,25 @@ func (pw *ProducerWorker) newRecord(producerId int, sequence int64) *kgo.Record pw.Status.AbortedTransactionMessages += 1 } - payload := pw.config.valueGenerator.Generate() - if payload == nil { + var payload []byte + isTombstone := rand.Float64() < pw.config.valueGenerator.TombstoneProbability + if isTombstone { + payload = nil pw.Status.TombstonesProduced += 1 + } else { + if pw.validateLatestValues { + var value bytes.Buffer + fmt.Fprintf(&value, "value-%018d", sequence) + paddingSize := pw.config.messageSize - value.Len() + if paddingSize > 0 { + value.Write(make([]byte, paddingSize)) + } + payload = value.Bytes() + } else { + payload = make([]byte, pw.config.messageSize) + } } + var r *kgo.Record if pw.config.keySetCardinality < 0 { diff --git a/pkg/worker/worker.go b/pkg/worker/worker.go index 10f31a3..9a7b5c6 100644 --- a/pkg/worker/worker.go +++ b/pkg/worker/worker.go @@ -108,10 +108,6 @@ type ValueGenerator struct { var compressible_payload []byte func (vg *ValueGenerator) Generate() []byte { - isTombstone := rand.Float64() < vg.TombstoneProbability - if isTombstone { - return nil - } if vg.Compressible { // Zeros, which is about as compressible as an array can be. if len(compressible_payload) == 0 {