我遇到了一些奇怪的行为。我试图建立一个小型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
}
答案 0 :(得分:3)
只是发布更新,当记录流从服务器端结束时,错误和记录通道都会自动关闭,因此来自错误通道的nil值。
所以这毕竟不是一个错误。我们相应地更新了我们的Aerospike用户论坛帖子中的主题。
答案 1 :(得分:1)
我对airospike软件包不熟悉,但运行示例代码表明,无论是否返回数据,它总是会引起恐慌。
这意味着Errors
频道始终会发送error
或nil
。如果这是预期的行为,则必须相应地处理它,并且只在错误不是nil
时才会发生恐慌。
在频道上发送nil
仍然意味着正在通道上发送一个值,它将触发select语句。因此nil error
上的恐慌。
您看到的随机性,即有时返回数据,有时不返回是由于select语句的性质。如果两个数据和nil error
同时发送,则两个案例都为真,并选择pseudo randomly select两个中的一个。
如果一个或多个通信可以进行,则单个通信 可以通过统一的伪随机选择来选择。 否则,如果存在默认情况,则选择该情况。如果有 没有默认情况,“select”语句会阻塞至少一个 通讯可以继续。
如果它首先选择数据通道,它将打印数据,然后在下一次迭代时选择错误通道和混乱。如果它首先选择错误通道,则会发生恐慌并且数据永远不会打印出来。
答案 2 :(得分:1)