4ff96978cb
* add sharedStorage for prefetching to L1 * remote originStorage in stateObjects * fix core * fix bug of sync map * remove read lock when get & set keys * statedb copy use CopyWithSharedStorage * reduce lock access * fix comment * avoid sharedPool effects on other modules * remove tryPreload * fix comment * fix var name * fix lint * fix L1 miss data && data condition * fix comment
40 lines
843 B
Go
40 lines
843 B
Go
package state
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
)
|
|
|
|
// sharedPool is used to store maps of originStorage of stateObjects
|
|
type StoragePool struct {
|
|
sync.RWMutex
|
|
sharedMap map[common.Address]*sync.Map
|
|
}
|
|
|
|
func NewStoragePool() *StoragePool {
|
|
sharedMap := make(map[common.Address]*sync.Map)
|
|
return &StoragePool{
|
|
sync.RWMutex{},
|
|
sharedMap,
|
|
}
|
|
}
|
|
|
|
// getStorage Check whether the storage exist in pool,
|
|
// new one if not exist, the content of storage will be fetched in stateObjects.GetCommittedState()
|
|
func (s *StoragePool) getStorage(address common.Address) *sync.Map {
|
|
s.RLock()
|
|
storageMap, ok := s.sharedMap[address]
|
|
s.RUnlock()
|
|
if !ok {
|
|
s.Lock()
|
|
defer s.Unlock()
|
|
if storageMap, ok = s.sharedMap[address]; !ok {
|
|
m := new(sync.Map)
|
|
s.sharedMap[address] = m
|
|
return m
|
|
}
|
|
}
|
|
return storageMap
|
|
}
|