1

我遇到了一些奇怪的行为。我正在尝试设置一个小型 web 应用程序,该应用程序使用在 Ubuntu 12.04 服务器上运行的 Aerospike 3.5 社区获取一些数据。我正在使用默认的 aerospike.conf 文件(使用 'test' 命名空间),并按照如何在此处查询的示例进行操作。

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

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

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

3 回答 3

3

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

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

于 2015-07-25T01:40:37.797 回答
1

我不熟悉 aerospike 包,但运行您的示例代码表明,无论它是否返回数据,它总是会出现恐慌。

这意味着Errors通道总是发送一个errornil。如果这是预期的行为,您必须相应地处理它,并且只有在错误不是时才会恐慌nil

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

您看到的随机性,即有时返回数据,有时不返回,是由于 select 语句的性质。如果同时发送 data 和 anil error两种情况都为真,则 select 将伪随机选择两者之一。

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

如果它首先选择数据通道,它将打印数据,然后在下一次迭代中选择错误通道并恐慌。如果它首先选择错误通道,它会恐慌并且数据永远不会打印。

于 2015-06-06T08:24:52.033 回答
1

原来这是一个合法的错误,应该尽快修复: https ://discuss.aerospike.com/t/aerospike-randomly-returning-nil-errors-when-using-query-with-go-client/1346

于 2015-06-08T12:36:18.927 回答