Merge pull request #3514 from nspcc-dev/microoptimize-chaindump

chaindump: microoptimize memory management
This commit is contained in:
Anna Shaleva 2024-07-16 16:54:41 +03:00 committed by GitHub
commit c207b9b194
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -20,13 +20,14 @@ type DumperRestorer interface {
// Dump writes count blocks from start to the provided writer. // Dump writes count blocks from start to the provided writer.
// Note: header needs to be written separately by a client. // Note: header needs to be written separately by a client.
func Dump(bc DumperRestorer, w *io.BinWriter, start, count uint32) error { func Dump(bc DumperRestorer, w *io.BinWriter, start, count uint32) error {
var buf = io.NewBufBinWriter()
for i := start; i < start+count; i++ { for i := start; i < start+count; i++ {
bh := bc.GetHeaderHash(i) bh := bc.GetHeaderHash(i)
b, err := bc.GetBlock(bh) b, err := bc.GetBlock(bh)
if err != nil { if err != nil {
return err return err
} }
buf := io.NewBufBinWriter()
b.EncodeBinary(buf.BinWriter) b.EncodeBinary(buf.BinWriter)
bytes := buf.Bytes() bytes := buf.Bytes()
w.WriteU32LE(uint32(len(bytes))) w.WriteU32LE(uint32(len(bytes)))
@ -34,6 +35,7 @@ func Dump(bc DumperRestorer, w *io.BinWriter, start, count uint32) error {
if w.Err != nil { if w.Err != nil {
return w.Err return w.Err
} }
buf.Reset()
} }
return nil return nil
} }
@ -41,9 +43,15 @@ func Dump(bc DumperRestorer, w *io.BinWriter, start, count uint32) error {
// Restore restores blocks from the provided reader. // Restore restores blocks from the provided reader.
// f is called after addition of every block. // f is called after addition of every block.
func Restore(bc DumperRestorer, r *io.BinReader, skip, count uint32, f func(b *block.Block) error) error { func Restore(bc DumperRestorer, r *io.BinReader, skip, count uint32, f func(b *block.Block) error) error {
var buf []byte
readBlock := func(r *io.BinReader) ([]byte, error) { readBlock := func(r *io.BinReader) ([]byte, error) {
var size = r.ReadU32LE() var size = r.ReadU32LE()
buf := make([]byte, size) if uint32(cap(buf)) < size {
buf = make([]byte, size)
} else {
buf = buf[:size]
}
r.ReadBytes(buf) r.ReadBytes(buf)
return buf, r.Err return buf, r.Err
} }