fix: store/rootmulti: correctly dispatch exporter closing while in a loop (#14027)

This commit is contained in:
Emmanuel T Odeke 2022-11-29 09:45:56 -08:00 committed by GitHub
parent 2cf92caf45
commit 5a1fa2ee02
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -761,40 +761,49 @@ func (rs *Store) Snapshot(height uint64, protoWriter protoio.Writer) error {
if err != nil {
return err
}
defer exporter.Close()
err = protoWriter.WriteMsg(&snapshottypes.SnapshotItem{
Item: &snapshottypes.SnapshotItem_Store{
Store: &snapshottypes.SnapshotStoreItem{
Name: store.name,
},
},
})
if err != nil {
return err
}
for {
node, err := exporter.Next()
if err == iavltree.ExportDone {
break
} else if err != nil {
return err
}
err = protoWriter.WriteMsg(&snapshottypes.SnapshotItem{
Item: &snapshottypes.SnapshotItem_IAVL{
IAVL: &snapshottypes.SnapshotIAVLItem{
Key: node.Key,
Value: node.Value,
Height: int32(node.Height),
Version: node.Version,
err = func() error {
defer exporter.Close()
err := protoWriter.WriteMsg(&snapshottypes.SnapshotItem{
Item: &snapshottypes.SnapshotItem_Store{
Store: &snapshottypes.SnapshotStoreItem{
Name: store.name,
},
},
})
if err != nil {
return err
}
for {
node, err := exporter.Next()
if err == iavltree.ExportDone {
break
} else if err != nil {
return err
}
err = protoWriter.WriteMsg(&snapshottypes.SnapshotItem{
Item: &snapshottypes.SnapshotItem_IAVL{
IAVL: &snapshottypes.SnapshotIAVLItem{
Key: node.Key,
Value: node.Value,
Height: int32(node.Height),
Version: node.Version,
},
},
})
if err != nil {
return err
}
}
return nil
}()
if err != nil {
return err
}
exporter.Close()
}
return nil