X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=protocol%2Forphan_manage.go;h=dc72718f6223eeafb2260f0d8e23d11e64cf84cc;hb=da60fba7ca7f5b0cdc51ce8f9049a994d6720b22;hp=52c6a876453850ac0dac47532262f4c9f9ac44db;hpb=08281341c2cb02ba11d4218576256688854790fc;p=bytom%2Fvapor.git diff --git a/protocol/orphan_manage.go b/protocol/orphan_manage.go index 52c6a876..dc72718f 100644 --- a/protocol/orphan_manage.go +++ b/protocol/orphan_manage.go @@ -11,8 +11,9 @@ import ( ) var ( - orphanBlockTTL = 60 * time.Minute - orphanExpireWorkInterval = 3 * time.Minute + orphanBlockTTL = 3 * time.Minute + orphanExpireWorkInterval = 1 * time.Minute + numOrphanBlockLimit = 256 ) type orphanBlock struct { @@ -56,10 +57,15 @@ func (o *OrphanManage) Add(block *types.Block) { return } + if len(o.orphan) >= numOrphanBlockLimit { + o.deleteLRU() + log.WithFields(log.Fields{"module": logModule, "hash": blockHash.String(), "height": block.Height}).Info("the number of orphan blocks exceeds the limit") + } + o.orphan[blockHash] = &orphanBlock{block, time.Now().Add(orphanBlockTTL)} o.prevOrphans[block.PreviousBlockHash] = append(o.prevOrphans[block.PreviousBlockHash], &blockHash) - log.WithFields(log.Fields{"hash": blockHash.String(), "height": block.Height}).Info("add block to orphan") + log.WithFields(log.Fields{"module": logModule, "hash": blockHash.String(), "height": block.Height}).Info("add block to orphan") } // Delete will delete the block from OrphanManage @@ -99,13 +105,27 @@ func (o *OrphanManage) delete(hash *bc.Hash) { } for i, preOrphan := range prevOrphans { - if preOrphan == hash { + if *preOrphan == *hash { o.prevOrphans[block.Block.PreviousBlockHash] = append(prevOrphans[:i], prevOrphans[i+1:]...) return } } } +func (o *OrphanManage) deleteLRU() { + var deleteBlock *orphanBlock + for _, orphan := range o.orphan { + if deleteBlock == nil || orphan.expiration.Before(deleteBlock.expiration) { + deleteBlock = orphan + } + } + + if deleteBlock != nil { + blockHash := deleteBlock.Block.Hash() + o.delete(&blockHash) + } +} + func (o *OrphanManage) orphanExpireWorker() { ticker := time.NewTicker(orphanExpireWorkInterval) for now := range ticker.C {