OSDN Git Service

fix lru bug (#469)
[bytom/vapor.git] / database / store.go
index 0be3df0..1970543 100644 (file)
@@ -9,13 +9,13 @@ import (
        "github.com/golang/protobuf/proto"
        log "github.com/sirupsen/logrus"
 
-       dbm "github.com/vapor/database/leveldb"
-       "github.com/vapor/database/storage"
-       "github.com/vapor/errors"
-       "github.com/vapor/protocol"
-       "github.com/vapor/protocol/bc"
-       "github.com/vapor/protocol/bc/types"
-       "github.com/vapor/protocol/state"
+       dbm "github.com/bytom/vapor/database/leveldb"
+       "github.com/bytom/vapor/database/storage"
+       "github.com/bytom/vapor/errors"
+       "github.com/bytom/vapor/protocol"
+       "github.com/bytom/vapor/protocol/bc"
+       "github.com/bytom/vapor/protocol/bc/types"
+       "github.com/bytom/vapor/protocol/state"
 )
 
 const (
@@ -53,7 +53,7 @@ func loadBlockStoreStateJSON(db dbm.DB) *protocol.BlockStoreState {
 // methods for querying current data.
 type Store struct {
        db    dbm.DB
-       cache cache
+       cache *cache
 }
 
 func calcMainChainIndexPrefix(height uint64) []byte {
@@ -331,14 +331,18 @@ func (s *Store) SaveChainStatus(blockHeader, irrBlockHeader *types.BlockHeader,
                return err
        }
 
-       for _, result := range consensusResults {
+       var clearCacheFuncs []func()
+       for _, consensusResult := range consensusResults {
+               result := consensusResult
                bytes, err := json.Marshal(result)
                if err != nil {
                        return err
                }
 
                batch.Set(calcConsensusResultKey(result.Seq), bytes)
-               s.cache.removeConsensusResult(result)
+               clearCacheFuncs = append(clearCacheFuncs, func() {
+                       s.cache.removeConsensusResult(result)
+               })
        }
 
        blockHash := blockHeader.Hash()
@@ -355,7 +359,8 @@ func (s *Store) SaveChainStatus(blockHeader, irrBlockHeader *types.BlockHeader,
        batch.Set([]byte{blockStore}, bytes)
 
        // save main chain blockHeaders
-       for _, bh := range mainBlockHeaders {
+       for _, blockHeader := range mainBlockHeaders {
+               bh := blockHeader
                blockHash := bh.Hash()
                binaryBlockHash, err := blockHash.MarshalText()
                if err != nil {
@@ -363,15 +368,24 @@ func (s *Store) SaveChainStatus(blockHeader, irrBlockHeader *types.BlockHeader,
                }
 
                batch.Set(calcMainChainIndexPrefix(bh.Height), binaryBlockHash)
-               s.cache.removeMainChainHash(bh.Height)
+               clearCacheFuncs = append(clearCacheFuncs, func() {
+                       s.cache.removeMainChainHash(bh.Height)
+               })
        }
 
        if currentStatus != nil {
                for i := blockHeader.Height + 1; i <= currentStatus.Height; i++ {
-                       batch.Delete(calcMainChainIndexPrefix(i))
-                       s.cache.removeMainChainHash(i)
+                       index := i
+                       batch.Delete(calcMainChainIndexPrefix(index))
+                       clearCacheFuncs = append(clearCacheFuncs, func() {
+                               s.cache.removeMainChainHash(index)
+                       })
                }
        }
        batch.Write()
+
+       for _, clearCacheFunc := range clearCacheFuncs {
+               clearCacheFunc()
+       }
        return nil
 }