diff --git a/goleveldb.go b/goleveldb.go index 8dd3c3ce8..7f0a42376 100644 --- a/goleveldb.go +++ b/goleveldb.go @@ -172,7 +172,12 @@ func (db *GoLevelDB) ForceCompact(start, limit []byte) error { // NewBatch implements DB. func (db *GoLevelDB) NewBatch() Batch { - return newGoLevelDBBatch(db) + return newGoLevelDBBatchWithSize(db, 0) +} + +// NewBatchWithSize implements DB. +func (db *GoLevelDB) NewBatchWithSize(size int) Batch { + return newGoLevelDBBatchWithSize(db, size) } // Iterator implements DB. diff --git a/goleveldb_batch.go b/goleveldb_batch.go index 4c1c6a2ba..0655125f2 100644 --- a/goleveldb_batch.go +++ b/goleveldb_batch.go @@ -12,10 +12,10 @@ type goLevelDBBatch struct { var _ Batch = (*goLevelDBBatch)(nil) -func newGoLevelDBBatch(db *GoLevelDB) *goLevelDBBatch { +func newGoLevelDBBatchWithSize(db *GoLevelDB, size int) *goLevelDBBatch { return &goLevelDBBatch{ db: db, - batch: new(leveldb.Batch), + batch: leveldb.MakeBatch(size), } } diff --git a/memdb.go b/memdb.go index d019af230..15a4118df 100644 --- a/memdb.go +++ b/memdb.go @@ -170,7 +170,12 @@ func (db *MemDB) Stats() map[string]string { // NewBatch implements DB. func (db *MemDB) NewBatch() Batch { - return newMemDBBatch(db) + return newMemDBBatchWithSize(db, 0) +} + +// NewBatchWithSize implements DB. +func (db *MemDB) NewBatchWithSize(size int) Batch { + return newMemDBBatchWithSize(db, size) } // Iterator implements DB. diff --git a/memdb_batch.go b/memdb_batch.go index 6ff30fea6..a88a16009 100644 --- a/memdb_batch.go +++ b/memdb_batch.go @@ -24,11 +24,11 @@ type memDBBatch struct { var _ Batch = (*memDBBatch)(nil) -// newMemDBBatch creates a new memDBBatch -func newMemDBBatch(db *MemDB) *memDBBatch { +// newMemDBBatchWithSize creates a new memDBBatch +func newMemDBBatchWithSize(db *MemDB, _ int) *memDBBatch { return &memDBBatch{ db: db, - ops: []operation{}, + ops: make([]operation, 0), } } diff --git a/prefixdb.go b/prefixdb.go index 0b2d2a1cf..347e67a23 100644 --- a/prefixdb.go +++ b/prefixdb.go @@ -162,6 +162,14 @@ func (pdb *PrefixDB) NewBatch() Batch { return newPrefixBatch(pdb.prefix, pdb.db.NewBatch()) } +// NewBatchWithSize implements DB. +func (pdb *PrefixDB) NewBatchWithSize(size int) Batch { + pdb.mtx.Lock() + defer pdb.mtx.Unlock() + + return newPrefixBatch(pdb.prefix, pdb.db.NewBatchWithSize(size)) +} + // Close implements DB. func (pdb *PrefixDB) Close() error { pdb.mtx.Lock() diff --git a/remotedb/batch.go b/remotedb/batch.go index fe2becb14..ad9ef0479 100644 --- a/remotedb/batch.go +++ b/remotedb/batch.go @@ -17,10 +17,10 @@ type batch struct { var _ db.Batch = (*batch)(nil) -func newBatch(rdb *RemoteDB) *batch { +func newBatchWithSize(rdb *RemoteDB, size int) *batch { return &batch{ db: rdb, - ops: []*protodb.Operation{}, + ops: make([]*protodb.Operation, 0, size), } } diff --git a/remotedb/remotedb.go b/remotedb/remotedb.go index 84a57f20f..44133c673 100644 --- a/remotedb/remotedb.go +++ b/remotedb/remotedb.go @@ -97,7 +97,11 @@ func (rd *RemoteDB) ReverseIterator(start, end []byte) (db.Iterator, error) { } func (rd *RemoteDB) NewBatch() db.Batch { - return newBatch(rd) + return newBatchWithSize(rd, 0) +} + +func (rd *RemoteDB) NewBatchWithSize(size int) db.Batch { + return newBatchWithSize(rd, size) } // TODO: Implement Print when db.DB implements a method diff --git a/types.go b/types.go index 3be412fd2..789fd1db8 100644 --- a/types.go +++ b/types.go @@ -63,6 +63,9 @@ type DB interface { // NewBatch creates a batch for atomic updates. The caller must call Batch.Close. NewBatch() Batch + // NewBatch creates a batch for atomic updates with pre-allocated buffer. The caller must call Batch.Close. + NewBatchWithSize(size int) Batch + // Print is used for debugging. Print() error