mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-03-04 10:25:04 +00:00
Pebble maintains a batch pool to recycle the batch object. Unfortunately batch object must be explicitly returned via `batch.Close` function. This PR extends the batch interface by adding the close function and also invoke batch.Close in some critical code paths. Memory allocation must be measured before merging this change. What's more, it's an open question that whether we should apply batch.Close as much as possible in every invocation.
87 lines
2.8 KiB
Go
87 lines
2.8 KiB
Go
// Copyright 2018 The go-ethereum Authors
|
|
// This file is part of the go-ethereum library.
|
|
//
|
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Lesser General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
package ethdb
|
|
|
|
// IdealBatchSize defines the size of the data batches should ideally add in one
|
|
// write.
|
|
const IdealBatchSize = 100 * 1024
|
|
|
|
// Batch is a write-only database that commits changes to its host database
|
|
// when Write is called. A batch cannot be used concurrently.
|
|
type Batch interface {
|
|
KeyValueWriter
|
|
KeyValueRangeDeleter
|
|
|
|
// ValueSize retrieves the amount of data queued up for writing.
|
|
ValueSize() int
|
|
|
|
// Write flushes any accumulated data to disk.
|
|
Write() error
|
|
|
|
// Reset resets the batch for reuse.
|
|
Reset()
|
|
|
|
// Replay replays the batch contents.
|
|
Replay(w KeyValueWriter) error
|
|
|
|
// Close closes the batch and releases all associated resources.
|
|
Close()
|
|
}
|
|
|
|
// Batcher wraps the NewBatch method of a backing data store.
|
|
type Batcher interface {
|
|
// NewBatch creates a write-only database that buffers changes to its host db
|
|
// until a final write is called.
|
|
NewBatch() Batch
|
|
|
|
// NewBatchWithSize creates a write-only database batch with pre-allocated buffer.
|
|
NewBatchWithSize(size int) Batch
|
|
}
|
|
|
|
// HookedBatch wraps an arbitrary batch where each operation may be hooked into
|
|
// to monitor from black box code.
|
|
type HookedBatch struct {
|
|
Batch
|
|
|
|
OnPut func(key []byte, value []byte) // Callback if a key is inserted
|
|
OnDelete func(key []byte) // Callback if a key is deleted
|
|
OnDeleteRange func(start, end []byte) // Callback if a range of keys is deleted
|
|
}
|
|
|
|
// Put inserts the given value into the key-value data store.
|
|
func (b HookedBatch) Put(key []byte, value []byte) error {
|
|
if b.OnPut != nil {
|
|
b.OnPut(key, value)
|
|
}
|
|
return b.Batch.Put(key, value)
|
|
}
|
|
|
|
// Delete removes the key from the key-value data store.
|
|
func (b HookedBatch) Delete(key []byte) error {
|
|
if b.OnDelete != nil {
|
|
b.OnDelete(key)
|
|
}
|
|
return b.Batch.Delete(key)
|
|
}
|
|
|
|
// DeleteRange removes all keys in the range [start, end) from the key-value data store.
|
|
func (b HookedBatch) DeleteRange(start, end []byte) error {
|
|
if b.OnDeleteRange != nil {
|
|
b.OnDeleteRange(start, end)
|
|
}
|
|
return b.Batch.DeleteRange(start, end)
|
|
}
|