diff --git a/mvcc/backend/backend.go b/mvcc/backend/backend.go index 9f35921a997..cea328ca319 100644 --- a/mvcc/backend/backend.go +++ b/mvcc/backend/backend.go @@ -225,15 +225,7 @@ func (b *backend) Commits() int64 { } func (b *backend) Defrag() error { - err := b.defrag() - if err != nil { - return err - } - - // commit to update metadata like db.size - b.batchTx.Commit() - - return nil + return b.defrag() } func (b *backend) defrag() error { diff --git a/mvcc/backend/batch_tx.go b/mvcc/backend/batch_tx.go index a152a4d4c05..91ac1338a97 100644 --- a/mvcc/backend/batch_tx.go +++ b/mvcc/backend/batch_tx.go @@ -160,25 +160,6 @@ func (t *batchTx) commit(stop bool) { // commit the last tx if t.tx != nil { if t.pending == 0 && !stop { - t.backend.mu.RLock() - defer t.backend.mu.RUnlock() - - // batchTx.commit(true) calls *bolt.Tx.Commit, which - // initializes *bolt.Tx.db and *bolt.Tx.meta as nil, - // and subsequent *bolt.Tx.Size() call panics. - // - // This nil pointer reference panic happens when: - // 1. batchTx.commit(false) from newBatchTx - // 2. batchTx.commit(true) from stopping backend - // 3. batchTx.commit(false) from inflight mvcc Hash call - // - // Check if db is nil to prevent this panic - if t.tx.DB() != nil { - size := t.tx.Size() - db := t.tx.DB() - atomic.StoreInt64(&t.backend.size, size) - atomic.StoreInt64(&t.backend.sizeInUse, size-(int64(db.Stats().FreePageN)*int64(db.Info().PageSize))) - } return } start := time.Now()