For memory store KV with history of 1 we were scanning for our next first when we did not have to.

Signed-off-by: Derek Collison <derek@nats.io>
This commit is contained in:
Derek Collison
2022-04-26 19:55:47 -07:00
parent 981385401a
commit 138034b3a1
2 changed files with 37 additions and 1 deletions

View File

@@ -17359,3 +17359,34 @@ func Benchmark_JetStream10x1kWorker(b *testing.B) {
func Benchmark_JetStream4x512Worker(b *testing.B) {
benchJetStreamWorkersAndBatch(b, 4, 512)
}
func TestJetStreamKVMemoryStorePerf(t *testing.T) {
// Comment out to run, holding place for now.
t.SkipNow()
s := RunBasicJetStreamServer()
if config := s.JetStreamConfig(); config != nil {
defer removeDir(t, config.StoreDir)
}
defer s.Shutdown()
nc, js := jsClientConnect(t, s)
defer nc.Close()
kv, err := js.CreateKeyValue(&nats.KeyValueConfig{Bucket: "TEST", History: 1, Storage: nats.MemoryStorage})
require_NoError(t, err)
start := time.Now()
for i := 0; i < 100_000; i++ {
_, err := kv.PutString(fmt.Sprintf("foo.%d", i), "HELLO")
require_NoError(t, err)
}
fmt.Printf("Took %v for first run\n", time.Since(start))
start = time.Now()
for i := 0; i < 100_000; i++ {
_, err := kv.PutString(fmt.Sprintf("foo.%d", i), "HELLO")
require_NoError(t, err)
}
fmt.Printf("Took %v for second run\n", time.Since(start))
}

View File

@@ -753,7 +753,12 @@ func (ms *memStore) removeSeqPerSubject(subj string, seq uint64) {
if seq != ss.First {
return
}
// TODO(dlc) - Might want to optimize this.
// If we know we only have 1 msg left don't need to search for next first.
if ss.Msgs == 1 {
ss.First = ss.Last
return
}
// TODO(dlc) - Might want to optimize this longer term.
for tseq := seq + 1; tseq <= ss.Last; tseq++ {
if sm := ms.msgs[tseq]; sm != nil && sm.subj == subj {
ss.First = tseq