mcp: handle empty chunks in MemoryEventStore (#862)

When purging chunks, allow empty chunks without panicking.

Fixes #860.
This commit is contained in:
Jonathan Amsterdam 2026-03-27 11:58:03 -04:00 • committed by GitHub
commit 150bca797d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 28 additions and 4 deletions

View file

@ -376,10 +376,11 @@ func (s *MemoryEventStore) purge() {
for _, dl := range sm {
if dl.size > 0 {
r := dl.removeFirst()
if r > 0 {
changed = true
s.nBytes -= r
}
// Even if we remove an empty chunk, that's
// still progress. There may be non-empty
// chunks after it.
changed = true
s.nBytes -= r
}
}
}

View file

@ -327,6 +327,29 @@ func TestMemoryEventStoreAfter(t *testing.T) {
}
}
func TestMemoryEventStorePurgeEmpty(t *testing.T) {
ctx := context.Background()
s := NewMemoryEventStore(nil)
s.SetMaxBytes(100)
// Append an empty chunk first.
if err := s.Append(ctx, "S1", "1", []byte("")); err != nil {
t.Fatal(err)
}
// Append a non-empty chunk.
if err := s.Append(ctx, "S1", "1", []byte("1234567890")); err != nil {
t.Fatal(err)
}
// Now nBytes = 10, but the first chunk is empty.
// This should not panic.
s.SetMaxBytes(5)
if s.nBytes > 5 {
t.Errorf("got nBytes %d, want <= 5", s.nBytes)
}
}
func BenchmarkMemoryEventStore(b *testing.B) {
// Benchmark with various settings for event store size, number of session,
// and payload size.