mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-21 20:26:41 +00:00
memstore changes
- inttegrate changes related to db + access count - simplify API , only Get/Put no add/find - signal need to retrieve from db with chunk.update = true - consistent naming - unix line endings
This commit is contained in:
parent
4d3af2ca33
commit
2c464282cd
1 changed files with 296 additions and 301 deletions
|
|
@ -13,10 +13,10 @@ const (
|
||||||
dbForceUpdateAccessCnt = 1000
|
dbForceUpdateAccessCnt = 1000
|
||||||
)
|
)
|
||||||
|
|
||||||
type dpaMemStorage struct {
|
type memStore struct {
|
||||||
memtree *dpaMemTree
|
memtree *memTree
|
||||||
entry_cnt uint // stored entries
|
entryCnt uint // stored entries
|
||||||
access_cnt uint64 // access counter; oldest is thrown away when full
|
accessCnt uint64 // access counter; oldest is thrown away when full
|
||||||
dbAccessCnt uint64
|
dbAccessCnt uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -69,10 +69,10 @@ func (h Key) bits(i, j uint) uint {
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
type dpaMemTree struct {
|
type memTree struct {
|
||||||
subtree []*dpaMemTree
|
subtree []*memTree
|
||||||
parent *dpaMemTree
|
parent *memTree
|
||||||
parent_idx uint
|
parentIdx uint
|
||||||
|
|
||||||
bits uint // log2(subtree count)
|
bits uint // log2(subtree count)
|
||||||
width uint // subtree count
|
width uint // subtree count
|
||||||
|
|
@ -82,15 +82,15 @@ type dpaMemTree struct {
|
||||||
access []uint64
|
access []uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
func newTreeNode(b uint, parent *dpaMemTree, pidx uint) (node *dpaMemTree) {
|
func newMemTree(b uint, parent *memTree, pidx uint) (node *memTree) {
|
||||||
|
|
||||||
node = new(dpaMemTree)
|
node = new(memTree)
|
||||||
node.bits = b
|
node.bits = b
|
||||||
node.width = 1 << uint(b)
|
node.width = 1 << uint(b)
|
||||||
node.subtree = make([]*dpaMemTree, node.width)
|
node.subtree = make([]*memTree, node.width)
|
||||||
node.access = make([]uint64, node.width-1)
|
node.access = make([]uint64, node.width-1)
|
||||||
node.parent = parent
|
node.parent = parent
|
||||||
node.parent_idx = pidx
|
node.parentIdx = pidx
|
||||||
if parent != nil {
|
if parent != nil {
|
||||||
parent.subtree[pidx] = node
|
parent.subtree[pidx] = node
|
||||||
}
|
}
|
||||||
|
|
@ -99,7 +99,7 @@ func newTreeNode(b uint, parent *dpaMemTree, pidx uint) (node *dpaMemTree) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (node *dpaMemTree) update_access(a uint64) {
|
func (node *memTree) updateAccess(a uint64) {
|
||||||
|
|
||||||
aidx := uint(0)
|
aidx := uint(0)
|
||||||
var aa uint64
|
var aa uint64
|
||||||
|
|
@ -110,7 +110,7 @@ func (node *dpaMemTree) update_access(a uint64) {
|
||||||
aa = node.access[((aidx-1)^1)+1]
|
aa = node.access[((aidx-1)^1)+1]
|
||||||
aidx = (aidx - 1) >> 1
|
aidx = (aidx - 1) >> 1
|
||||||
} else {
|
} else {
|
||||||
pidx := node.parent_idx
|
pidx := node.parentIdx
|
||||||
node = node.parent
|
node = node.parent
|
||||||
if node == nil {
|
if node == nil {
|
||||||
return
|
return
|
||||||
|
|
@ -131,9 +131,12 @@ func (node *dpaMemTree) update_access(a uint64) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *dpaMemStorage) add(entry *Chunk) {
|
func (s *memStore) Put(entry *Chunk) (err error) {
|
||||||
|
if s.entryCnt >= maxEntries {
|
||||||
|
s.removeOldest()
|
||||||
|
}
|
||||||
|
|
||||||
s.access_cnt++
|
s.accessCnt++
|
||||||
|
|
||||||
node := s.memtree
|
node := s.memtree
|
||||||
bitpos := uint(0)
|
bitpos := uint(0)
|
||||||
|
|
@ -141,7 +144,7 @@ func (s *dpaMemStorage) add(entry *Chunk) {
|
||||||
l := entry.Key.bits(bitpos, node.bits)
|
l := entry.Key.bits(bitpos, node.bits)
|
||||||
st := node.subtree[l]
|
st := node.subtree[l]
|
||||||
if st == nil {
|
if st == nil {
|
||||||
st = newTreeNode(memTreeLW, node, l)
|
st = newMemTree(memTreeLW, node, l)
|
||||||
bitpos += node.bits
|
bitpos += node.bits
|
||||||
node = st
|
node = st
|
||||||
break
|
break
|
||||||
|
|
@ -153,7 +156,7 @@ func (s *dpaMemStorage) add(entry *Chunk) {
|
||||||
if node.entry != nil {
|
if node.entry != nil {
|
||||||
|
|
||||||
if node.entry.Key.isEqual(entry.Key) {
|
if node.entry.Key.isEqual(entry.Key) {
|
||||||
node.update_access(s.access_cnt)
|
node.updateAccess(s.accessCnt)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -162,16 +165,16 @@ func (s *dpaMemStorage) add(entry *Chunk) {
|
||||||
l := node.entry.Key.bits(bitpos, node.bits)
|
l := node.entry.Key.bits(bitpos, node.bits)
|
||||||
st := node.subtree[l]
|
st := node.subtree[l]
|
||||||
if st == nil {
|
if st == nil {
|
||||||
st = newTreeNode(memTreeLW, node, l)
|
st = newMemTree(memTreeLW, node, l)
|
||||||
}
|
}
|
||||||
st.entry = node.entry
|
st.entry = node.entry
|
||||||
node.entry = nil
|
node.entry = nil
|
||||||
st.update_access(node.access[0])
|
st.updateAccess(node.access[0])
|
||||||
|
|
||||||
l = entry.Key.bits(bitpos, node.bits)
|
l = entry.Key.bits(bitpos, node.bits)
|
||||||
st = node.subtree[l]
|
st = node.subtree[l]
|
||||||
if st == nil {
|
if st == nil {
|
||||||
st = newTreeNode(memTreeLW, node, l)
|
st = newMemTree(memTreeLW, node, l)
|
||||||
}
|
}
|
||||||
bitpos += node.bits
|
bitpos += node.bits
|
||||||
node = st
|
node = st
|
||||||
|
|
@ -181,13 +184,14 @@ func (s *dpaMemStorage) add(entry *Chunk) {
|
||||||
|
|
||||||
node.entry = entry
|
node.entry = entry
|
||||||
node.lastDBaccess = s.dbAccessCnt
|
node.lastDBaccess = s.dbAccessCnt
|
||||||
node.update_access(s.access_cnt)
|
node.updateAccess(s.accessCnt)
|
||||||
s.entry_cnt++
|
s.entryCnt++
|
||||||
|
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *dpaMemStorage) find(hash Key) (entry *Chunk) {
|
func (s *memStore) Get(chunk *Chunk) (err error) {
|
||||||
|
hash := chunk.Key
|
||||||
node := s.memtree
|
node := s.memtree
|
||||||
bitpos := uint(0)
|
bitpos := uint(0)
|
||||||
for node.entry == nil {
|
for node.entry == nil {
|
||||||
|
|
@ -201,15 +205,22 @@ func (s *dpaMemStorage) find(hash Key) (entry *Chunk) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if node.entry.Key.isEqual(hash) {
|
if node.entry.Key.isEqual(hash) {
|
||||||
s.access_cnt++
|
s.accessCnt++
|
||||||
node.update_access(s.access_cnt)
|
node.updateAccess(s.accessCnt)
|
||||||
return node.entry
|
if s.dbAccessCnt-node.lastDBaccess > dbForceUpdateAccessCnt {
|
||||||
} else {
|
s.dbAccessCnt++
|
||||||
return nil
|
node.lastDBaccess = s.dbAccessCnt
|
||||||
|
chunk.update = true
|
||||||
}
|
}
|
||||||
|
chunk.Data = node.entry.Data
|
||||||
|
chunk.Size = node.entry.Size
|
||||||
|
} else {
|
||||||
|
err = notFound
|
||||||
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *dpaMemStorage) remove_oldest() {
|
func (s *memStore) removeOldest() {
|
||||||
|
|
||||||
node := s.memtree
|
node := s.memtree
|
||||||
|
|
||||||
|
|
@ -253,7 +264,7 @@ func (s *dpaMemStorage) remove_oldest() {
|
||||||
}
|
}
|
||||||
|
|
||||||
node.entry = nil
|
node.entry = nil
|
||||||
s.entry_cnt--
|
s.entryCnt--
|
||||||
node.access[0] = 0
|
node.access[0] = 0
|
||||||
|
|
||||||
//---
|
//---
|
||||||
|
|
@ -264,7 +275,7 @@ func (s *dpaMemStorage) remove_oldest() {
|
||||||
if aidx > 0 {
|
if aidx > 0 {
|
||||||
aidx = (aidx - 1) >> 1
|
aidx = (aidx - 1) >> 1
|
||||||
} else {
|
} else {
|
||||||
pidx := node.parent_idx
|
pidx := node.parentIdx
|
||||||
node = node.parent
|
node = node.parent
|
||||||
if node == nil {
|
if node == nil {
|
||||||
return
|
return
|
||||||
|
|
@ -278,24 +289,8 @@ func (s *dpaMemStorage) remove_oldest() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *dpaMemStorage) Put(req *Chunk) error {
|
func (s *memStore) Init() {
|
||||||
if s.entry_cnt >= maxEntries {
|
|
||||||
s.remove_oldest()
|
|
||||||
}
|
|
||||||
s.add(req)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *dpaMemStorage) Get(req *Chunk) {
|
s.memtree = newMemTree(memTreeFLW, nil, 0)
|
||||||
|
|
||||||
entry := s.find(req.Key)
|
|
||||||
if entry == nil {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *dpaMemStorage) Init() {
|
|
||||||
|
|
||||||
s.memtree = newTreeNode(memTreeFLW, nil, 0)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue