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"