1

奇妙な動作が発生しています。Ubuntu 12.04 サーバーで実行されている Aerospike 3.5 コミュニティを使用してデータをフェッチする小さな webapp をセットアップしようとしています。デフォルトの aerospike.conf ファイル (「test」名前空間を使用) を使用しており、ここで照会する方法の例に従っています。

フィルタを使用していくつかのレコードをクエリしようとすると、Errors チャネルがランダムに 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
}
4

3 に答える 3

3

更新を投稿するためだけに、レコード ストリームがサーバー側から終了すると、Errors チャネルと Records チャネルの両方が自動的に閉じられるため、Errors チャネルの値は nil になります。

結局、これはエラーではありませんでした。それに応じて、Aerospike ユーザー フォーラムの投稿のスレッドを更新しました。

于 2015-07-25T01:40:37.797 に答える
1

これは正当なバグであり、すぐに修正する必要があることが判明しました: https://discuss.aerospike.com/t/aerospike-randomly-returning-nil-errors-when-using-query-with-go-client/1346

于 2015-06-08T12:36:18.927 に答える
1

aerospike パッケージには詳しくありませんが、サンプル コードを実行すると、データが返されるかどうかに関係なく、常にパニックになることがわかります。

つまり、Errorsチャネルは常に または のいずれかを送信しerrorますnil。それが予想される動作である場合は、それに応じて処理する必要があり、エラーがそうでない場合にのみパニックになりますnil

nilチャネルでの送信は、値がチャネルで送信されていることを意味し、select ステートメントをトリガーします。したがって、nil error.

表示されるランダム性、つまりデータが返される場合と返されない場合があるのは、select ステートメントの性質によるものです。data と a の両方nil errorが同時に送信されている場合、両方のケースが真であり、select は2 つのうちの 1 つを疑似ランダムに選択します。

通信の 1 つまたは複数を続行できる場合、続行できる 1 つの通信が一様擬似乱数選択によって選択されます。それ以外の場合、デフォルトのケースがあれば、そのケースが選択されます。デフォルトのケースがない場合、少なくとも 1 つの通信が続行できるようになるまで、「select」ステートメントはブロックされます。

最初にデータ チャネルを選択すると、データが出力され、次の反復でエラー チャネルが選択されてパニックになります。最初にエラー チャネルを選択すると、パニックが発生し、データが印刷されません。

于 2015-06-06T08:24:52.033 に答える