1

Riak Datatype API では、存在しないキーとデフォルト値を区別できないようです。たとえば、次のように存在しないキーをクエリするとします。

val fetchOp = new FetchCounter.Builder(key).build()
val c = client.execute(fetchOp).getDatatype

0 を保持するカウンターを取得します。ここで、このキーに値 0 のカウンターを配置してクエリを実行すると、同じ結果が得られます。これら 2 つの異なる状態を区別する方法はありますか?

注: セットを操作する場合、確認できるコンテキストがあります。セットをフェッチしてコンテキストが null の場合、このキーの下にセットが存在しないことを意味します。ただし、カウンターはコンテキストを維持しないため、このトリックはカウンターには機能しません。

更新:以下の Dmitri の提案は、次の解決策につながります。

val fetchOp = new FetchValue.Builder(location).withOption(FetchValue.Option.HEAD, java.lang.Boolean.TRUE).build()
val res = client.execute(fetchOp) // res.isNotFound should equal(true)

ただし、欠点は、追加のクエリを作成する必要があることです。

4

1 に答える 1

1

私が理解していることから、これはその特定のクライアントの制限です (ちなみに、それはどの言語ですか?)。気軽に Github で問題を開いてください。

少なくとも HTTP API は、存在しないカウンターと値がたまたま 0 であるカウンターを区別します。

たとえば、既存のキー (値を 0 に設定) にアクセスしようとした結果は次のとおりです。

$ curl http://localhost:8098/types/counters/buckets/room_occupancy/datatypes/room-215 -v
> GET /types/counters/buckets/room_occupancy/datatypes/room-215 HTTP/1.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< Vary: Accept-Encoding
* Server MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho) is not blacklisted
< Server: MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho)
< Date: Thu, 20 Aug 2015 03:38:56 GMT
< Content-Type: application/json
< Content-Length: 28
< 
* Connection #0 to host localhost left intact
{"type":"counter","value":0}

存在しないキーの値を取得した結果は次のとおりです。

curl http://localhost:8098/types/counters/buckets/room_occupancy/datatypes/non-existent-room -v
> GET /types/counters/buckets/room_occupancy/datatypes/non-existent-room HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:8098
> Accept: */*
> 
< HTTP/1.1 404 Object Not Found
< Vary: Accept-Encoding
* Server MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho) is not blacklisted
< Server: MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho)
< Date: Thu, 20 Aug 2015 03:32:51 GMT
< Content-Type: application/json
< Content-Length: 37
< 
{"type":"counter","error":"notfound"}

ただし、既存のクライアントで実行できる回避策があります。

そのカウンターに対して通常の Fetch Object 操作を実行できます (「HEAD only」オプションを true に設定することをお勧めします)。Riak カウンター (またはその他のデータ型) は通常のオブジェクトとして引き続き存在し、(Fetch Counter などではなく) HEAD リクエストを発行すると、予想どおり 404 が返されます。

于 2015-08-20T03:45:25.080 に答える