lundi 8 avril 2019

In FoundationDB with Go, how can I run a test with a Transaction?

I have Go code using FoundationDB and I want to test it.

I have literally copied the Go test from Apple's Github. When I uncomment the line that actually runs Set within the transaction, the test hangs and then times out. (With the line still commented out it works as expected.)

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
    }
}

I am running MacOS 10.13.6. I have FoundationDB installed and I'm able to connect to it using fdbcli, as well as read from and write to it.

Here are the foundation processes:

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

In case it is relevant, this is the contents of the default cluster file found at /usr/local/etc/foundationdb/fdb.cluster:

JCKqKWc6:ku0VRske@127.0.0.1:4689

And this is the contents of /usr/local/etc/foundationdb/foundationdb.conf:

## foundationdb.conf
##
## Configuration file for FoundationDB server processes
## Full documentation is available at
## https://apple.github.io/foundationdb/configuration.html#the-configuration-file

[general]
restart_delay = 60
## by default, restart_backoff = restart_delay_reset_interval = restart_delay
# initial_restart_delay = 0
# restart_backoff = 60
# restart_delay_reset_interval = 60
cluster_file = /usr/local/etc/foundationdb/fdb.cluster
# kill_on_configuration_change = true

## 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
# logsize = 10MiB
# maxlogssize = 100MiB
# machine_id = 
# datacenter_id = 
# class = 
# memory = 8GiB
# storage_memory = 1GiB
# metrics_cluster =
# metrics_prefix =

## 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]

Aucun commentaire:

Enregistrer un commentaire