From dc2f91804e96509cf4d3af69fcf92e53c775d51d Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Tue, 18 Jun 2019 09:50:46 +0800 Subject: [PATCH] fix --- federation/synchron/asset_keeper.go | 44 +++++++++++++++++++++++++++ federation/synchron/mainchain_keeper.go | 53 +++++++++++---------------------- 2 files changed, 61 insertions(+), 36 deletions(-) create mode 100644 federation/synchron/asset_keeper.go diff --git a/federation/synchron/asset_keeper.go b/federation/synchron/asset_keeper.go new file mode 100644 index 00000000..5c46a5d4 --- /dev/null +++ b/federation/synchron/asset_keeper.go @@ -0,0 +1,44 @@ +package synchron + +import ( + "github.com/jinzhu/gorm" + + "github.com/vapor/errors" + "github.com/vapor/federation/database" + "github.com/vapor/federation/database/orm" +) + +type AssetKeeper struct { + db *gorm.DB + assetCache *database.AssetCache +} + +func NewAssetKeeper(db *gorm.DB) *AssetKeeper { + return &AssetKeeper{ + db: db, + assetCache: database.NewAssetCache(), + } +} + +func (a *AssetKeeper) Get(assetID string) (*orm.Asset, error) { + if asset := a.assetCache.Get(assetID); asset != nil { + return asset, nil + } + + asset := &orm.Asset{AssetID: assetID} + if err := a.db.Where(asset).First(asset).Error; err != nil { + return nil, errors.Wrap(err, "asset not found in memory and mysql") + } + + a.assetCache.Add(assetID, asset) + return asset, nil +} + +func (a *AssetKeeper) Add(asset *orm.Asset) error { + if err := a.db.Create(asset).Error; err != nil { + return err + } + + a.assetCache.Add(asset.AssetID, asset) + return nil +} diff --git a/federation/synchron/mainchain_keeper.go b/federation/synchron/mainchain_keeper.go index b2f98b30..eac57ef5 100644 --- a/federation/synchron/mainchain_keeper.go +++ b/federation/synchron/mainchain_keeper.go @@ -17,29 +17,29 @@ import ( "github.com/vapor/federation" "github.com/vapor/federation/common" "github.com/vapor/federation/config" - "github.com/vapor/federation/database" + // "github.com/vapor/federation/database" "github.com/vapor/federation/database/orm" "github.com/vapor/federation/service" "github.com/vapor/protocol/bc" ) type mainchainKeeper struct { - cfg *config.Chain - db *gorm.DB - node *service.Node - chainName string - assetCache *database.AssetCache - fedProg []byte + cfg *config.Chain + db *gorm.DB + node *service.Node + chainName string + assetKeeper *AssetKeeper + fedProg []byte } func NewMainchainKeeper(db *gorm.DB, cfg *config.Config) *mainchainKeeper { return &mainchainKeeper{ - cfg: &cfg.Mainchain, - db: db, - node: service.NewNode(cfg.Mainchain.Upstream), - chainName: cfg.Mainchain.Name, - assetCache: database.NewAssetCache(), - fedProg: federation.ParseFedProg(cfg.Warders, cfg.Quorum), + cfg: &cfg.Mainchain, + db: db, + node: service.NewNode(cfg.Mainchain.Upstream), + chainName: cfg.Mainchain.Name, + assetKeeper: NewAssetKeeper(db), + fedProg: federation.ParseFedProg(cfg.Warders, cfg.Quorum), } } @@ -218,7 +218,7 @@ func (m *mainchainKeeper) getCrossChainReqs(crossTransactionID uint64, tx *types continue } - asset, err := m.getAsset(rawOutput.OutputCommitment.AssetAmount.AssetId.String()) + asset, err := m.assetKeeper.Get(rawOutput.OutputCommitment.AssetAmount.AssetId.String()) if err != nil { return nil, err } @@ -279,38 +279,19 @@ func (m *mainchainKeeper) processIssuing(txs []*types.Tx) error { switch inp := input.TypedInput.(type) { case *types.IssuanceInput: assetID := inp.AssetID() - if _, err := m.getAsset(assetID.String()); err == nil { + if _, err := m.assetKeeper.Get(assetID.String()); err == nil { continue } - asset := &orm.Asset{ + m.assetKeeper.Add(&orm.Asset{ AssetID: assetID.String(), IssuanceProgram: hex.EncodeToString(inp.IssuanceProgram), VMVersion: inp.VMVersion, RawDefinitionByte: hex.EncodeToString(inp.AssetDefinition), - } - if err := m.db.Create(asset).Error; err != nil { - return err - } - - m.assetCache.Add(asset.AssetID, asset) + }) } } } return nil } - -func (m *mainchainKeeper) getAsset(assetID string) (*orm.Asset, error) { - if asset := m.assetCache.Get(assetID); asset != nil { - return asset, nil - } - - asset := &orm.Asset{AssetID: assetID} - if err := m.db.Where(asset).First(asset).Error; err != nil { - return nil, errors.Wrap(err, "asset not found in memory and mysql") - } - - m.assetCache.Add(assetID, asset) - return asset, nil -} -- 2.11.0