dapr / dapr/python-sdk

[FEATURE REQUEST] Expose read consistency in DaprClient.get_state

オープン
#1,200 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
Python
スター
272
フォーク
152
PR マージ指標
30日以内にマージされた PR はありません

説明

## Describe the feature

Please expose an optional read-consistency argument on both synchronous and asynchronous `DaprClient.get_state()`, preserving existing defaults and positional arguments.

I encountered this while investigating `DaprSession` in the OpenAI Agents SDK. Selecting strong consistency passes `state_metadata={"consistency": "strong"}` to the Dapr client, but that only populates request metadata. It does not set the dedicated `GetStateRequest.consistency` field.

### Current behavior

With `dapr==1.16.0`, both public methods have the arguments `store_name`, `key`, `state_metadata`, and `metadata` (gRPC call metadata). The same limitation remains in the inspected current source at `e4ad1818079c5089814e4d1610b585286d28b98f`:

- [Synchronous request construction](https://github.com/dapr/python-sdk/blob/e4ad1818079c5089814e4d1610b585286d28b98f/dapr/clients/grpc/client.py#L703)
- [Asynchronous request construction](https://github.com/dapr/python-sdk/blob/e4ad1818079c5089814e4d1610b585286d28b98f/dapr/aio/clients/grpc/client.py#L641)

Both construct the request as:

```python
req = api_v1.GetStateRequest(store_name=store_name, key=key, metadata=state_metadata)
```

### Reproduction evidence

Using the installed asynchronous Dapr client and a local `grpc.aio` capture server implementing `DaprServicer.GetState` and `SaveState`, I exercised public `DaprSession.get_items()` and `add_items()` with `consistency=DAPR_CONSISTENCY_STRONG`. The client HTTP readiness check was disabled only for this isolated mock-server test; protobuf serialization and gRPC transport used the actual Dapr client.

The captured read request was:

```json
{
"store_name": "statestore",
"key": "session-strong:messages",
"consistency_enum_value": 0,
"consistency_name": "CONSISTENCY_UNSPECIFIED",
"metadata": {"consistency": "strong"}
}
```

The corresponding write request correctly carried `options.consistency = CONSISTENCY_STRONG`. This establishes the request-encoding difference; it does not demonstrate stale reads against a real state store. The wire capture exercised the async path; the sync-path observation is from source inspection.

### Expected behavior and scope

Allow callers to request `Consistency.strong` or `Consistency.eventual` through the public `get_state()` API and serialize that choice into the dedicated protobuf field. Omitting the new argument should preserve `CONSISTENCY_UNSPECIFIED`. Actual guarantees remain dependent on state-store support.

This request is limited to `get_state()`: the inspected `GetBulkStateRequest` does not have a corresponding consistency field.

## Release Note

RELEASE NOTE: **ADD** Optional read-consistency selection for synchronous and asynchronous `DaprClient.get_state()`.

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

Start with synchronous request construction in dapr/clients/grpc/client.py around line 703 and the asynchronous path in dapr/aio/clients/grpc/client.py around line 641. Compare the GetStateRequest fields with the existing state-consistency handling, then verify both public get_state() paths preserve existing defaults and encode the selected consistency in the dedicated protobuf field.

索引モデルが issue の本文から書いたものです。

評価

技術スタック
grpc, python
領域
api
issue の種類
機能追加
難易度
3/5
見積もり時間
1〜2日
活発さ
活発
明瞭さ
明確に書かれている
初心者へのやさしさ
76/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。