运行 使用交易进行 Go 测试
Running a Go test with a Transaction
我有使用 FoundationDB 的 Go 代码,我想测试它。
我照抄了围棋test from Apple's Github。当我取消注释在事务中实际运行 Set
的行时,测试挂起然后超时。 (该行仍然被注释掉,它按预期工作。)
func TestExampleTransactor(t *testing.T) {
fdb.MustAPIVersion(400) // Note: test behaves the same with MustAPIVersion(600)
db := fdb.MustOpenDefault()
setOne := func(t fdb.Transactor, key fdb.Key, value []byte) error {
fmt.Printf("setOne called with: %T\n", t)
_, e := t.Transact(func(tr fdb.Transaction) (interface{}, error) {
// We don't actually call tr.Set here to avoid mutating a real database.
tr.Set(key, value) // **NOTE** this is the line I uncommented
return nil, nil
})
return e
}
setMany := func(t fdb.Transactor, value []byte, keys ...fdb.Key) error {
fmt.Printf("setMany called with: %T\n", t)
_, e := t.Transact(func(tr fdb.Transaction) (interface{}, error) {
for _, key := range keys {
setOne(tr, key, value)
}
return nil, nil
})
return e
}
var e error
fmt.Println("Calling setOne with a database:")
e = setOne(db, []byte("foo"), []byte("bar"))
if e != nil {
fmt.Println(e)
return
}
fmt.Println("\nCalling setMany with a database:")
e = setMany(db, []byte("bar"), fdb.Key("foo1"), fdb.Key("foo2"), fdb.Key("foo3"))
if e != nil {
fmt.Println(e)
return
}
}
我是 运行 MacOS 10.13.6。我安装了 FoundationDB,我可以使用 fdbcli
连接到它,也可以读取和写入它。
以下是 foundation
个进程:
ps aux | grep foundation
root 12942 1.0 0.3 4488980 46608 ?? S 12:35PM 2:00.06 /usr/local/libexec/fdbserver --cluster_file /usr/local/etc/foundationdb/fdb.cluster --datadir /usr/local/foundationdb/data/4689 --listen_address
root 12517 0.3 0.1 4382548 12204 ?? S 12:32PM 0:29.63 /usr/local/foundationdb/backup_agent/backup_agent --cluster_file /usr/local/etc/foundationdb/fdb.cluster
bancron 25399 0.0 0.0 4258468 200 s005 R+ 2:55PM 0:00.00 grep foundation
root 12515 0.0 0.0 4297540 584 ?? Ss 12:32PM 0:00.01 /usr/local/libexec/fdbmonitor --conffile /usr/local/etc/foundationdb/foundationdb.conf --lockfile /var/run/FoundationDB.pid
如果相关,这是在 /usr/local/etc/foundationdb/fdb.cluster
:
处找到的默认群集文件的内容
JCKqKWc6:ku0VRske@127.0.0.1:4689
这是/usr/local/etc/foundationdb/foundationdb.conf
的内容:
[general]
restart_delay = 60
cluster_file = /usr/local/etc/foundationdb/fdb.cluster
## Default parameters for individual fdbserver processes
[fdbserver]
command = /usr/local/libexec/fdbserver
public_address = auto:$ID
listen_address = public
datadir = /usr/local/foundationdb/data/$ID
logdir = /usr/local/foundationdb/logs
## An individual fdbserver process with id 4689
## Parameters set here override defaults from the [fdbserver] section
[fdbserver.4689]
[backup_agent]
command = /usr/local/foundationdb/backup_agent/backup_agent
logdir = /usr/local/foundationdb/logs
[backup_agent.1]
我现在可以通过 运行 一些 fdbserver 和 fdbcli 命令先工作了。
func TestMain(m *testing.M) {
port := 4692
testFileContents := []byte(fmt.Sprintf("test:test%d@127.0.0.1:%d", port, port))
err := ioutil.WriteFile("fdb_test.cluster", testFileContents, 0755)
db := fdb.MustOpen("fdb_test.cluster", []byte("DB"))
mErr := m.Run()
// ... tests run now
err = fdbServerCmd.Process.Kill()
if err != nil {
log.Fatalf("error killing fdbserver process %s", err)
}
os.Exit(mErr)
}
func createDB() *exec.Cmd {
port := 4692
testFileContents := []byte(fmt.Sprintf("test:test%d@127.0.0.1:%d", port, port))
err := ioutil.WriteFile("fdb_test.cluster", testFileContents, 0755)
if err != nil {
log.Fatalf("unable to write fdb_test.cluster file %s", err)
}
fdbServerLoc := "/usr/local/libexec/fdbserver"
fdbServerCmd := exec.Command(fdbServerLoc,
"-p", fmt.Sprintf("127.0.0.1:%d", port),
"--datadir", fmt.Sprintf("/tmp/fdb%d", port),
"-C", "fdb_test.cluster",
)
fdbServerCmd.Start()
configureLoc := "/usr/local/bin/fdbcli"
configureCmd := exec.Command(configureLoc,
"-C", "fdb_test.cluster", "--exec", "configure new single memory")
// This may error if the DB already exists (from previous test runs), so ignore the error.
configureCmd.Run()
return fdbServerCmd
}
我有使用 FoundationDB 的 Go 代码,我想测试它。
我照抄了围棋test from Apple's Github。当我取消注释在事务中实际运行 Set
的行时,测试挂起然后超时。 (该行仍然被注释掉,它按预期工作。)
func TestExampleTransactor(t *testing.T) {
fdb.MustAPIVersion(400) // Note: test behaves the same with MustAPIVersion(600)
db := fdb.MustOpenDefault()
setOne := func(t fdb.Transactor, key fdb.Key, value []byte) error {
fmt.Printf("setOne called with: %T\n", t)
_, e := t.Transact(func(tr fdb.Transaction) (interface{}, error) {
// We don't actually call tr.Set here to avoid mutating a real database.
tr.Set(key, value) // **NOTE** this is the line I uncommented
return nil, nil
})
return e
}
setMany := func(t fdb.Transactor, value []byte, keys ...fdb.Key) error {
fmt.Printf("setMany called with: %T\n", t)
_, e := t.Transact(func(tr fdb.Transaction) (interface{}, error) {
for _, key := range keys {
setOne(tr, key, value)
}
return nil, nil
})
return e
}
var e error
fmt.Println("Calling setOne with a database:")
e = setOne(db, []byte("foo"), []byte("bar"))
if e != nil {
fmt.Println(e)
return
}
fmt.Println("\nCalling setMany with a database:")
e = setMany(db, []byte("bar"), fdb.Key("foo1"), fdb.Key("foo2"), fdb.Key("foo3"))
if e != nil {
fmt.Println(e)
return
}
}
我是 运行 MacOS 10.13.6。我安装了 FoundationDB,我可以使用 fdbcli
连接到它,也可以读取和写入它。
以下是 foundation
个进程:
ps aux | grep foundation
root 12942 1.0 0.3 4488980 46608 ?? S 12:35PM 2:00.06 /usr/local/libexec/fdbserver --cluster_file /usr/local/etc/foundationdb/fdb.cluster --datadir /usr/local/foundationdb/data/4689 --listen_address
root 12517 0.3 0.1 4382548 12204 ?? S 12:32PM 0:29.63 /usr/local/foundationdb/backup_agent/backup_agent --cluster_file /usr/local/etc/foundationdb/fdb.cluster
bancron 25399 0.0 0.0 4258468 200 s005 R+ 2:55PM 0:00.00 grep foundation
root 12515 0.0 0.0 4297540 584 ?? Ss 12:32PM 0:00.01 /usr/local/libexec/fdbmonitor --conffile /usr/local/etc/foundationdb/foundationdb.conf --lockfile /var/run/FoundationDB.pid
如果相关,这是在 /usr/local/etc/foundationdb/fdb.cluster
:
JCKqKWc6:ku0VRske@127.0.0.1:4689
这是/usr/local/etc/foundationdb/foundationdb.conf
的内容:
[general]
restart_delay = 60
cluster_file = /usr/local/etc/foundationdb/fdb.cluster
## Default parameters for individual fdbserver processes
[fdbserver]
command = /usr/local/libexec/fdbserver
public_address = auto:$ID
listen_address = public
datadir = /usr/local/foundationdb/data/$ID
logdir = /usr/local/foundationdb/logs
## An individual fdbserver process with id 4689
## Parameters set here override defaults from the [fdbserver] section
[fdbserver.4689]
[backup_agent]
command = /usr/local/foundationdb/backup_agent/backup_agent
logdir = /usr/local/foundationdb/logs
[backup_agent.1]
我现在可以通过 运行 一些 fdbserver 和 fdbcli 命令先工作了。
func TestMain(m *testing.M) {
port := 4692
testFileContents := []byte(fmt.Sprintf("test:test%d@127.0.0.1:%d", port, port))
err := ioutil.WriteFile("fdb_test.cluster", testFileContents, 0755)
db := fdb.MustOpen("fdb_test.cluster", []byte("DB"))
mErr := m.Run()
// ... tests run now
err = fdbServerCmd.Process.Kill()
if err != nil {
log.Fatalf("error killing fdbserver process %s", err)
}
os.Exit(mErr)
}
func createDB() *exec.Cmd {
port := 4692
testFileContents := []byte(fmt.Sprintf("test:test%d@127.0.0.1:%d", port, port))
err := ioutil.WriteFile("fdb_test.cluster", testFileContents, 0755)
if err != nil {
log.Fatalf("unable to write fdb_test.cluster file %s", err)
}
fdbServerLoc := "/usr/local/libexec/fdbserver"
fdbServerCmd := exec.Command(fdbServerLoc,
"-p", fmt.Sprintf("127.0.0.1:%d", port),
"--datadir", fmt.Sprintf("/tmp/fdb%d", port),
"-C", "fdb_test.cluster",
)
fdbServerCmd.Start()
configureLoc := "/usr/local/bin/fdbcli"
configureCmd := exec.Command(configureLoc,
"-C", "fdb_test.cluster", "--exec", "configure new single memory")
// This may error if the DB already exists (from previous test runs), so ignore the error.
configureCmd.Run()
return fdbServerCmd
}