Commit 003b84a1 authored by kingwang's avatar kingwang

merge chain33

parent 9c09aa74
......@@ -9,9 +9,9 @@ import (
"fmt"
dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/common/version"
"github.com/33cn/chain33/types"
dbm "github.com/33cn/chain33/common/db"
)
// Upgrade 升级localDB和storeDB
......
......@@ -47,6 +47,51 @@ MAIN_LOOP:
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) {
t.Log("test Set")
......
......@@ -29,6 +29,16 @@ func TestGoLevelDBIterator(t *testing.T) {
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) {
dir, err := ioutil.TempDir("", "goleveldb")
require.NoError(t, err)
......
......@@ -105,9 +105,8 @@ func (db *ListHelper) IteratorScan(prefix []byte, key []byte, count int32, direc
return
}
//IteratorScanFromFirst 从头迭代
func (db *ListHelper) IteratorScanFromFirst(prefix []byte, count int32) (values [][]byte) {
it := db.db.Iterator(prefix, nil, false)
func (db *ListHelper) iteratorScan(prefix []byte, count int32, reverse bool) (values [][]byte) {
it := db.db.Iterator(prefix, nil, reverse)
defer it.Close()
var i int32
for it.Rewind(); it.Valid(); it.Next() {
......@@ -127,27 +126,14 @@ func (db *ListHelper) IteratorScanFromFirst(prefix []byte, count int32) (values
return
}
//IteratorScanFromFirst 从头迭代
func (db *ListHelper) IteratorScanFromFirst(prefix []byte, count int32) (values [][]byte) {
return db.iteratorScan(prefix, count, false)
}
//IteratorScanFromLast 从尾迭代
func (db *ListHelper) IteratorScanFromLast(prefix []byte, count int32) (values [][]byte) {
it := db.db.Iterator(prefix, nil, 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
return db.iteratorScan(prefix, count, true)
}
//PrefixCount 前缀数量
......
......@@ -14,7 +14,7 @@ type Scorer interface {
Compare(Scorer) int
}
// Queue 价格队列模式(价格=手续费/交易字节数,价格高者优先,同价则时间早优先)
// Queue skiplist 实现的一个 按照score 排序的队列,score相同的按照元素到的先后排序
type Queue struct {
txMap map[string]*list.Element
txList *SkipList
......@@ -86,12 +86,11 @@ func (cache *Queue) GetItem(hash string) (Scorer, error) {
}
//Insert Scorer item to queue
func (cache *Queue) Insert(hash string, item Scorer) error {
cache.txMap[string(hash)] = cache.insertSkipValue(item)
return nil
func (cache *Queue) Insert(hash string, item Scorer) {
cache.txMap[hash] = cache.insertSkipValue(item)
}
// Push 把给定tx添加到Queue;如果tx已经存在Queue中或Mempool已满则返回对应error
// Push item 到队列中,如果插入的数据优先级比队列中更大,那么弹出优先级最小的,然后插入这个数据,否则报错
func (cache *Queue) Push(item Scorer) error {
hash := item.Hash()
if cache.Exist(string(hash)) {
......@@ -101,21 +100,13 @@ func (cache *Queue) Push(item Scorer) error {
if int64(cache.Size()) >= cache.maxsize {
tail := cache.Last()
lasthash := string(tail.Hash())
//价格高存留
switch sv.Compare(cache.CreateSkipValue(tail)) {
case Big:
cache.Remove(lasthash)
case Equal:
//再score 相同的情况下,item 之间的比较方法
//权重大的留下来
if item.Compare(tail) == Big {
cache.Remove(lasthash)
break
cmp := sv.Compare(cache.CreateSkipValue(tail))
if cmp == Big || (cmp == Equal && item.Compare(tail) == Big) {
err := cache.Remove(lasthash)
if err != nil {
return err
}
return types.ErrMemFull
case Small:
return types.ErrMemFull
default:
} else {
return types.ErrMemFull
}
}
......@@ -129,11 +120,13 @@ func (cache *Queue) Remove(hash string) error {
if !ok {
return types.ErrNotFound
}
//保证txMap中先删除,这个用于计数
delete(cache.txMap, hash)
err := cache.deleteSkipValue(elm)
if err != nil {
println("queue_data_crash")
return err
}
delete(cache.txMap, hash)
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