Skip to content

Commit cabf63a

Browse files
authored
database investigation (#5)
* add readme documentation * initial skeleton * create DB * insert many rows at once * table with varchar(32) as index * first select query * run query with index * more queries * query with prepared stmt * queries with different IDs, to avoid always hitting cache * query with multiple threads * query with random ids,multiple threads * preserving some sql for now * read random IDs from DB * multiple connections * more benchmark results for multiple connections * updateStructure and test * fix bug (store a copy of leaf ID). The tree was storing the original pointers to the leaf IDs passed from the test. When these values were modified, the ID inside the nodes of the tree was modified. Fixed it. * wip explicit structure * wip 2 explicit structure * insert with explicit structure * refactoring * refactoring * select leaves with explicit structure * WIP stored proc * stored function * fix get nodes stored procedure. When the nodes is not found, return an empty blob. * fix minor display hint for the experiments * run new experiments at more powerful machine * move db_test inside cmd/ * clean up Schema, table and stored proc/fcn creation. Connection creation. * define and use Conn interface. Examples of its use. Querying functions. Table schema contains now a proof per node. * last results, stored proc
1 parent 08738bf commit cabf63a

14 files changed

+2221
-0
lines changed

cmd/db_test/main.go

+153
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"time"
7+
8+
"github.com/netsec-ethz/fpki/pkg/db"
9+
)
10+
11+
func main() {
12+
truncateFlag := flag.Bool("truncate", false, "insert values")
13+
insertFlag := flag.Bool("insert", false, "insert values")
14+
queryFlag := flag.Bool("query", false, "perform a query")
15+
flag.Parse()
16+
17+
config := db.Configuration{
18+
Dsn: "root@tcp(localhost)/fpki",
19+
Values: map[string]string{
20+
"interpolateParams": "true", // 1 round trip per query
21+
"collation": "binary",
22+
},
23+
}
24+
createConn := func() (db.Conn, error) { // define a function that creates connections
25+
return db.Connect(&config)
26+
}
27+
28+
var err error
29+
t0 := time.Now()
30+
31+
if *truncateFlag {
32+
c, err := createConn()
33+
check(err)
34+
err = db.DeletemeDropAllNodes(c)
35+
check(err)
36+
t0 = time.Now()
37+
}
38+
if *insertFlag {
39+
c, err := createConn()
40+
check(err)
41+
err = db.DeletemeCreateNodes2(c, 100*1000)
42+
check(err)
43+
}
44+
if *queryFlag {
45+
// t0, err = db.DeletemeSelectLeavesStoredFunc3(createConn, 100*1000+96, 8, 8) // 3.085243872s
46+
// t0, err = db.DeletemeSelectLeavesStoredFunc3(createConn, 100*1000+96, 16, 1) // 4.289929758s
47+
t0, err = db.DeletemeSelectLeavesStoredFunc3(createConn, 100*1000+96, 1, 16) // 4.305125693s
48+
check(err)
49+
}
50+
fmt.Printf("time: %s\n", time.Since(t0))
51+
fmt.Println("ready")
52+
}
53+
54+
func main2() {
55+
truncateFlag := flag.Bool("truncate", false, "insert values")
56+
insertFlag := flag.Bool("insert", false, "insert values")
57+
queryFlag := flag.Bool("query", false, "perform a query")
58+
flag.Parse()
59+
60+
c, err := db.Connect_old()
61+
check(err)
62+
defer c.Close()
63+
64+
t0 := time.Now()
65+
66+
if *truncateFlag {
67+
err = db.DeletemeDropAllNodes(c)
68+
check(err)
69+
t0 = time.Now()
70+
}
71+
if *insertFlag {
72+
// err = db.DeletemeCreateNodes(c, 1000) // 5.975667276s
73+
74+
// err = db.DeletemeCreateNodesBulk(c, 1000) // 60.954469ms
75+
// err = db.DeletemeCreateNodesBulk(c, 1000000) // too slow (before prepared statements)
76+
// err = db.DeletemeCreateNodesBulk(c, 50000) // 1.724559003s
77+
// err = db.DeletemeCreateNodesBulk(c, 100000) // too slow
78+
79+
// err = db.DeletemeCreateNodesBulk2(c, 200000) // 1.161974957s
80+
// err = db.DeletemeCreateNodesBulk2(c, 1000*1000) // 11.807568854s
81+
82+
// err = db.DeletemeCreateNodesBulk3(c, 1000*1000) // 10.23273209s
83+
84+
// err = db.DeletemeCreateNodesBulk4(c, 100*1000) // 1.693980634s
85+
// err = db.DeletemeCreateNodesBulk4(c, 1000*1000) // 17.182428746s
86+
87+
// err = db.DeletemeCreateNodes2(c, 1000) // 212.752302ms
88+
// err = db.DeletemeCreateNodes2(c, 10*1000) // 456.4187ms
89+
err = db.DeletemeCreateNodes2(c, 100*1000) // 9.51899883s
90+
// err = db.DeletemeCreateNodes2(c, 100*1000) // 4.351831675s
91+
// err = db.DeletemeCreateNodes2(c, 1000*1000) // 1m16.537726013s
92+
}
93+
if *queryFlag {
94+
// err = db.DeletemeSelectNodes(c, 1) // 975.161µs
95+
// err = db.DeletemeSelectNodes(c, 1000) // 108.110884ms
96+
// err = db.DeletemeSelectNodes(c, 100*1000) // 10.606129185s
97+
98+
// err = db.DeletemeSelectNodes2(c, 100*1000) // 8.854317991s
99+
100+
// err = db.DeletemeSelectNodes3(c, 100*1000, 8) // 2.184544624s
101+
// err = db.DeletemeSelectNodes3(c, 500*1000, 32) // 11.123422821s = 1M in 22.2s
102+
103+
// err = db.DeletemeSelectNodesRandom4(c, 100*1000, 32) // 2.176723473s
104+
// err = db.DeletemeSelectNodesRandom4(c, 1000*1000, 16) // 16.294332418s
105+
// err = db.DeletemeSelectNodesRandom4(c, 1000*1000, 32) // 16.207375911s
106+
// err = db.DeletemeSelectNodesRandom4(c, 1000*1000, 64) // 16.208407496s
107+
108+
// t0, err = db.DeletemeSelectNodesRandom5(1000*1000, 16, 2) // 7.190813246s
109+
// t0, err = db.DeletemeSelectNodesRandom5(1000*1000, 32, 2) // 6.906053331s
110+
// t0, err = db.DeletemeSelectNodesRandom5(1000*1000+64, 32, 4) // 5.78090823s
111+
// t0, err = db.DeletemeSelectNodesRandom5(1000*1000+64, 64, 2) // 5.845077626s
112+
// t0, err = db.DeletemeSelectNodesRandom5(1000*1000+192, 64, 4) // 5.57853586s
113+
// t0, err = db.DeletemeSelectNodesRandom5(1000*1000+192, 128, 1) // 5.772750195s
114+
// t0, err = db.DeletemeSelectNodesRandom5(1000*1000+192, 128, 2) // 5.593609741s
115+
// t0, err = db.DeletemeSelectNodesRandom5(1000*1000+448, 128, 4) // 5.829905885s
116+
117+
// t0, err = db.DeletemeSelectLeaves(100) // 164.934957ms
118+
// t0, err = db.DeletemeSelectLeaves(1000) // 1.446072294s
119+
// t0, err = db.DeletemeSelectLeaves(10 * 1000) // 14.24444017s
120+
121+
// t0, err = db.DeletemeSelectLeavesStoredProc(1000) // 608.293495ms
122+
123+
// t0, err = db.DeletemeSelectLeavesStoredFunc(1000) // 459.793285ms
124+
// t0, err = db.DeletemeSelectLeavesStoredFunc(100 * 1000) // 36.995034654s
125+
126+
// values at ETH's computer
127+
// t0, err = db.DeletemeSelectLeavesStoredFunc2(1000, 1, 1) // 373.195752ms
128+
// t0, err = db.DeletemeSelectLeavesStoredFunc2(1000, 1, 8) // 95.495026ms
129+
// t0, err = db.DeletemeSelectLeavesStoredFunc2(100*1000, 1, 8) // 8.746812923s
130+
// t0, err = db.DeletemeSelectLeavesStoredFunc2(100*1000, 1, 16) // 8.096993868s
131+
// t0, err = db.DeletemeSelectLeavesStoredFunc2(100*1000, 8, 1) // 8.737253918s
132+
// t0, err = db.DeletemeSelectLeavesStoredFunc2(100*1000+32, 8, 8) // 7.914086447s
133+
134+
// values at home computer:
135+
// t0, err = db.DeletemeSelectLeavesStoredFunc2(1000, 1, 1) // 244.728829ms
136+
// t0, err = db.DeletemeSelectLeavesStoredFunc2(1000, 1, 8) // 55.34648ms
137+
// t0, err = db.DeletemeSelectLeavesStoredFunc2(100*1000, 1, 8) // 4.77145546s
138+
// t0, err = db.DeletemeSelectLeavesStoredFunc2(100*1000, 1, 16) // 3.158051082s
139+
// t0, err = db.DeletemeSelectLeavesStoredFunc2(100*1000, 8, 1) // 4.794854328s
140+
// t0, err = db.DeletemeSelectLeavesStoredFunc2(100*1000+32, 8, 8) // 2.429056914s
141+
// t0, err = db.DeletemeSelectLeavesStoredFunc2(1000*1000+192, 16, 16) // 21.987717762s
142+
}
143+
144+
check(err)
145+
fmt.Printf("time: %s\n", time.Since(t0))
146+
fmt.Println("ready")
147+
}
148+
149+
func check(err error) {
150+
if err != nil {
151+
panic(err)
152+
}
153+
}

go.mod

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module github.com/netsec-ethz/fpki
2+
3+
go 1.17
4+
5+
require (
6+
github.com/go-sql-driver/mysql v1.6.0
7+
github.com/stretchr/testify v1.7.1
8+
)
9+
10+
require (
11+
github.com/davecgh/go-spew v1.1.0 // indirect
12+
github.com/pmezard/go-difflib v1.0.0 // indirect
13+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect
14+
)

go.sum

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
2+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3+
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
4+
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
5+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
6+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
7+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
8+
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
9+
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
10+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
11+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
12+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
13+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

pkg/db/db.go

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package db
2+
3+
import "context"
4+
5+
type FullID [33]byte // first byte is depth -1 (root not allowed)
6+
7+
type Conn interface {
8+
// Close closes the connection.
9+
Close() error
10+
// RetrieveValue returns the value associated with the node.
11+
RetrieveValue(ctx context.Context, id FullID) ([]byte, error)
12+
// RetrieveNode returns the value and the proof path (without the root) for a given node.
13+
// Since each one of the steps of the proof path has a fixed size, returning the path
14+
// as a slice is sufficient to know how many steps there were in the proof path.
15+
RetrieveNode(ctx context.Context, id FullID) ([]byte, []byte, error)
16+
}

0 commit comments

Comments
 (0)