Commit 003b84a1 authored by kingwang's avatar kingwang

merge chain33

parent 9c09aa74
...@@ -9,9 +9,9 @@ import ( ...@@ -9,9 +9,9 @@ import (
"fmt" "fmt"
dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/common/version" "github.com/33cn/chain33/common/version"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
dbm "github.com/33cn/chain33/common/db"
) )
// Upgrade 升级localDB和storeDB // Upgrade 升级localDB和storeDB
......
...@@ -47,6 +47,51 @@ MAIN_LOOP: ...@@ -47,6 +47,51 @@ MAIN_LOOP:
return string(chars) return string(chars)
} }
func testDBIteratorAllKey(t *testing.T, db DB) {
var datas = [][]byte{
[]byte("aa0"), []byte("aa1"), []byte("bb0"), []byte("bb1"), []byte("cc0"), []byte("cc1"),
}
for _, v := range datas {
db.Set(v, v)
}
//一次遍历
it := db.Iterator(nil, types.EmptyValue, false)
i := 0
for it.Rewind(); it.Valid(); it.Next() {
assert.Equal(t, it.Key(), datas[i])
db.Delete(it.Key())
i++
if i == 2 {
break
}
}
it.Close()
//从第3个开始遍历
it = db.Iterator([]byte("aa1"), types.EmptyValue, false)
i = 2
for it.Rewind(); it.Valid(); it.Next() {
assert.Equal(t, it.Key(), datas[i])
db.Delete(it.Key())
i++
if i == 4 {
break
}
}
it.Close()
//从第5个开始遍历
it = db.Iterator([]byte("bb1"), types.EmptyValue, false)
i = 4
for it.Rewind(); it.Valid(); it.Next() {
assert.Equal(t, it.Key(), datas[i])
db.Delete(it.Key())
i++
if i == 6 {
break
}
}
it.Close()
}
// 迭代测试 // 迭代测试
func testDBIterator(t *testing.T, db DB) { func testDBIterator(t *testing.T, db DB) {
t.Log("test Set") t.Log("test Set")
......
...@@ -29,6 +29,16 @@ func TestGoLevelDBIterator(t *testing.T) { ...@@ -29,6 +29,16 @@ func TestGoLevelDBIterator(t *testing.T) {
testDBIterator(t, leveldb) testDBIterator(t, leveldb)
} }
func TestGoLevelDBIteratorAll(t *testing.T) {
dir, err := ioutil.TempDir("", "goleveldb")
require.NoError(t, err)
t.Log(dir)
leveldb, err := NewGoLevelDB("goleveldb", dir, 128)
require.NoError(t, err)
defer leveldb.Close()
testDBIteratorAllKey(t, leveldb)
}
func TestGoLevelDBIteratorDel(t *testing.T) { func TestGoLevelDBIteratorDel(t *testing.T) {
dir, err := ioutil.TempDir("", "goleveldb") dir, err := ioutil.TempDir("", "goleveldb")
require.NoError(t, err) require.NoError(t, err)
......
...@@ -105,9 +105,8 @@ func (db *ListHelper) IteratorScan(prefix []byte, key []byte, count int32, direc ...@@ -105,9 +105,8 @@ func (db *ListHelper) IteratorScan(prefix []byte, key []byte, count int32, direc
return return
} }
//IteratorScanFromFirst 从头迭代 func (db *ListHelper) iteratorScan(prefix []byte, count int32, reverse bool) (values [][]byte) {
func (db *ListHelper) IteratorScanFromFirst(prefix []byte, count int32) (values [][]byte) { it := db.db.Iterator(prefix, nil, reverse)
it := db.db.Iterator(prefix, nil, false)
defer it.Close() defer it.Close()
var i int32 var i int32
for it.Rewind(); it.Valid(); it.Next() { for it.Rewind(); it.Valid(); it.Next() {
...@@ -127,27 +126,14 @@ func (db *ListHelper) IteratorScanFromFirst(prefix []byte, count int32) (values ...@@ -127,27 +126,14 @@ func (db *ListHelper) IteratorScanFromFirst(prefix []byte, count int32) (values
return return
} }
//IteratorScanFromFirst 从头迭代
func (db *ListHelper) IteratorScanFromFirst(prefix []byte, count int32) (values [][]byte) {
return db.iteratorScan(prefix, count, false)
}
//IteratorScanFromLast 从尾迭代 //IteratorScanFromLast 从尾迭代
func (db *ListHelper) IteratorScanFromLast(prefix []byte, count int32) (values [][]byte) { func (db *ListHelper) IteratorScanFromLast(prefix []byte, count int32) (values [][]byte) {
it := db.db.Iterator(prefix, nil, true) return db.iteratorScan(prefix, count, true)
defer it.Close()
var i int32
for it.Rewind(); it.Valid(); it.Next() {
value := it.ValueCopy()
if it.Error() != nil {
listlog.Error("PrefixScan it.Value()", "error", it.Error())
values = nil
return
}
// blog.Debug("PrefixScan", "key", string(item.Key()), "value", value)
values = append(values, value)
i++
if i == count {
break
}
}
return
} }
//PrefixCount 前缀数量 //PrefixCount 前缀数量
......
...@@ -14,7 +14,7 @@ type Scorer interface { ...@@ -14,7 +14,7 @@ type Scorer interface {
Compare(Scorer) int Compare(Scorer) int
} }
// Queue 价格队列模式(价格=手续费/交易字节数,价格高者优先,同价则时间早优先) // Queue skiplist 实现的一个 按照score 排序的队列,score相同的按照元素到的先后排序
type Queue struct { type Queue struct {
txMap map[string]*list.Element txMap map[string]*list.Element
txList *SkipList txList *SkipList
...@@ -86,12 +86,11 @@ func (cache *Queue) GetItem(hash string) (Scorer, error) { ...@@ -86,12 +86,11 @@ func (cache *Queue) GetItem(hash string) (Scorer, error) {
} }
//Insert Scorer item to queue //Insert Scorer item to queue
func (cache *Queue) Insert(hash string, item Scorer) error { func (cache *Queue) Insert(hash string, item Scorer) {
cache.txMap[string(hash)] = cache.insertSkipValue(item) cache.txMap[hash] = cache.insertSkipValue(item)
return nil
} }
// Push 把给定tx添加到Queue;如果tx已经存在Queue中或Mempool已满则返回对应error // Push item 到队列中,如果插入的数据优先级比队列中更大,那么弹出优先级最小的,然后插入这个数据,否则报错
func (cache *Queue) Push(item Scorer) error { func (cache *Queue) Push(item Scorer) error {
hash := item.Hash() hash := item.Hash()
if cache.Exist(string(hash)) { if cache.Exist(string(hash)) {
...@@ -101,21 +100,13 @@ func (cache *Queue) Push(item Scorer) error { ...@@ -101,21 +100,13 @@ func (cache *Queue) Push(item Scorer) error {
if int64(cache.Size()) >= cache.maxsize { if int64(cache.Size()) >= cache.maxsize {
tail := cache.Last() tail := cache.Last()
lasthash := string(tail.Hash()) lasthash := string(tail.Hash())
//价格高存留 cmp := sv.Compare(cache.CreateSkipValue(tail))
switch sv.Compare(cache.CreateSkipValue(tail)) { if cmp == Big || (cmp == Equal && item.Compare(tail) == Big) {
case Big: err := cache.Remove(lasthash)
cache.Remove(lasthash) if err != nil {
case Equal: return err
//再score 相同的情况下,item 之间的比较方法
//权重大的留下来
if item.Compare(tail) == Big {
cache.Remove(lasthash)
break
} }
return types.ErrMemFull } else {
case Small:
return types.ErrMemFull
default:
return types.ErrMemFull return types.ErrMemFull
} }
} }
...@@ -129,11 +120,13 @@ func (cache *Queue) Remove(hash string) error { ...@@ -129,11 +120,13 @@ func (cache *Queue) Remove(hash string) error {
if !ok { if !ok {
return types.ErrNotFound return types.ErrNotFound
} }
//保证txMap中先删除,这个用于计数
delete(cache.txMap, hash)
err := cache.deleteSkipValue(elm) err := cache.deleteSkipValue(elm)
if err != nil { if err != nil {
println("queue_data_crash")
return err return err
} }
delete(cache.txMap, hash)
return nil return nil
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment