使用带有Go客户端

时间:2015-06-05 22:44:26

标签: go aerospike

我遇到了一些奇怪的行为。我试图建立一个小型webapp,使用在Ubuntu 12.04服务器上运行的Aerospike 3.5社区获取一些数据。我使用默认的aerospike.conf文件(使用' test'命名空间),并遵循如何查询here的示例。

当我尝试使用过滤器查询某些记录时,错误通道随机返回nil错误。 (这个例子指向我的dev数据库实例)。

要复制,编译并运行以下多次,您将看到返回的数据或恐慌:

package main

import (
    "fmt"

    "github.com/aerospike/aerospike-client-go"
)

func main() {

    c, err := aerospike.NewClient("52.7.157.46", 3000)
    if err != nil {
        panic(err)
    }

    recs := liststuff(c)

    fmt.Printf("got results: %v", recs)
}

func liststuff(client *aerospike.Client) []*aerospike.Record {

    // fetch some records with a filter
    stm := aerospike.NewStatement("test", "products")
    stm.Addfilter(aerospike.NewEqualFilter("visible", 1))
    fmt.Println("querying...")
    recordset, err := client.Query(nil, stm)
    if err != nil {
        panic(err)
    }

    // collect results into a slice
    recs := []*aerospike.Record{}
L:
    for {
        select {
        case rec, chanOpen := <-recordset.Records:
            if !chanOpen {
                break L
            }
            fmt.Println("found record %v", rec)
            recs = append(recs, rec)
        case err := <-recordset.Errors:
            if err != nil {
                panic(err)
            } else {
                panic(fmt.Errorf("error nil when it should exist"))
            }
            return nil
        }
    }

    return recs
}

3 个答案:

答案 0 :(得分:3)

只是发布更新,当记录流从服务器端结束时,错误和记录通道都会自动关闭,因此来自错误通道的nil值。

所以这毕竟不是一个错误。我们相应地更新了我们的Aerospike用户论坛帖子中的主题。

答案 1 :(得分:1)

我对airospike软件包不熟悉,但运行示例代码表明,无论是否返回数据,它总是会引起恐慌。

这意味着Errors频道始终会发送errornil。如果这是预期的行为,则必须相应地处理它,并且只在错误不是nil时才会发生恐慌。

在频道上发送nil仍然意味着正在通道上发送一个值,它将触发select语句。因此nil error上的恐慌。

您看到的随机性,即有时返回数据,有时不返回是由于select语句的性质。如果两个数据和nil error同时发送,则两个案例都为真,并选择pseudo randomly select两个中的一个。

  

如果一个或多个通信可以进行,则单个通信   可以通过统一的伪随机选择来选择。   否则,如果存在默认情况,则选择该情况。如果有   没有默认情况,“select”语句会阻塞至少一个   通讯可以继续。

如果它首先选择数据通道,它将打印数据,然后在下一次迭代时选择错误通道和混乱。如果它首先选择错误通道,则会发生恐慌并且数据永远不会打印出来。

答案 2 :(得分:1)