diff --git a/lib/mergeset/table.go b/lib/mergeset/table.go index b086531b95..f1c0283156 100644 --- a/lib/mergeset/table.go +++ b/lib/mergeset/table.go @@ -244,6 +244,7 @@ func (ris *rawItemsShard) addItems(tb *Table, items [][]byte) [][]byte { ibs = append(ibs, ib) continue } + ris.mu.Unlock() logger.Panicf("BUG: cannot insert too big item into an empty inmemoryBlock; len(item)=%d; the caller should be responsible for avoiding too big items", len(item)) } ris.ibs = ibs diff --git a/lib/mergeset/table_test.go b/lib/mergeset/table_test.go index 189813e75e..22524c896b 100644 --- a/lib/mergeset/table_test.go +++ b/lib/mergeset/table_test.go @@ -33,6 +33,27 @@ func TestTableOpenClose(t *testing.T) { } } +func TestTableAddItemsTooLongItem(t *testing.T) { + const path = "TestTableAddItemsTooLongItem" + if err := os.RemoveAll(path); err != nil { + t.Fatalf("cannot remove %q: %s", path, err) + } + + var isReadOnly uint32 + tb := MustOpenTable(path, nil, nil, &isReadOnly) + func() { + defer func() { + if r := recover(); r == nil { + t.Fatalf("expecting panic") + } + }() + tb.AddItems([][]byte{make([]byte, maxInmemoryBlockSize+1)}) + }() + t.Logf("foobar") + tb.MustClose() + _ = os.RemoveAll(path) +} + func TestTableAddItemsSerial(t *testing.T) { r := rand.New(rand.NewSource(1)) const path = "TestTableAddItemsSerial"