swarm/storage: Create get/set for resource map rw

This commit is contained in:
lash 2018-01-14 23:59:39 +01:00
parent a88e093765
commit 54da86db9c

View file

@ -102,7 +102,7 @@ type ResourceHandler struct {
ethapi *rpc.Client ethapi *rpc.Client
resources map[string]*resource resources map[string]*resource
hashLock sync.Mutex hashLock sync.Mutex
resourceLock sync.Mutex resourceLock sync.RWMutex
hasher SwarmHash hasher SwarmHash
privKey *ecdsa.PrivateKey privKey *ecdsa.PrivateKey
maxChunkData int64 maxChunkData int64
@ -202,15 +202,15 @@ func (self *ResourceHandler) NewResource(name string, frequency uint64) (*resour
self.Put(chunk) self.Put(chunk)
log.Debug("new resource", "name", validname, "key", ensName, "startBlock", currentblock, "frequency", frequency) log.Debug("new resource", "name", validname, "key", ensName, "startBlock", currentblock, "frequency", frequency)
self.resourceLock.Lock() rsrc := &resource{
defer self.resourceLock.Unlock()
self.resources[name] = &resource{
name: validname, name: validname,
ensName: ensName, ensName: ensName,
startBlock: currentblock, startBlock: currentblock,
frequency: frequency, frequency: frequency,
updated: time.Now(), updated: time.Now(),
} }
self.setResource(name, rsrc)
return self.resources[name], nil return self.resources[name], nil
} }
@ -355,12 +355,9 @@ func (self *ResourceHandler) loadResource(name string, refresh bool) (*resource,
// if the resource is not known to this session we must load it // if the resource is not known to this session we must load it
// if refresh is set, we force load // if refresh is set, we force load
rsrc := &resource{} rsrc := self.getResource(name)
if rsrc == nil || refresh {
self.resourceLock.Lock() rsrc = &resource{}
_, ok := self.resources[name]
self.resourceLock.Unlock()
if !ok || refresh {
// make sure our ens identifier is idna safe // make sure our ens identifier is idna safe
validname, err := idna.ToASCII(name) validname, err := idna.ToASCII(name)
if err != nil { if err != nil {
@ -414,9 +411,7 @@ func (self *ResourceHandler) updateResourceIndex(rsrc *resource, chunk *Chunk, i
rsrc.data = make([]byte, len(data)) rsrc.data = make([]byte, len(data))
copy(rsrc.data, data) copy(rsrc.data, data)
log.Debug("Resource synced", "name", rsrc.name, "key", chunk.Key, "period", rsrc.lastPeriod, "version", rsrc.version) log.Debug("Resource synced", "name", rsrc.name, "key", chunk.Key, "period", rsrc.lastPeriod, "version", rsrc.version)
self.resourceLock.Lock() self.setResource(*indexname, rsrc)
self.resources[*indexname] = rsrc
self.resourceLock.Unlock()
return rsrc, nil return rsrc, nil
} }
@ -542,6 +537,19 @@ func (self *ResourceHandler) PeriodToBlock(name string, period uint32) uint64 {
return self.resources[name].startBlock + (uint64(period) * self.resources[name].frequency) return self.resources[name].startBlock + (uint64(period) * self.resources[name].frequency)
} }
func (self *ResourceHandler) getResource(name string) *resource {
self.resourceLock.RLock()
defer self.resourceLock.RUnlock()
rsrc := self.resources[name]
return rsrc
}
func (self *ResourceHandler) setResource(name string, rsrc *resource) {
self.resourceLock.Lock()
defer self.resourceLock.Unlock()
self.resources[name] = rsrc
}
func (self *ResourceHandler) resourceHash(namehash common.Hash, period uint32, version uint32) Key { func (self *ResourceHandler) resourceHash(namehash common.Hash, period uint32, version uint32) Key {
// format is: hash(namehash|period|version) // format is: hash(namehash|period|version)
self.hashLock.Lock() self.hashLock.Lock()