为了账号安全,请及时绑定邮箱和手机立即绑定

将 Query() 与 Go 客户端一起使用时,Aerospike 随机返回零错误

将 Query() 与 Go 客户端一起使用时,Aerospike 随机返回零错误

Go
慕尼黑8549860 2021-10-11 13:47:07
我正在经历一些奇怪的行为。我正在尝试设置一个小型 web 应用程序,该应用程序使用在 Ubuntu 12.04 服务器上运行的 Aerospike 3.5 社区获取一些数据。我正在使用默认的 aerospike.conf 文件(使用“test”命名空间)并遵循如何在此处查询的示例。当我尝试使用过滤器查询某些记录时,错误通道随机返回零错误。(此示例指向我的开发数据库实例)。要多次复制、编译和运行以下命令,您将看到返回的数据或恐慌:package mainimport (    "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 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

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

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


查看完整回答
反对 回复 2021-10-11
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

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

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

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

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

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

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


查看完整回答
反对 回复 2021-10-11
  • 3 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信