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:
zelig 2015-02-01 19:41:27 +01:00
parent 4d3af2ca33
commit 2c464282cd

View file

@ -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)
} }