import (
"encoding/json"
+
+ log "github.com/sirupsen/logrus"
+
+ "github.com/bytom/bytom/common"
)
-type AssetImage struct {
- Assets []*Asset
- AssetIndex uint64
+// Image is the struct for hold export asset data
+type Image struct {
+ Assets []*Asset `json:"assets"`
}
-func (reg *Registry) Backup() (*AssetImage, error) {
- assetIndex, err := reg.getNextAssetIndex()
- if err != nil {
- return nil, err
+// Backup export all the asset info into image
+func (reg *Registry) Backup() (*Image, error) {
+ assetImage := &Image{
+ Assets: []*Asset{},
}
- assets := []*Asset{}
assetIter := reg.db.IteratorPrefix([]byte(assetPrefix))
defer assetIter.Release()
-
for assetIter.Next() {
asset := &Asset{}
if err := json.Unmarshal(assetIter.Value(), asset); err != nil {
return nil, err
}
- assets = append(assets, asset)
+ assetImage.Assets = append(assetImage.Assets, asset)
}
- assetImage := &AssetImage{
- AssetIndex: assetIndex,
- Assets: assets,
- }
return assetImage, nil
}
-func (reg *Registry) Restore(image *AssetImage) error {
- localIndex, err := reg.getNextAssetIndex()
- if err != nil {
- return err
- }
-
- if localIndex > image.AssetIndex {
- image.AssetIndex = localIndex
- }
-
+// Restore load the image data into asset manage
+func (reg *Registry) Restore(image *Image) error {
+ maxAssetIndex := uint64(0)
storeBatch := reg.db.NewBatch()
for _, asset := range image.Assets {
- if existed := reg.db.Get(AliasKey(*asset.Alias)); existed != nil {
+ if existed := reg.db.Get(Key(&asset.AssetID)); existed != nil {
+ log.WithFields(log.Fields{"alias": asset.Alias, "id": asset.AssetID}).Warning("skip restore asset due to already existed")
+ continue
+ }
+ if existed := reg.db.Get(aliasKey(*asset.Alias)); existed != nil {
return ErrDuplicateAlias
}
return err
}
- storeBatch.Set(AliasKey(*asset.Alias), []byte(asset.AssetID.String()))
+ if asset.Signer.KeyIndex > maxAssetIndex {
+ maxAssetIndex = asset.Signer.KeyIndex
+ }
+ storeBatch.Set(aliasKey(*asset.Alias), []byte(asset.AssetID.String()))
storeBatch.Set(Key(&asset.AssetID), rawAsset)
}
+
+ if localIndex := reg.getNextAssetIndex(); localIndex < maxAssetIndex {
+ storeBatch.Set(assetIndexKey, common.Unit64ToBytes(maxAssetIndex))
+ }
storeBatch.Write()
- reg.saveNextAssetIndex(image.AssetIndex)
return nil
}