Browse Source

Merge pull request #9 from vocdoni/fix/level

Fix level when going down & in computeHashes
master
arnau 3 years ago
committed by GitHub
parent
commit
4836f19755
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 63 additions and 3 deletions
  1. +1
    -1
      tree.go
  2. +60
    -0
      tree_test.go
  3. +2
    -2
      vt.go

+ 1
- 1
tree.go

@ -340,7 +340,7 @@ func (t *Tree) add(wTx db.WriteTx, root []byte, fromLvl int, k, v []byte) ([]byt
func (t *Tree) down(rTx db.ReadTx, newKey, currKey []byte, siblings [][]byte, func (t *Tree) down(rTx db.ReadTx, newKey, currKey []byte, siblings [][]byte,
path []bool, currLvl int, getLeaf bool) ( path []bool, currLvl int, getLeaf bool) (
[]byte, []byte, [][]byte, error) { []byte, []byte, [][]byte, error) {
if currLvl > t.maxLevels-1 {
if currLvl > t.maxLevels {
return nil, nil, nil, ErrMaxLevel return nil, nil, nil, ErrMaxLevel
} }

+ 60
- 0
tree_test.go

@ -454,6 +454,66 @@ func TestRWMutex(t *testing.T) {
// c.Assert(n, qt.Equals, maxInt) // c.Assert(n, qt.Equals, maxInt)
// } // }
func TestAddBatchFullyUsed(t *testing.T) {
c := qt.New(t)
database1, err := badgerdb.New(badgerdb.Options{Path: c.TempDir()})
c.Assert(err, qt.IsNil)
tree1, err := NewTree(database1, 4, HashFunctionPoseidon)
c.Assert(err, qt.IsNil)
database2, err := badgerdb.New(badgerdb.Options{Path: c.TempDir()})
c.Assert(err, qt.IsNil)
tree2, err := NewTree(database2, 4, HashFunctionPoseidon)
c.Assert(err, qt.IsNil)
var keys, values [][]byte
for i := 0; i < 16; i++ {
k := BigIntToBytes(32, big.NewInt(int64(i)))
v := k
keys = append(keys, k)
values = append(values, v)
// add one by one expecting no error
err := tree1.Add(k, v)
c.Assert(err, qt.IsNil)
}
invalids, err := tree2.AddBatch(keys, values)
c.Assert(err, qt.IsNil)
c.Assert(0, qt.Equals, len(invalids))
root1, err := tree1.Root()
c.Assert(err, qt.IsNil)
root2, err := tree2.Root()
c.Assert(err, qt.IsNil)
c.Assert(root1, qt.DeepEquals, root2)
// get all key-values and check that are equal between both trees
for i := 0; i < 16; i++ {
auxK1, auxV1, err := tree1.Get(BigIntToBytes(32, big.NewInt(int64(i))))
c.Assert(err, qt.IsNil)
auxK2, auxV2, err := tree2.Get(BigIntToBytes(32, big.NewInt(int64(i))))
c.Assert(err, qt.IsNil)
c.Assert(auxK1, qt.DeepEquals, auxK2)
c.Assert(auxV1, qt.DeepEquals, auxV2)
}
// try adding one more key to both trees (through Add & AddBatch) and
// expect not being added due the tree is already full
k := BigIntToBytes(32, big.NewInt(int64(16)))
v := k
err = tree1.Add(k, v)
c.Assert(err, qt.Equals, ErrMaxVirtualLevel)
invalids, err = tree2.AddBatch([][]byte{k}, [][]byte{v})
c.Assert(err, qt.IsNil)
c.Assert(1, qt.Equals, len(invalids))
}
func TestSnapshot(t *testing.T) { func TestSnapshot(t *testing.T) {
c := qt.New(t) c := qt.New(t)
database, err := badgerdb.New(badgerdb.Options{Path: c.TempDir()}) database, err := badgerdb.New(badgerdb.Options{Path: c.TempDir()})

+ 2
- 2
vt.go

@ -318,11 +318,11 @@ func (t *vt) computeHashes() ([][2][]byte, error) {
wg.Add(nCPU) wg.Add(nCPU)
for i := 0; i < nCPU; i++ { for i := 0; i < nCPU; i++ {
go func(cpu int) { go func(cpu int) {
bucketVT := newVT(t.params.maxLevels-l, t.params.hashFunction)
bucketVT := newVT(t.params.maxLevels, t.params.hashFunction)
bucketVT.params.dbg = newDbgStats() bucketVT.params.dbg = newDbgStats()
bucketVT.root = nodesAtL[cpu] bucketVT.root = nodesAtL[cpu]
bucketPairs[cpu], err = bucketVT.root.computeHashes(l,
bucketPairs[cpu], err = bucketVT.root.computeHashes(l-1,
t.params.maxLevels, bucketVT.params, bucketPairs[cpu]) t.params.maxLevels, bucketVT.params, bucketPairs[cpu])
if err != nil { if err != nil {
errs[cpu] = err errs[cpu] = err

Loading…
Cancel
Save