From ea4d536c34d5662b2d3d3d2ee072648129223557 Mon Sep 17 00:00:00 2001 From: yangxuanjia Date: Sun, 27 Sep 2020 15:56:02 +0800 Subject: [PATCH 01/16] range stream --- Documentation/dev-guide/api_reference_v3.md | 28 + .../apispec/swagger/rpc.swagger.json | 264 ++- .../apispec/swagger/v3election.swagger.json | 10 +- .../apispec/swagger/v3lock.swagger.json | 4 +- clientv3/kv.go | 138 +- clientv3/leasing/kv.go | 5 + clientv3/namespace/kv.go | 19 + clientv3/op.go | 26 + clientv3/ordering/kv.go | 5 + clientv3/retry.go | 4 + etcdctl/ctlv3/command/getstream_command.go | 124 ++ etcdctl/ctlv3/command/printer.go | 12 +- etcdctl/ctlv3/command/printer_fields.go | 8 + etcdctl/ctlv3/command/printer_simple.go | 6 + etcdctl/ctlv3/ctl.go | 1 + etcdserver/api/v3rpc/key.go | 56 +- etcdserver/apply.go | 78 + etcdserver/apply_auth.go | 7 + etcdserver/corrupt.go | 4 + etcdserver/etcdserverpb/etcdserver.pb.go | 2 + etcdserver/etcdserverpb/gw/rpc.pb.gw.go | 54 + etcdserver/etcdserverpb/rpc.pb.go | 1929 ++++++++++++----- etcdserver/etcdserverpb/rpc.proto | 52 + etcdserver/util.go | 8 + etcdserver/v3_server.go | 42 + mvcc/kv.go | 3 + mvcc/kv_view.go | 6 + mvcc/kvstore_txn.go | 88 + mvcc/metrics_txn.go | 18 +- pkg/mock/mockserver/mockserver.go | 4 + proxy/grpcproxy/adapter/kv_client_adapter.go | 33 + proxy/grpcproxy/kv.go | 5 + 32 files changed, 2406 insertions(+), 637 deletions(-) create mode 100644 etcdctl/ctlv3/command/getstream_command.go diff --git a/Documentation/dev-guide/api_reference_v3.md b/Documentation/dev-guide/api_reference_v3.md index f2904a98173..c5a20feb333 100644 --- a/Documentation/dev-guide/api_reference_v3.md +++ b/Documentation/dev-guide/api_reference_v3.md @@ -45,6 +45,7 @@ This is a generated documentation. Please read the proto files for more. | Method | Request Type | Response Type | Description | | ------ | ------------ | ------------- | ----------- | | Range | RangeRequest | RangeResponse | Range gets the keys in the range from the key-value store. | +| RangeStream | RangeStreamRequest | RangeStreamResponse | RangeStream gets the keys in the range stream from the key-value store. | | Put | PutRequest | PutResponse | Put puts the given key into the key-value store. A put request increments the revision of the key-value store and generates one event in the event history. | | DeleteRange | DeleteRangeRequest | DeleteRangeResponse | DeleteRange deletes the given range from the key-value store. A delete request increments the revision of the key-value store and generates a delete event in the event history for every deleted key. | | Txn | TxnRequest | TxnResponse | Txn processes multiple requests in a single transaction. A txn request increments the revision of the key-value store and generates events with the same revision for every completed request. It is not allowed to modify the same key several times within one txn. | @@ -808,6 +809,31 @@ Empty field. +##### message `RangeStreamRequest` (etcdserver/etcdserverpb/rpc.proto) + +| Field | Description | Type | +| ----- | ----------- | ---- | +| key | key is the first key for the range. If range_end is not given, the request only looks up key. | bytes | +| range_end | range_end is the upper bound on the requested range [key, range_end). If range_end is '\0', the range is all keys >= key. If range_end is key plus one (e.g., "aa"+1 == "ab", "a\xff"+1 == "b"), then the range request gets all keys prefixed with key. If both key and range_end are '\0', then the range request returns all keys. | bytes | +| limit | limit is a limit on the number of keys returned for the request. When limit is set to 0, it is treated as no limit. | int64 | +| revision | revision is the point-in-time of the key-value store to use for the range. If revision is less or equal to zero, the range is over the newest key-value store. If the revision has been compacted, ErrCompacted is returned as a response. | int64 | +| serializable | serializable sets the range request to use serializable member-local reads. Range requests are linearizable by default; linearizable requests have higher latency and lower throughput than serializable requests but reflect the current consensus of the cluster. For better performance, in exchange for possible stale reads, a serializable range request is served locally without needing to reach consensus with other nodes in the cluster. | bool | +| keys_only | keys_only when set returns only the keys and not the values. | bool | + + + +##### message `RangeStreamResponse` (etcdserver/etcdserverpb/rpc.proto) + +| Field | Description | Type | +| ----- | ----------- | ---- | +| header | | ResponseHeader | +| kvs | kvs is the list of key-value pairs matched by the range request. kvs is empty when count is requested. | (slice of) mvccpb.KeyValue | +| count | count is set to the number of keys within the range when requested. | int64 | +| totalCount | | int64 | +| totalSize | | int64 | + + + ##### message `RequestOp` (etcdserver/etcdserverpb/rpc.proto) | Field | Description | Type | @@ -817,6 +843,7 @@ Empty field. | request_put | | PutRequest | | request_delete_range | | DeleteRangeRequest | | request_txn | | TxnRequest | +| request_range_stream | | RangeStreamRequest | @@ -840,6 +867,7 @@ Empty field. | response_put | | PutResponse | | response_delete_range | | DeleteRangeResponse | | response_txn | | TxnResponse | +| response_range_stream | | RangeStreamResponse | diff --git a/Documentation/dev-guide/apispec/swagger/rpc.swagger.json b/Documentation/dev-guide/apispec/swagger/rpc.swagger.json index cdcb32c3d45..52f7ffd56b6 100644 --- a/Documentation/dev-guide/apispec/swagger/rpc.swagger.json +++ b/Documentation/dev-guide/apispec/swagger/rpc.swagger.json @@ -36,7 +36,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -69,7 +69,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -102,7 +102,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -135,7 +135,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -168,7 +168,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -201,7 +201,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -234,7 +234,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -267,7 +267,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -300,7 +300,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -333,7 +333,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -366,7 +366,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -399,7 +399,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -432,7 +432,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -465,7 +465,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -498,7 +498,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -531,7 +531,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -564,7 +564,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -597,7 +597,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -630,7 +630,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -663,7 +663,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -696,7 +696,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -729,7 +729,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -762,7 +762,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -795,7 +795,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -828,7 +828,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -861,7 +861,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -894,7 +894,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -927,7 +927,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -960,7 +960,49 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + } + } + }, + "/v3/kv/rangestream": { + "post": { + "tags": [ + "KV" + ], + "summary": "RangeStream gets the keys in the range stream from the key-value store.", + "operationId": "KV_RangeStream", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/etcdserverpbRangeStreamRequest" + } + } + ], + "responses": { + "200": { + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "title": "Stream result of etcdserverpbRangeStreamResponse", + "properties": { + "error": { + "$ref": "#/definitions/runtimeStreamError" + }, + "result": { + "$ref": "#/definitions/etcdserverpbRangeStreamResponse" + } + } + } + }, + "default": { + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -993,7 +1035,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1026,7 +1068,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1069,7 +1111,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1102,7 +1144,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1135,7 +1177,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1168,7 +1210,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1201,7 +1243,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1234,7 +1276,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1267,7 +1309,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1300,7 +1342,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1342,7 +1384,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1375,7 +1417,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1408,7 +1450,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1451,7 +1493,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1567,8 +1609,7 @@ "type": "object", "properties": { "no_password": { - "type": "boolean", - "format": "boolean" + "type": "boolean" } } }, @@ -1779,8 +1820,7 @@ "title": "authRevision is the current revision of auth store" }, "enabled": { - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "header": { "$ref": "#/definitions/etcdserverpbResponseHeader" @@ -1962,8 +2002,7 @@ "properties": { "physical": { "description": "physical is set so the RPC will wait until the compaction is physically\napplied to the local database such that compacted entries are totally\nremoved from the backend database.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "revision": { "description": "revision is the key-value store revision for the compaction operation.", @@ -2049,8 +2088,7 @@ }, "prev_kv": { "description": "If prev_kv is set, etcd gets the previous key-value pairs before deleting it.\nThe previous key-value pairs will be returned in the delete response.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "range_end": { "description": "range_end is the key following the last key to delete for the range [key, range_end).\nIf range_end is not given, the range is defined to contain only the key argument.\nIf range_end is one bit larger than the given key, then the range is all the keys\nwith the prefix (the given key).\nIf range_end is '\\0', the range is all keys greater than or equal to the key argument.", @@ -2266,8 +2304,7 @@ }, "keys": { "description": "keys is true to query all the keys attached to this lease.", - "type": "boolean", - "format": "boolean" + "type": "boolean" } } }, @@ -2319,8 +2356,7 @@ }, "isLearner": { "description": "isLearner indicates if the member is raft learner.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "name": { "description": "name is the human-readable name of the member. If the member is not started, the name will be an empty string.", @@ -2340,8 +2376,7 @@ "properties": { "isLearner": { "description": "isLearner indicates if the added member is raft learner.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "peerURLs": { "description": "peerURLs is the list of URLs the added member will use to communicate with the cluster.", @@ -2375,8 +2410,7 @@ "type": "object", "properties": { "linearizable": { - "type": "boolean", - "format": "boolean" + "type": "boolean" } } }, @@ -2500,13 +2534,11 @@ "properties": { "ignore_lease": { "description": "If ignore_lease is set, etcd updates the key using its current lease.\nReturns an error if the key does not exist.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "ignore_value": { "description": "If ignore_value is set, etcd updates the key using its current value.\nReturns an error if the key does not exist.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "key": { "description": "key is the key, in bytes, to put into the key-value store.", @@ -2520,8 +2552,7 @@ }, "prev_kv": { "description": "If prev_kv is set, etcd gets the previous key-value pair before changing it.\nThe previous key-value pair will be returned in the put response.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "value": { "description": "value is the value, in bytes, to associate with the key in the key-value store.", @@ -2547,8 +2578,7 @@ "properties": { "count_only": { "description": "count_only when set returns only the count of the keys in the range.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "key": { "description": "key is the first key for the range. If range_end is not given, the request only looks up key.", @@ -2557,8 +2587,7 @@ }, "keys_only": { "description": "keys_only when set returns only the keys and not the values.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "limit": { "description": "limit is a limit on the number of keys returned for the request. When limit is set to 0,\nit is treated as no limit.", @@ -2597,8 +2626,7 @@ }, "serializable": { "description": "serializable sets the range request to use serializable member-local reads.\nRange requests are linearizable by default; linearizable requests have higher\nlatency and lower throughput than serializable requests but reflect the current\nconsensus of the cluster. For better performance, in exchange for possible stale reads,\na serializable range request is served locally without needing to reach consensus\nwith other nodes in the cluster.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "sort_order": { "description": "sort_order is the order for returned sorted results.", @@ -2630,8 +2658,68 @@ }, "more": { "description": "more indicates if there are more keys to return in the requested range.", - "type": "boolean", - "format": "boolean" + "type": "boolean" + } + } + }, + "etcdserverpbRangeStreamRequest": { + "type": "object", + "properties": { + "key": { + "description": "key is the first key for the range. If range_end is not given, the request only looks up key.", + "type": "string", + "format": "byte" + }, + "keys_only": { + "description": "keys_only when set returns only the keys and not the values.", + "type": "boolean" + }, + "limit": { + "description": "limit is a limit on the number of keys returned for the request. When limit is set to 0,\nit is treated as no limit.", + "type": "string", + "format": "int64" + }, + "range_end": { + "description": "range_end is the upper bound on the requested range [key, range_end).\nIf range_end is '\\0', the range is all keys \u003e= key.\nIf range_end is key plus one (e.g., \"aa\"+1 == \"ab\", \"a\\xff\"+1 == \"b\"),\nthen the range request gets all keys prefixed with key.\nIf both key and range_end are '\\0', then the range request returns all keys.", + "type": "string", + "format": "byte" + }, + "revision": { + "description": "revision is the point-in-time of the key-value store to use for the range.\nIf revision is less or equal to zero, the range is over the newest key-value store.\nIf the revision has been compacted, ErrCompacted is returned as a response.", + "type": "string", + "format": "int64" + }, + "serializable": { + "description": "serializable sets the range request to use serializable member-local reads.\nRange requests are linearizable by default; linearizable requests have higher\nlatency and lower throughput than serializable requests but reflect the current\nconsensus of the cluster. For better performance, in exchange for possible stale reads,\na serializable range request is served locally without needing to reach consensus\nwith other nodes in the cluster.", + "type": "boolean" + } + } + }, + "etcdserverpbRangeStreamResponse": { + "type": "object", + "properties": { + "count": { + "description": "count is set to the number of keys within the range when requested.", + "type": "string", + "format": "int64" + }, + "header": { + "$ref": "#/definitions/etcdserverpbResponseHeader" + }, + "kvs": { + "description": "kvs is the list of key-value pairs matched by the range request.\nkvs is empty when count is requested.", + "type": "array", + "items": { + "$ref": "#/definitions/mvccpbKeyValue" + } + }, + "totalCount": { + "type": "string", + "format": "int64" + }, + "totalSize": { + "type": "string", + "format": "int64" } } }, @@ -2647,6 +2735,9 @@ "request_range": { "$ref": "#/definitions/etcdserverpbRangeRequest" }, + "request_range_stream": { + "$ref": "#/definitions/etcdserverpbRangeStreamRequest" + }, "request_txn": { "$ref": "#/definitions/etcdserverpbTxnRequest" } @@ -2689,6 +2780,9 @@ "response_range": { "$ref": "#/definitions/etcdserverpbRangeResponse" }, + "response_range_stream": { + "$ref": "#/definitions/etcdserverpbRangeStreamResponse" + }, "response_txn": { "$ref": "#/definitions/etcdserverpbTxnResponse" } @@ -2744,8 +2838,7 @@ }, "isLearner": { "description": "isLearner indicates if the member is raft learner.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "leader": { "description": "leader is the member ID which the responding member believes is the current leader.", @@ -2815,8 +2908,7 @@ }, "succeeded": { "description": "succeeded is set to true if the compare evaluated to true or false otherwise.", - "type": "boolean", - "format": "boolean" + "type": "boolean" } } }, @@ -2842,8 +2934,7 @@ }, "fragment": { "description": "fragment enables splitting large revisions into multiple watch responses.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "key": { "description": "key is the key to register for watching.", @@ -2852,13 +2943,11 @@ }, "prev_kv": { "description": "If prev_kv is set, created watcher gets the previous KV before the event happens.\nIf the previous KV is already compacted, nothing will be returned.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "progress_notify": { "description": "progress_notify is set so that the etcd server will periodically send a WatchResponse with\nno events to the new watcher if there are no recent events. It is useful when clients\nwish to recover a disconnected watcher starting from a recent known revision.\nThe etcd server may decide how often it will send notifications based on current load.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "range_end": { "description": "range_end is the end of the range [key, range_end) to watch. If range_end is not given,\nonly the key argument is watched. If range_end is equal to '\\0', all keys greater than\nor equal to the key argument are watched.\nIf the range_end is one bit larger than the given key,\nthen all keys with the prefix (the given key) will be watched.", @@ -2904,8 +2993,7 @@ }, "canceled": { "description": "canceled is set to true if the response is for a cancel watch request.\nNo further events will be sent to the canceled watcher.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "compact_revision": { "description": "compact_revision is set to the minimum index if a watcher tries to watch\nat a compacted index.\n\nThis happens when creating a watcher at a compacted revision or the watcher cannot\ncatch up with the progress of the key-value store.\n\nThe client should treat the watcher as canceled and should not try to create any\nwatcher with the same start_revision again.", @@ -2914,8 +3002,7 @@ }, "created": { "description": "created is set to true if the response is for a create watch request.\nThe client should record the watch_id and expect to receive events for\nthe created watcher from the same stream.\nAll events sent to the created watcher will attach with the same watch_id.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "events": { "type": "array", @@ -2925,8 +3012,7 @@ }, "fragment": { "description": "framgment is true if large watch response was split over multiple responses.", - "type": "boolean", - "format": "boolean" + "type": "boolean" }, "header": { "$ref": "#/definitions/etcdserverpbResponseHeader" diff --git a/Documentation/dev-guide/apispec/swagger/v3election.swagger.json b/Documentation/dev-guide/apispec/swagger/v3election.swagger.json index efd647ae6a4..7df6582f3a9 100644 --- a/Documentation/dev-guide/apispec/swagger/v3election.swagger.json +++ b/Documentation/dev-guide/apispec/swagger/v3election.swagger.json @@ -23,7 +23,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -56,7 +56,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -98,7 +98,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -131,7 +131,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -164,7 +164,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } diff --git a/Documentation/dev-guide/apispec/swagger/v3lock.swagger.json b/Documentation/dev-guide/apispec/swagger/v3lock.swagger.json index b3692fd68f7..3418dc55d2d 100644 --- a/Documentation/dev-guide/apispec/swagger/v3lock.swagger.json +++ b/Documentation/dev-guide/apispec/swagger/v3lock.swagger.json @@ -23,7 +23,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } @@ -56,7 +56,7 @@ } }, "default": { - "description": "An unexpected error response", + "description": "An unexpected error response.", "schema": { "$ref": "#/definitions/runtimeError" } diff --git a/clientv3/kv.go b/clientv3/kv.go index 0628ed0f12c..afe0bf6c81d 100644 --- a/clientv3/kv.go +++ b/clientv3/kv.go @@ -16,6 +16,8 @@ package clientv3 import ( "context" + v3rpc "go.etcd.io/etcd/v3/etcdserver/api/v3rpc/rpctypes" + "time" pb "go.etcd.io/etcd/v3/etcdserver/etcdserverpb" @@ -23,11 +25,12 @@ import ( ) type ( - CompactResponse pb.CompactionResponse - PutResponse pb.PutResponse - GetResponse pb.RangeResponse - DeleteResponse pb.DeleteRangeResponse - TxnResponse pb.TxnResponse + CompactResponse pb.CompactionResponse + PutResponse pb.PutResponse + GetResponse pb.RangeResponse + GetStreamResponse pb.RangeStreamResponse + DeleteResponse pb.DeleteRangeResponse + TxnResponse pb.TxnResponse ) type KV interface { @@ -47,6 +50,8 @@ type KV interface { // When passed WithSort(), the keys will be sorted. Get(ctx context.Context, key string, opts ...OpOption) (*GetResponse, error) + GetStream(ctx context.Context, key string, opts ...OpOption) (*GetStreamResponse, error) + // Delete deletes a key, or optionally using WithRange(end), [key, end). Delete(ctx context.Context, key string, opts ...OpOption) (*DeleteResponse, error) @@ -65,16 +70,18 @@ type KV interface { } type OpResponse struct { - put *PutResponse - get *GetResponse - del *DeleteResponse - txn *TxnResponse + put *PutResponse + get *GetResponse + getStream *GetStreamResponse + del *DeleteResponse + txn *TxnResponse } -func (op OpResponse) Put() *PutResponse { return op.put } -func (op OpResponse) Get() *GetResponse { return op.get } -func (op OpResponse) Del() *DeleteResponse { return op.del } -func (op OpResponse) Txn() *TxnResponse { return op.txn } +func (op OpResponse) Put() *PutResponse { return op.put } +func (op OpResponse) Get() *GetResponse { return op.get } +func (op OpResponse) GetStream() *GetStreamResponse { return op.getStream } +func (op OpResponse) Del() *DeleteResponse { return op.del } +func (op OpResponse) Txn() *TxnResponse { return op.txn } func (resp *PutResponse) OpResponse() OpResponse { return OpResponse{put: resp} @@ -82,6 +89,9 @@ func (resp *PutResponse) OpResponse() OpResponse { func (resp *GetResponse) OpResponse() OpResponse { return OpResponse{get: resp} } +func (resp *GetStreamResponse) OpStreamResponse() OpResponse { + return OpResponse{getStream: resp} +} func (resp *DeleteResponse) OpResponse() OpResponse { return OpResponse{del: resp} } @@ -120,6 +130,11 @@ func (kv *kv) Get(ctx context.Context, key string, opts ...OpOption) (*GetRespon return r.get, toErr(ctx, err) } +func (kv *kv) GetStream(ctx context.Context, key string, opts ...OpOption) (*GetStreamResponse, error) { + r, err := kv.Do(ctx, OpGetStream(key, opts...)) + return r.getStream, toErr(ctx, err) +} + func (kv *kv) Delete(ctx context.Context, key string, opts ...OpOption) (*DeleteResponse, error) { r, err := kv.Do(ctx, OpDelete(key, opts...)) return r.del, toErr(ctx, err) @@ -150,6 +165,14 @@ func (kv *kv) Do(ctx context.Context, op Op) (OpResponse, error) { if err == nil { return OpResponse{get: (*GetResponse)(resp)}, nil } + case tRangeStream: + var rangeStreamClient pb.KV_RangeStreamClient + var resp *pb.RangeStreamResponse + rangeStreamClient, err = kv.openRangeStreamClient(ctx, op.toRangeStreamRequest(), kv.callOpts...) + resp, err = kv.serveRangeStream(ctx, rangeStreamClient) + if err == nil { + return OpResponse{getStream: (*GetStreamResponse)(resp)}, nil + } case tPut: var resp *pb.PutResponse r := &pb.PutRequest{Key: op.key, Value: op.val, Lease: int64(op.leaseID), PrevKv: op.prevKV, IgnoreValue: op.ignoreValue, IgnoreLease: op.ignoreLease} @@ -175,3 +198,92 @@ func (kv *kv) Do(ctx context.Context, op Op) (OpResponse, error) { } return OpResponse{}, toErr(ctx, err) } + +// openRangeStreamClient retries opening a rangeStream client until success or halt. +// manually retry in case "rsc==nil && err==nil" +// TODO: remove FailFast=false +func (kv *kv) openRangeStreamClient(ctx context.Context, in *pb.RangeStreamRequest, opts ...grpc.CallOption) (rsc pb.KV_RangeStreamClient, err error) { + backoff := time.Millisecond + for { + select { + case <-ctx.Done(): + if err == nil { + return nil, ctx.Err() + } + return nil, err + default: + } + if rsc, err = kv.remote.RangeStream(ctx, in, opts...); rsc != nil && err == nil { + break + } + if isHaltErr(ctx, err) { + return nil, v3rpc.Error(err) + } + if isUnavailableErr(ctx, err) { + // retry, but backoff + if backoff < maxBackoff { + // 25% backoff factor + backoff = backoff + backoff/4 + if backoff > maxBackoff { + backoff = maxBackoff + } + } + time.Sleep(backoff) + } + } + return rsc, nil +} + +func (kv *kv) serveRangeStream(ctx context.Context, rsc pb.KV_RangeStreamClient) (*pb.RangeStreamResponse, error) { + rspC := make(chan *pb.RangeStreamResponse) + errC := make(chan error) + + var mainRSP *pb.RangeStreamResponse + + defer func() { + close(rspC) + close(errC) + }() + + go kv.handleRangeStream(ctx, rsc, rspC, errC) + + for { + select { + case subRsp := <-rspC: + if subRsp == nil { + break + } + if mainRSP == nil { + mainRSP = subRsp + } + mainRSP.Kvs = append(mainRSP.Kvs, subRsp.Kvs...) + mainRSP.TotalCount = subRsp.TotalCount + case err := <-errC: + return nil, err + case <-ctx.Done(): + break + } + } + + return mainRSP, nil +} + +func (kv *kv) handleRangeStream(ctx context.Context, rsc pb.KV_RangeStreamClient, rspC chan *pb.RangeStreamResponse, errC chan error) { + for { + resp, err := rsc.Recv() + if err != nil { + select { + case errC <- err: + case <-ctx.Done(): + } + return + } + select { + case rspC <- resp: + case <-ctx.Done(): + return + } + } + + return +} diff --git a/clientv3/leasing/kv.go b/clientv3/leasing/kv.go index 804eeb2cf0d..785b836df61 100644 --- a/clientv3/leasing/kv.go +++ b/clientv3/leasing/kv.go @@ -86,6 +86,11 @@ func (lkv *leasingKV) Get(ctx context.Context, key string, opts ...v3.OpOption) return lkv.get(ctx, v3.OpGet(key, opts...)) } +// TODO yxj +func (lkv *leasingKV) GetStream(ctx context.Context, key string, opts ...v3.OpOption) (*v3.GetStreamResponse, error) { + panic("unsupported") +} + func (lkv *leasingKV) Put(ctx context.Context, key, val string, opts ...v3.OpOption) (*v3.PutResponse, error) { return lkv.put(ctx, v3.OpPut(key, val, opts...)) } diff --git a/clientv3/namespace/kv.go b/clientv3/namespace/kv.go index 9899222a5a8..817832be0c4 100644 --- a/clientv3/namespace/kv.go +++ b/clientv3/namespace/kv.go @@ -60,6 +60,19 @@ func (kv *kvPrefix) Get(ctx context.Context, key string, opts ...clientv3.OpOpti return get, nil } +func (kv *kvPrefix) GetStream(ctx context.Context, key string, opts ...clientv3.OpOption) (*clientv3.GetStreamResponse, error) { + if len(key) == 0 { + return nil, rpctypes.ErrEmptyKey + } + r, err := kv.KV.Do(ctx, kv.prefixOp(clientv3.OpGetStream(key, opts...))) + if err != nil { + return nil, err + } + get := r.GetStream() + kv.unprefixGetStreamResponse(get) + return get, nil +} + func (kv *kvPrefix) Delete(ctx context.Context, key string, opts ...clientv3.OpOption) (*clientv3.DeleteResponse, error) { if len(key) == 0 { return nil, rpctypes.ErrEmptyKey @@ -144,6 +157,12 @@ func (kv *kvPrefix) unprefixGetResponse(resp *clientv3.GetResponse) { } } +func (kv *kvPrefix) unprefixGetStreamResponse(resp *clientv3.GetStreamResponse) { + for i := range resp.Kvs { + resp.Kvs[i].Key = resp.Kvs[i].Key[len(kv.pfx):] + } +} + func (kv *kvPrefix) unprefixPutResponse(resp *clientv3.PutResponse) { if resp.PrevKv != nil { resp.PrevKv.Key = resp.PrevKv.Key[len(kv.pfx):] diff --git a/clientv3/op.go b/clientv3/op.go index f0592ccf5a5..92261bbc4ca 100644 --- a/clientv3/op.go +++ b/clientv3/op.go @@ -24,6 +24,7 @@ const ( tPut tDeleteRange tTxn + tRangeStream ) var noPrefixEnd = []byte{0} @@ -166,6 +167,21 @@ func (op Op) toRangeRequest() *pb.RangeRequest { return r } +func (op Op) toRangeStreamRequest() *pb.RangeStreamRequest { + if op.t != tRangeStream { + panic("op.t != tRangeStream") + } + r := &pb.RangeStreamRequest{ + Key: op.key, + RangeEnd: op.end, + Limit: op.limit, + Revision: op.rev, + Serializable: op.serializable, + KeysOnly: op.keysOnly, + } + return r +} + func (op Op) toTxnRequest() *pb.TxnRequest { thenOps := make([]*pb.RequestOp, len(op.thenOps)) for i, tOp := range op.thenOps { @@ -227,6 +243,16 @@ func OpGet(key string, opts ...OpOption) Op { return ret } +func OpGetStream(key string, opts ...OpOption) Op { + // WithPrefix and WithFromKey are not supported together + if isWithPrefix(opts) && isWithFromKey(opts) { + panic("`WithPrefix` and `WithFromKey` cannot be set at the same time, choose one") + } + ret := Op{t: tRangeStream, key: []byte(key)} + ret.applyOpts(opts) + return ret +} + // OpDelete returns "delete" operation based on given key and operation options. func OpDelete(key string, opts ...OpOption) Op { // WithPrefix and WithFromKey are not supported together diff --git a/clientv3/ordering/kv.go b/clientv3/ordering/kv.go index d62f2c8911c..b24f7977b21 100644 --- a/clientv3/ordering/kv.go +++ b/clientv3/ordering/kv.go @@ -75,6 +75,11 @@ func (kv *kvOrdering) Get(ctx context.Context, key string, opts ...clientv3.OpOp } } +// TODO yxj +func (kv *kvOrdering) GetStream(ctx context.Context, key string, opts ...clientv3.OpOption) (*clientv3.GetStreamResponse, error) { + panic("unsupported") +} + func (kv *kvOrdering) Txn(ctx context.Context) clientv3.Txn { return &txnOrdering{ kv.KV.Txn(ctx), diff --git a/clientv3/retry.go b/clientv3/retry.go index c4e84030308..533b269f986 100644 --- a/clientv3/retry.go +++ b/clientv3/retry.go @@ -105,6 +105,10 @@ func (rkv *retryKVClient) Range(ctx context.Context, in *pb.RangeRequest, opts . return rkv.kc.Range(ctx, in, append(opts, withRetryPolicy(repeatable))...) } +func (rkv *retryKVClient) RangeStream(ctx context.Context, in *pb.RangeStreamRequest, opts ...grpc.CallOption) (pb.KV_RangeStreamClient, error) { + return rkv.kc.RangeStream(ctx, in, append(opts, withRetryPolicy(repeatable))...) +} + func (rkv *retryKVClient) Put(ctx context.Context, in *pb.PutRequest, opts ...grpc.CallOption) (resp *pb.PutResponse, err error) { return rkv.kc.Put(ctx, in, opts...) } diff --git a/etcdctl/ctlv3/command/getstream_command.go b/etcdctl/ctlv3/command/getstream_command.go new file mode 100644 index 00000000000..dbc724b56ec --- /dev/null +++ b/etcdctl/ctlv3/command/getstream_command.go @@ -0,0 +1,124 @@ +// Copyright 2015 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package command + +import ( + "fmt" + + "github.com/spf13/cobra" + "go.etcd.io/etcd/v3/clientv3" +) + +var ( + getStreamConsistency string + getStreamLimit int64 + getStreamPrefix bool + getStreamFromKey bool + getStreamRev int64 + getStreamKeysOnly bool + printStreamValueOnly bool +) + +// NewGetStreamCommand returns the cobra command for "getstream". +func NewGetStreamCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "getstream [options] [range_end]", + Short: "Gets the key or a range of keys by stream", + Run: getStreamCommandFunc, + } + + cmd.Flags().StringVar(&getStreamConsistency, "consistency", "l", "Linearizable(l) or Serializable(s)") + cmd.Flags().Int64Var(&getStreamLimit, "limit", 0, "Maximum number of results") + cmd.Flags().BoolVar(&getStreamPrefix, "prefix", false, "Get keys with matching prefix") + cmd.Flags().BoolVar(&getStreamFromKey, "from-key", false, "Get keys that are greater than or equal to the given key using byte compare") + cmd.Flags().Int64Var(&getStreamRev, "rev", 0, "Specify the kv revision") + cmd.Flags().BoolVar(&getStreamKeysOnly, "keys-only", false, "Get only the keys") + cmd.Flags().BoolVar(&printStreamValueOnly, "print-value-only", false, `Only write values when using the "simple" output format`) + return cmd +} + +// getStreamCommandFunc executes the "getstream" command. +func getStreamCommandFunc(cmd *cobra.Command, args []string) { + key, opts := getGetStreamOp(args) + ctx, cancel := commandCtx(cmd) + resp, err := mustClientFromCmd(cmd).GetStream(ctx, key, opts...) + cancel() + if err != nil { + ExitWithError(ExitError, err) + } + + if printStreamValueOnly { + dp, simple := (display).(*simplePrinter) + if !simple { + ExitWithError(ExitBadArgs, fmt.Errorf("print-value-only is only for `--write-out=simple`")) + } + dp.valueOnly = true + } + display.GetStream(*resp) +} + +func getGetStreamOp(args []string) (string, []clientv3.OpOption) { + if len(args) == 0 { + ExitWithError(ExitBadArgs, fmt.Errorf("get command needs one argument as key and an optional argument as range_end")) + } + + if getStreamPrefix && getStreamFromKey { + ExitWithError(ExitBadArgs, fmt.Errorf("`--prefix` and `--from-key` cannot be set at the same time, choose one")) + } + + opts := []clientv3.OpOption{} + switch getStreamConsistency { + case "s": + opts = append(opts, clientv3.WithSerializable()) + case "l": + default: + ExitWithError(ExitBadFeature, fmt.Errorf("unknown consistency flag %q", getStreamConsistency)) + } + + key := args[0] + if len(args) > 1 { + if getStreamPrefix || getStreamFromKey { + ExitWithError(ExitBadArgs, fmt.Errorf("too many arguments, only accept one argument when `--prefix` or `--from-key` is set")) + } + opts = append(opts, clientv3.WithRange(args[1])) + } + + opts = append(opts, clientv3.WithLimit(getStreamLimit)) + if getStreamRev > 0 { + opts = append(opts, clientv3.WithRev(getStreamRev)) + } + + if getStreamPrefix { + if len(key) == 0 { + key = "\x00" + opts = append(opts, clientv3.WithFromKey()) + } else { + opts = append(opts, clientv3.WithPrefix()) + } + } + + if getStreamFromKey { + if len(key) == 0 { + key = "\x00" + } + opts = append(opts, clientv3.WithFromKey()) + } + + if getStreamKeysOnly { + opts = append(opts, clientv3.WithKeysOnly()) + } + + return key, opts +} diff --git a/etcdctl/ctlv3/command/printer.go b/etcdctl/ctlv3/command/printer.go index 2bb6086c838..dcc2aeb65f7 100644 --- a/etcdctl/ctlv3/command/printer.go +++ b/etcdctl/ctlv3/command/printer.go @@ -29,6 +29,7 @@ import ( type printer interface { Del(v3.DeleteResponse) Get(v3.GetResponse) + GetStream(v3.GetStreamResponse) Put(v3.PutResponse) Txn(v3.TxnResponse) Watch(v3.WatchResponse) @@ -92,11 +93,12 @@ type printerRPC struct { p func(interface{}) } -func (p *printerRPC) Del(r v3.DeleteResponse) { p.p((*pb.DeleteRangeResponse)(&r)) } -func (p *printerRPC) Get(r v3.GetResponse) { p.p((*pb.RangeResponse)(&r)) } -func (p *printerRPC) Put(r v3.PutResponse) { p.p((*pb.PutResponse)(&r)) } -func (p *printerRPC) Txn(r v3.TxnResponse) { p.p((*pb.TxnResponse)(&r)) } -func (p *printerRPC) Watch(r v3.WatchResponse) { p.p(&r) } +func (p *printerRPC) Del(r v3.DeleteResponse) { p.p((*pb.DeleteRangeResponse)(&r)) } +func (p *printerRPC) Get(r v3.GetResponse) { p.p((*pb.RangeResponse)(&r)) } +func (p *printerRPC) GetStream(r v3.GetStreamResponse) { p.p((*pb.RangeStreamResponse)(&r)) } +func (p *printerRPC) Put(r v3.PutResponse) { p.p((*pb.PutResponse)(&r)) } +func (p *printerRPC) Txn(r v3.TxnResponse) { p.p((*pb.TxnResponse)(&r)) } +func (p *printerRPC) Watch(r v3.WatchResponse) { p.p(&r) } func (p *printerRPC) Grant(r v3.LeaseGrantResponse) { p.p(r) } func (p *printerRPC) Revoke(id v3.LeaseID, r v3.LeaseRevokeResponse) { p.p(r) } diff --git a/etcdctl/ctlv3/command/printer_fields.go b/etcdctl/ctlv3/command/printer_fields.go index 38f5c7d93d2..fc931767f7e 100644 --- a/etcdctl/ctlv3/command/printer_fields.go +++ b/etcdctl/ctlv3/command/printer_fields.go @@ -58,6 +58,14 @@ func (p *fieldsPrinter) Get(r v3.GetResponse) { fmt.Println(`"Count" :`, r.Count) } +func (p *fieldsPrinter) GetStream(r v3.GetStreamResponse) { + p.hdr(r.Header) + for _, kv := range r.Kvs { + p.kv("", kv) + } + fmt.Println(`"Count" :`, r.TotalCount) +} + func (p *fieldsPrinter) Put(r v3.PutResponse) { p.hdr(r.Header) if r.PrevKv != nil { diff --git a/etcdctl/ctlv3/command/printer_simple.go b/etcdctl/ctlv3/command/printer_simple.go index 1ed5c21daba..d0e380dc775 100644 --- a/etcdctl/ctlv3/command/printer_simple.go +++ b/etcdctl/ctlv3/command/printer_simple.go @@ -43,6 +43,12 @@ func (s *simplePrinter) Get(resp v3.GetResponse) { } } +func (s *simplePrinter) GetStream(resp v3.GetStreamResponse) { + for _, kv := range resp.Kvs { + printKV(s.isHex, s.valueOnly, kv) + } +} + func (s *simplePrinter) Put(r v3.PutResponse) { fmt.Println("OK") if r.PrevKv != nil { diff --git a/etcdctl/ctlv3/ctl.go b/etcdctl/ctlv3/ctl.go index e16e8e3c287..1a0a7f7065f 100644 --- a/etcdctl/ctlv3/ctl.go +++ b/etcdctl/ctlv3/ctl.go @@ -71,6 +71,7 @@ func init() { rootCmd.AddCommand( command.NewGetCommand(), + command.NewGetStreamCommand(), command.NewPutCommand(), command.NewDelCommand(), command.NewTxnCommand(), diff --git a/etcdserver/api/v3rpc/key.go b/etcdserver/api/v3rpc/key.go index 19a0320cf87..cd504042b8b 100644 --- a/etcdserver/api/v3rpc/key.go +++ b/etcdserver/api/v3rpc/key.go @@ -17,6 +17,7 @@ package v3rpc import ( "context" + "go.uber.org/zap" "go.etcd.io/etcd/v3/etcdserver" "go.etcd.io/etcd/v3/etcdserver/api/v3rpc/rpctypes" @@ -32,10 +33,12 @@ type kvServer struct { // Txn.Success can have at most 128 operations, // and Txn.Failure can have at most 128 operations. maxTxnOps uint + + lg *zap.Logger } func NewKVServer(s *etcdserver.EtcdServer) pb.KVServer { - return &kvServer{hdr: newHeader(s), kv: s, maxTxnOps: s.Cfg.MaxTxnOps} + return &kvServer{hdr: newHeader(s), kv: s, maxTxnOps: s.Cfg.MaxTxnOps, lg: s.Cfg.Logger} } func (s *kvServer) Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeResponse, error) { @@ -52,6 +55,50 @@ func (s *kvServer) Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeResp return resp, nil } +func (s *kvServer) RangeStream(r *pb.RangeStreamRequest, rss pb.KV_RangeStreamServer) error { + if err := checkRangeStreamRequest(r); err != nil { + return err + } + + respC := make(chan *pb.RangeStreamResponse) + errC := make(chan error) + + defer func() { + close(respC) + close(errC) + }() + + go func() { + err := s.kv.RangeStream(rss.Context(), r, respC) + if err != nil { + errC <- togRPCError(err) + } + }() + + for { + select { + case resp := <-respC: + s.hdr.fill(resp.Header) + serr := rss.Send(resp) + if serr != nil { + if isClientCtxErr(rss.Context().Err(), serr) { + s.lg.Debug("failed to send range stream response to gRPC stream", zap.Error(serr)) + } else { + s.lg.Warn("failed to send range stream response to gRPC stream", zap.Error(serr)) + streamFailures.WithLabelValues("send", "rangeStream").Inc() + } + return nil + } + case err := <-errC: + return err + case <-rss.Context().Done(): + break + } + } + + return nil +} + func (s *kvServer) Put(ctx context.Context, r *pb.PutRequest) (*pb.PutResponse, error) { if err := checkPutRequest(r); err != nil { return nil, err @@ -118,6 +165,13 @@ func checkRangeRequest(r *pb.RangeRequest) error { return nil } +func checkRangeStreamRequest(r *pb.RangeStreamRequest) error { + if len(r.Key) == 0 { + return rpctypes.ErrGRPCEmptyKey + } + return nil +} + func checkPutRequest(r *pb.PutRequest) error { if len(r.Key) == 0 { return rpctypes.ErrGRPCEmptyKey diff --git a/etcdserver/apply.go b/etcdserver/apply.go index 201486a71af..e277a059980 100644 --- a/etcdserver/apply.go +++ b/etcdserver/apply.go @@ -64,6 +64,7 @@ type applierV3 interface { Put(ctx context.Context, txn mvcc.TxnWrite, p *pb.PutRequest) (*pb.PutResponse, *traceutil.Trace, error) Range(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeRequest) (*pb.RangeResponse, error) + RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse) (*pb.RangeStreamResponse, error) DeleteRange(txn mvcc.TxnWrite, dr *pb.DeleteRangeRequest) (*pb.DeleteRangeResponse, error) Txn(ctx context.Context, rt *pb.TxnRequest) (*pb.TxnResponse, *traceutil.Trace, error) Compaction(compaction *pb.CompactionRequest) (*pb.CompactionResponse, <-chan struct{}, *traceutil.Trace, error) @@ -385,6 +386,83 @@ func (a *applierV3backend) Range(ctx context.Context, txn mvcc.TxnRead, r *pb.Ra return resp, nil } +func (a *applierV3backend) RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse) (*pb.RangeStreamResponse, error) { + trace := traceutil.Get(ctx) + + lg := a.s.getLogger() + + resp := &pb.RangeStreamResponse{} + resp.Header = &pb.ResponseHeader{} + streamC := make(chan *mvcc.RangeResult) + var err error + + if txn == nil { + txn = a.s.kv.Read(trace) + defer txn.End() + } + + limit := r.Limit + ro := mvcc.RangeOptions{ + Limit: limit, + Rev: r.Revision, + } + + go func() { + err = txn.RangeStream(r.Key, mkGteRange(r.RangeEnd), ro, streamC) + if err != nil { + lg.Error("RangeStream error", zap.Error(err)) + } + }() + + for { + select { + case rr := <-streamC: + if rr == nil { + break + } + + if rr.KVs == nil { + if rr.Err != nil { + err = rr.Err + return nil, err + } + break + } + + subResp := &pb.RangeStreamResponse{} + subResp.Header = &pb.ResponseHeader{} + + subResp.Header.Revision = rr.Rev + subResp.Count = int64(rr.Count) + + // resp TotalCount just use monitor long time range stream + resp.TotalCount += int64(rr.Count) + subResp.TotalCount = resp.TotalCount + subResp.Kvs = make([]*mvccpb.KeyValue, len(rr.KVs)) + for i := range rr.KVs { + if r.KeysOnly { + rr.KVs[i].Value = nil + } + subResp.Kvs[i] = &rr.KVs[i] + } + // resp TotalSize just use monitor long time range stream + resp.TotalSize += int64(proto.Size(subResp)) + + select { + case rspC <- subResp: + case <-ctx.Done(): + break + } + + case <-ctx.Done(): + break + } + } + + trace.Step("assemble the response") + return resp, nil +} + func (a *applierV3backend) Txn(ctx context.Context, rt *pb.TxnRequest) (*pb.TxnResponse, *traceutil.Trace, error) { trace := traceutil.Get(ctx) if trace.IsEmpty() { diff --git a/etcdserver/apply_auth.go b/etcdserver/apply_auth.go index 40ed7bde56e..920cb9c365d 100644 --- a/etcdserver/apply_auth.go +++ b/etcdserver/apply_auth.go @@ -92,6 +92,13 @@ func (aa *authApplierV3) Range(ctx context.Context, txn mvcc.TxnRead, r *pb.Rang return aa.applierV3.Range(ctx, txn, r) } +func (aa *authApplierV3) RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse) (*pb.RangeStreamResponse, error) { + if err := aa.as.IsRangePermitted(&aa.authInfo, r.Key, r.RangeEnd); err != nil { + return nil, err + } + return aa.applierV3.RangeStream(ctx, txn, r, rspC) +} + func (aa *authApplierV3) DeleteRange(txn mvcc.TxnWrite, r *pb.DeleteRangeRequest) (*pb.DeleteRangeResponse, error) { if err := aa.as.IsDeleteRangePermitted(&aa.authInfo, r.Key, r.RangeEnd); err != nil { return nil, err diff --git a/etcdserver/corrupt.go b/etcdserver/corrupt.go index 45aa4535713..b717640735d 100644 --- a/etcdserver/corrupt.go +++ b/etcdserver/corrupt.go @@ -317,6 +317,10 @@ func (a *applierV3Corrupt) Range(ctx context.Context, txn mvcc.TxnRead, p *pb.Ra return nil, ErrCorrupt } +func (a *applierV3Corrupt) RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse) (*pb.RangeStreamResponse, error) { + return nil, ErrCorrupt +} + func (a *applierV3Corrupt) DeleteRange(txn mvcc.TxnWrite, p *pb.DeleteRangeRequest) (*pb.DeleteRangeResponse, error) { return nil, ErrCorrupt } diff --git a/etcdserver/etcdserverpb/etcdserver.pb.go b/etcdserver/etcdserverpb/etcdserver.pb.go index 6e0b76c2e7a..b2a95c9ac4f 100644 --- a/etcdserver/etcdserverpb/etcdserver.pb.go +++ b/etcdserver/etcdserverpb/etcdserver.pb.go @@ -18,7 +18,9 @@ InternalAuthenticateRequest ResponseHeader RangeRequest + RangeStreamRequest RangeResponse + RangeStreamResponse PutRequest PutResponse DeleteRangeRequest diff --git a/etcdserver/etcdserverpb/gw/rpc.pb.gw.go b/etcdserver/etcdserverpb/gw/rpc.pb.gw.go index 5b1f7eba277..f6df7dc1e7a 100644 --- a/etcdserver/etcdserverpb/gw/rpc.pb.gw.go +++ b/etcdserver/etcdserverpb/gw/rpc.pb.gw.go @@ -42,6 +42,27 @@ func request_KV_Range_0(ctx context.Context, marshaler runtime.Marshaler, client } +func request_KV_RangeStream_0(ctx context.Context, marshaler runtime.Marshaler, client etcdserverpb.KVClient, req *http.Request, pathParams map[string]string) (etcdserverpb.KV_RangeStreamClient, runtime.ServerMetadata, error) { + var protoReq etcdserverpb.RangeStreamRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.RangeStream(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + func request_KV_Put_0(ctx context.Context, marshaler runtime.Marshaler, client etcdserverpb.KVClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq etcdserverpb.PutRequest var metadata runtime.ServerMetadata @@ -754,6 +775,35 @@ func RegisterKVHandlerClient(ctx context.Context, mux *runtime.ServeMux, client }) + mux.Handle("POST", pattern_KV_RangeStream_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_KV_RangeStream_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_KV_RangeStream_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_KV_Put_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -876,6 +926,8 @@ func RegisterKVHandlerClient(ctx context.Context, mux *runtime.ServeMux, client var ( pattern_KV_Range_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "range"}, "")) + pattern_KV_RangeStream_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "rangestream"}, "")) + pattern_KV_Put_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "put"}, "")) pattern_KV_DeleteRange_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "deleterange"}, "")) @@ -888,6 +940,8 @@ var ( var ( forward_KV_Range_0 = runtime.ForwardResponseMessage + forward_KV_RangeStream_0 = runtime.ForwardResponseStream + forward_KV_Put_0 = runtime.ForwardResponseMessage forward_KV_DeleteRange_0 = runtime.ForwardResponseMessage diff --git a/etcdserver/etcdserverpb/rpc.pb.go b/etcdserver/etcdserverpb/rpc.pb.go index a101ee7150c..42b907ac66f 100644 --- a/etcdserver/etcdserverpb/rpc.pb.go +++ b/etcdserver/etcdserverpb/rpc.pb.go @@ -133,7 +133,7 @@ var Compare_CompareResult_value = map[string]int32{ func (x Compare_CompareResult) String() string { return proto.EnumName(Compare_CompareResult_name, int32(x)) } -func (Compare_CompareResult) EnumDescriptor() ([]byte, []int) { return fileDescriptorRpc, []int{9, 0} } +func (Compare_CompareResult) EnumDescriptor() ([]byte, []int) { return fileDescriptorRpc, []int{11, 0} } type Compare_CompareTarget int32 @@ -163,7 +163,7 @@ var Compare_CompareTarget_value = map[string]int32{ func (x Compare_CompareTarget) String() string { return proto.EnumName(Compare_CompareTarget_name, int32(x)) } -func (Compare_CompareTarget) EnumDescriptor() ([]byte, []int) { return fileDescriptorRpc, []int{9, 1} } +func (Compare_CompareTarget) EnumDescriptor() ([]byte, []int) { return fileDescriptorRpc, []int{11, 1} } type WatchCreateRequest_FilterType int32 @@ -187,7 +187,7 @@ func (x WatchCreateRequest_FilterType) String() string { return proto.EnumName(WatchCreateRequest_FilterType_name, int32(x)) } func (WatchCreateRequest_FilterType) EnumDescriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{21, 0} + return fileDescriptorRpc, []int{23, 0} } type AlarmRequest_AlarmAction int32 @@ -213,7 +213,7 @@ func (x AlarmRequest_AlarmAction) String() string { return proto.EnumName(AlarmRequest_AlarmAction_name, int32(x)) } func (AlarmRequest_AlarmAction) EnumDescriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{54, 0} + return fileDescriptorRpc, []int{56, 0} } type DowngradeRequest_DowngradeAction int32 @@ -239,7 +239,7 @@ func (x DowngradeRequest_DowngradeAction) String() string { return proto.EnumName(DowngradeRequest_DowngradeAction_name, int32(x)) } func (DowngradeRequest_DowngradeAction) EnumDescriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{57, 0} + return fileDescriptorRpc, []int{59, 0} } type ResponseHeader struct { @@ -430,6 +430,80 @@ func (m *RangeRequest) GetMaxCreateRevision() int64 { return 0 } +type RangeStreamRequest struct { + // key is the first key for the range. If range_end is not given, the request only looks up key. + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // range_end is the upper bound on the requested range [key, range_end). + // If range_end is '\0', the range is all keys >= key. + // If range_end is key plus one (e.g., "aa"+1 == "ab", "a\xff"+1 == "b"), + // then the range request gets all keys prefixed with key. + // If both key and range_end are '\0', then the range request returns all keys. + RangeEnd []byte `protobuf:"bytes,2,opt,name=range_end,json=rangeEnd,proto3" json:"range_end,omitempty"` + // limit is a limit on the number of keys returned for the request. When limit is set to 0, + // it is treated as no limit. + Limit int64 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` + // revision is the point-in-time of the key-value store to use for the range. + // If revision is less or equal to zero, the range is over the newest key-value store. + // If the revision has been compacted, ErrCompacted is returned as a response. + Revision int64 `protobuf:"varint,4,opt,name=revision,proto3" json:"revision,omitempty"` + // serializable sets the range request to use serializable member-local reads. + // Range requests are linearizable by default; linearizable requests have higher + // latency and lower throughput than serializable requests but reflect the current + // consensus of the cluster. For better performance, in exchange for possible stale reads, + // a serializable range request is served locally without needing to reach consensus + // with other nodes in the cluster. + Serializable bool `protobuf:"varint,7,opt,name=serializable,proto3" json:"serializable,omitempty"` + // keys_only when set returns only the keys and not the values. + KeysOnly bool `protobuf:"varint,8,opt,name=keys_only,json=keysOnly,proto3" json:"keys_only,omitempty"` +} + +func (m *RangeStreamRequest) Reset() { *m = RangeStreamRequest{} } +func (m *RangeStreamRequest) String() string { return proto.CompactTextString(m) } +func (*RangeStreamRequest) ProtoMessage() {} +func (*RangeStreamRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{2} } + +func (m *RangeStreamRequest) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func (m *RangeStreamRequest) GetRangeEnd() []byte { + if m != nil { + return m.RangeEnd + } + return nil +} + +func (m *RangeStreamRequest) GetLimit() int64 { + if m != nil { + return m.Limit + } + return 0 +} + +func (m *RangeStreamRequest) GetRevision() int64 { + if m != nil { + return m.Revision + } + return 0 +} + +func (m *RangeStreamRequest) GetSerializable() bool { + if m != nil { + return m.Serializable + } + return false +} + +func (m *RangeStreamRequest) GetKeysOnly() bool { + if m != nil { + return m.KeysOnly + } + return false +} + type RangeResponse struct { Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` // kvs is the list of key-value pairs matched by the range request. @@ -444,7 +518,7 @@ type RangeResponse struct { func (m *RangeResponse) Reset() { *m = RangeResponse{} } func (m *RangeResponse) String() string { return proto.CompactTextString(m) } func (*RangeResponse) ProtoMessage() {} -func (*RangeResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{2} } +func (*RangeResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{3} } func (m *RangeResponse) GetHeader() *ResponseHeader { if m != nil { @@ -474,6 +548,57 @@ func (m *RangeResponse) GetCount() int64 { return 0 } +type RangeStreamResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // kvs is the list of key-value pairs matched by the range request. + // kvs is empty when count is requested. + Kvs []*mvccpb.KeyValue `protobuf:"bytes,2,rep,name=kvs" json:"kvs,omitempty"` + // count is set to the number of keys within the range when requested. + Count int64 `protobuf:"varint,4,opt,name=count,proto3" json:"count,omitempty"` + TotalCount int64 `protobuf:"varint,5,opt,name=totalCount,proto3" json:"totalCount,omitempty"` + TotalSize int64 `protobuf:"varint,6,opt,name=totalSize,proto3" json:"totalSize,omitempty"` +} + +func (m *RangeStreamResponse) Reset() { *m = RangeStreamResponse{} } +func (m *RangeStreamResponse) String() string { return proto.CompactTextString(m) } +func (*RangeStreamResponse) ProtoMessage() {} +func (*RangeStreamResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{4} } + +func (m *RangeStreamResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *RangeStreamResponse) GetKvs() []*mvccpb.KeyValue { + if m != nil { + return m.Kvs + } + return nil +} + +func (m *RangeStreamResponse) GetCount() int64 { + if m != nil { + return m.Count + } + return 0 +} + +func (m *RangeStreamResponse) GetTotalCount() int64 { + if m != nil { + return m.TotalCount + } + return 0 +} + +func (m *RangeStreamResponse) GetTotalSize() int64 { + if m != nil { + return m.TotalSize + } + return 0 +} + type PutRequest struct { // key is the key, in bytes, to put into the key-value store. Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` @@ -496,7 +621,7 @@ type PutRequest struct { func (m *PutRequest) Reset() { *m = PutRequest{} } func (m *PutRequest) String() string { return proto.CompactTextString(m) } func (*PutRequest) ProtoMessage() {} -func (*PutRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{3} } +func (*PutRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{5} } func (m *PutRequest) GetKey() []byte { if m != nil { @@ -549,7 +674,7 @@ type PutResponse struct { func (m *PutResponse) Reset() { *m = PutResponse{} } func (m *PutResponse) String() string { return proto.CompactTextString(m) } func (*PutResponse) ProtoMessage() {} -func (*PutResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{4} } +func (*PutResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{6} } func (m *PutResponse) GetHeader() *ResponseHeader { if m != nil { @@ -582,7 +707,7 @@ type DeleteRangeRequest struct { func (m *DeleteRangeRequest) Reset() { *m = DeleteRangeRequest{} } func (m *DeleteRangeRequest) String() string { return proto.CompactTextString(m) } func (*DeleteRangeRequest) ProtoMessage() {} -func (*DeleteRangeRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{5} } +func (*DeleteRangeRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{7} } func (m *DeleteRangeRequest) GetKey() []byte { if m != nil { @@ -616,7 +741,7 @@ type DeleteRangeResponse struct { func (m *DeleteRangeResponse) Reset() { *m = DeleteRangeResponse{} } func (m *DeleteRangeResponse) String() string { return proto.CompactTextString(m) } func (*DeleteRangeResponse) ProtoMessage() {} -func (*DeleteRangeResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{6} } +func (*DeleteRangeResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{8} } func (m *DeleteRangeResponse) GetHeader() *ResponseHeader { if m != nil { @@ -647,13 +772,14 @@ type RequestOp struct { // *RequestOp_RequestPut // *RequestOp_RequestDeleteRange // *RequestOp_RequestTxn + // *RequestOp_RequestRangeStream Request isRequestOp_Request `protobuf_oneof:"request"` } func (m *RequestOp) Reset() { *m = RequestOp{} } func (m *RequestOp) String() string { return proto.CompactTextString(m) } func (*RequestOp) ProtoMessage() {} -func (*RequestOp) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{7} } +func (*RequestOp) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{9} } type isRequestOp_Request interface { isRequestOp_Request() @@ -673,11 +799,15 @@ type RequestOp_RequestDeleteRange struct { type RequestOp_RequestTxn struct { RequestTxn *TxnRequest `protobuf:"bytes,4,opt,name=request_txn,json=requestTxn,oneof"` } +type RequestOp_RequestRangeStream struct { + RequestRangeStream *RangeStreamRequest `protobuf:"bytes,5,opt,name=request_range_stream,json=requestRangeStream,oneof"` +} func (*RequestOp_RequestRange) isRequestOp_Request() {} func (*RequestOp_RequestPut) isRequestOp_Request() {} func (*RequestOp_RequestDeleteRange) isRequestOp_Request() {} func (*RequestOp_RequestTxn) isRequestOp_Request() {} +func (*RequestOp_RequestRangeStream) isRequestOp_Request() {} func (m *RequestOp) GetRequest() isRequestOp_Request { if m != nil { @@ -714,6 +844,13 @@ func (m *RequestOp) GetRequestTxn() *TxnRequest { return nil } +func (m *RequestOp) GetRequestRangeStream() *RangeStreamRequest { + if x, ok := m.GetRequest().(*RequestOp_RequestRangeStream); ok { + return x.RequestRangeStream + } + return nil +} + // XXX_OneofFuncs is for the internal use of the proto package. func (*RequestOp) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { return _RequestOp_OneofMarshaler, _RequestOp_OneofUnmarshaler, _RequestOp_OneofSizer, []interface{}{ @@ -721,6 +858,7 @@ func (*RequestOp) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) err (*RequestOp_RequestPut)(nil), (*RequestOp_RequestDeleteRange)(nil), (*RequestOp_RequestTxn)(nil), + (*RequestOp_RequestRangeStream)(nil), } } @@ -748,6 +886,11 @@ func _RequestOp_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { if err := b.EncodeMessage(x.RequestTxn); err != nil { return err } + case *RequestOp_RequestRangeStream: + _ = b.EncodeVarint(5<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.RequestRangeStream); err != nil { + return err + } case nil: default: return fmt.Errorf("RequestOp.Request has unexpected type %T", x) @@ -790,6 +933,14 @@ func _RequestOp_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buff err := b.DecodeMessage(msg) m.Request = &RequestOp_RequestTxn{msg} return true, err + case 5: // request.request_range_stream + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(RangeStreamRequest) + err := b.DecodeMessage(msg) + m.Request = &RequestOp_RequestRangeStream{msg} + return true, err default: return false, nil } @@ -819,6 +970,11 @@ func _RequestOp_OneofSizer(msg proto.Message) (n int) { n += proto.SizeVarint(4<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s + case *RequestOp_RequestRangeStream: + s := proto.Size(x.RequestRangeStream) + n += proto.SizeVarint(5<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s case nil: default: panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) @@ -834,13 +990,14 @@ type ResponseOp struct { // *ResponseOp_ResponsePut // *ResponseOp_ResponseDeleteRange // *ResponseOp_ResponseTxn + // *ResponseOp_ResponseRangeStream Response isResponseOp_Response `protobuf_oneof:"response"` } func (m *ResponseOp) Reset() { *m = ResponseOp{} } func (m *ResponseOp) String() string { return proto.CompactTextString(m) } func (*ResponseOp) ProtoMessage() {} -func (*ResponseOp) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{8} } +func (*ResponseOp) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{10} } type isResponseOp_Response interface { isResponseOp_Response() @@ -860,11 +1017,15 @@ type ResponseOp_ResponseDeleteRange struct { type ResponseOp_ResponseTxn struct { ResponseTxn *TxnResponse `protobuf:"bytes,4,opt,name=response_txn,json=responseTxn,oneof"` } +type ResponseOp_ResponseRangeStream struct { + ResponseRangeStream *RangeStreamResponse `protobuf:"bytes,5,opt,name=response_range_stream,json=responseRangeStream,oneof"` +} func (*ResponseOp_ResponseRange) isResponseOp_Response() {} func (*ResponseOp_ResponsePut) isResponseOp_Response() {} func (*ResponseOp_ResponseDeleteRange) isResponseOp_Response() {} func (*ResponseOp_ResponseTxn) isResponseOp_Response() {} +func (*ResponseOp_ResponseRangeStream) isResponseOp_Response() {} func (m *ResponseOp) GetResponse() isResponseOp_Response { if m != nil { @@ -901,6 +1062,13 @@ func (m *ResponseOp) GetResponseTxn() *TxnResponse { return nil } +func (m *ResponseOp) GetResponseRangeStream() *RangeStreamResponse { + if x, ok := m.GetResponse().(*ResponseOp_ResponseRangeStream); ok { + return x.ResponseRangeStream + } + return nil +} + // XXX_OneofFuncs is for the internal use of the proto package. func (*ResponseOp) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { return _ResponseOp_OneofMarshaler, _ResponseOp_OneofUnmarshaler, _ResponseOp_OneofSizer, []interface{}{ @@ -908,6 +1076,7 @@ func (*ResponseOp) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) er (*ResponseOp_ResponsePut)(nil), (*ResponseOp_ResponseDeleteRange)(nil), (*ResponseOp_ResponseTxn)(nil), + (*ResponseOp_ResponseRangeStream)(nil), } } @@ -935,6 +1104,11 @@ func _ResponseOp_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { if err := b.EncodeMessage(x.ResponseTxn); err != nil { return err } + case *ResponseOp_ResponseRangeStream: + _ = b.EncodeVarint(5<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.ResponseRangeStream); err != nil { + return err + } case nil: default: return fmt.Errorf("ResponseOp.Response has unexpected type %T", x) @@ -977,6 +1151,14 @@ func _ResponseOp_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buf err := b.DecodeMessage(msg) m.Response = &ResponseOp_ResponseTxn{msg} return true, err + case 5: // response.response_range_stream + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(RangeStreamResponse) + err := b.DecodeMessage(msg) + m.Response = &ResponseOp_ResponseRangeStream{msg} + return true, err default: return false, nil } @@ -1006,6 +1188,11 @@ func _ResponseOp_OneofSizer(msg proto.Message) (n int) { n += proto.SizeVarint(4<<3 | proto.WireBytes) n += proto.SizeVarint(uint64(s)) n += s + case *ResponseOp_ResponseRangeStream: + s := proto.Size(x.ResponseRangeStream) + n += proto.SizeVarint(5<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s case nil: default: panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) @@ -1035,7 +1222,7 @@ type Compare struct { func (m *Compare) Reset() { *m = Compare{} } func (m *Compare) String() string { return proto.CompactTextString(m) } func (*Compare) ProtoMessage() {} -func (*Compare) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{9} } +func (*Compare) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{11} } type isCompare_TargetUnion interface { isCompare_TargetUnion() @@ -1273,7 +1460,7 @@ type TxnRequest struct { func (m *TxnRequest) Reset() { *m = TxnRequest{} } func (m *TxnRequest) String() string { return proto.CompactTextString(m) } func (*TxnRequest) ProtoMessage() {} -func (*TxnRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{10} } +func (*TxnRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{12} } func (m *TxnRequest) GetCompare() []*Compare { if m != nil { @@ -1308,7 +1495,7 @@ type TxnResponse struct { func (m *TxnResponse) Reset() { *m = TxnResponse{} } func (m *TxnResponse) String() string { return proto.CompactTextString(m) } func (*TxnResponse) ProtoMessage() {} -func (*TxnResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{11} } +func (*TxnResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{13} } func (m *TxnResponse) GetHeader() *ResponseHeader { if m != nil { @@ -1345,7 +1532,7 @@ type CompactionRequest struct { func (m *CompactionRequest) Reset() { *m = CompactionRequest{} } func (m *CompactionRequest) String() string { return proto.CompactTextString(m) } func (*CompactionRequest) ProtoMessage() {} -func (*CompactionRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{12} } +func (*CompactionRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{14} } func (m *CompactionRequest) GetRevision() int64 { if m != nil { @@ -1368,7 +1555,7 @@ type CompactionResponse struct { func (m *CompactionResponse) Reset() { *m = CompactionResponse{} } func (m *CompactionResponse) String() string { return proto.CompactTextString(m) } func (*CompactionResponse) ProtoMessage() {} -func (*CompactionResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{13} } +func (*CompactionResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{15} } func (m *CompactionResponse) GetHeader() *ResponseHeader { if m != nil { @@ -1383,7 +1570,7 @@ type HashRequest struct { func (m *HashRequest) Reset() { *m = HashRequest{} } func (m *HashRequest) String() string { return proto.CompactTextString(m) } func (*HashRequest) ProtoMessage() {} -func (*HashRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{14} } +func (*HashRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{16} } type HashKVRequest struct { // revision is the key-value store revision for the hash operation. @@ -1393,7 +1580,7 @@ type HashKVRequest struct { func (m *HashKVRequest) Reset() { *m = HashKVRequest{} } func (m *HashKVRequest) String() string { return proto.CompactTextString(m) } func (*HashKVRequest) ProtoMessage() {} -func (*HashKVRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{15} } +func (*HashKVRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{17} } func (m *HashKVRequest) GetRevision() int64 { if m != nil { @@ -1413,7 +1600,7 @@ type HashKVResponse struct { func (m *HashKVResponse) Reset() { *m = HashKVResponse{} } func (m *HashKVResponse) String() string { return proto.CompactTextString(m) } func (*HashKVResponse) ProtoMessage() {} -func (*HashKVResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{16} } +func (*HashKVResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{18} } func (m *HashKVResponse) GetHeader() *ResponseHeader { if m != nil { @@ -1445,7 +1632,7 @@ type HashResponse struct { func (m *HashResponse) Reset() { *m = HashResponse{} } func (m *HashResponse) String() string { return proto.CompactTextString(m) } func (*HashResponse) ProtoMessage() {} -func (*HashResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{17} } +func (*HashResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{19} } func (m *HashResponse) GetHeader() *ResponseHeader { if m != nil { @@ -1467,7 +1654,7 @@ type SnapshotRequest struct { func (m *SnapshotRequest) Reset() { *m = SnapshotRequest{} } func (m *SnapshotRequest) String() string { return proto.CompactTextString(m) } func (*SnapshotRequest) ProtoMessage() {} -func (*SnapshotRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{18} } +func (*SnapshotRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{20} } type SnapshotResponse struct { // header has the current key-value store information. The first header in the snapshot @@ -1482,7 +1669,7 @@ type SnapshotResponse struct { func (m *SnapshotResponse) Reset() { *m = SnapshotResponse{} } func (m *SnapshotResponse) String() string { return proto.CompactTextString(m) } func (*SnapshotResponse) ProtoMessage() {} -func (*SnapshotResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{19} } +func (*SnapshotResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{21} } func (m *SnapshotResponse) GetHeader() *ResponseHeader { if m != nil { @@ -1518,7 +1705,7 @@ type WatchRequest struct { func (m *WatchRequest) Reset() { *m = WatchRequest{} } func (m *WatchRequest) String() string { return proto.CompactTextString(m) } func (*WatchRequest) ProtoMessage() {} -func (*WatchRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{20} } +func (*WatchRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{22} } type isWatchRequest_RequestUnion interface { isWatchRequest_RequestUnion() @@ -1695,7 +1882,7 @@ type WatchCreateRequest struct { func (m *WatchCreateRequest) Reset() { *m = WatchCreateRequest{} } func (m *WatchCreateRequest) String() string { return proto.CompactTextString(m) } func (*WatchCreateRequest) ProtoMessage() {} -func (*WatchCreateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{21} } +func (*WatchCreateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{23} } func (m *WatchCreateRequest) GetKey() []byte { if m != nil { @@ -1761,7 +1948,7 @@ type WatchCancelRequest struct { func (m *WatchCancelRequest) Reset() { *m = WatchCancelRequest{} } func (m *WatchCancelRequest) String() string { return proto.CompactTextString(m) } func (*WatchCancelRequest) ProtoMessage() {} -func (*WatchCancelRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{22} } +func (*WatchCancelRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{24} } func (m *WatchCancelRequest) GetWatchId() int64 { if m != nil { @@ -1778,7 +1965,7 @@ type WatchProgressRequest struct { func (m *WatchProgressRequest) Reset() { *m = WatchProgressRequest{} } func (m *WatchProgressRequest) String() string { return proto.CompactTextString(m) } func (*WatchProgressRequest) ProtoMessage() {} -func (*WatchProgressRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{23} } +func (*WatchProgressRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{25} } type WatchResponse struct { Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` @@ -1811,7 +1998,7 @@ type WatchResponse struct { func (m *WatchResponse) Reset() { *m = WatchResponse{} } func (m *WatchResponse) String() string { return proto.CompactTextString(m) } func (*WatchResponse) ProtoMessage() {} -func (*WatchResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{24} } +func (*WatchResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{26} } func (m *WatchResponse) GetHeader() *ResponseHeader { if m != nil { @@ -1879,7 +2066,7 @@ type LeaseGrantRequest struct { func (m *LeaseGrantRequest) Reset() { *m = LeaseGrantRequest{} } func (m *LeaseGrantRequest) String() string { return proto.CompactTextString(m) } func (*LeaseGrantRequest) ProtoMessage() {} -func (*LeaseGrantRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{25} } +func (*LeaseGrantRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{27} } func (m *LeaseGrantRequest) GetTTL() int64 { if m != nil { @@ -1907,7 +2094,7 @@ type LeaseGrantResponse struct { func (m *LeaseGrantResponse) Reset() { *m = LeaseGrantResponse{} } func (m *LeaseGrantResponse) String() string { return proto.CompactTextString(m) } func (*LeaseGrantResponse) ProtoMessage() {} -func (*LeaseGrantResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{26} } +func (*LeaseGrantResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{28} } func (m *LeaseGrantResponse) GetHeader() *ResponseHeader { if m != nil { @@ -1945,7 +2132,7 @@ type LeaseRevokeRequest struct { func (m *LeaseRevokeRequest) Reset() { *m = LeaseRevokeRequest{} } func (m *LeaseRevokeRequest) String() string { return proto.CompactTextString(m) } func (*LeaseRevokeRequest) ProtoMessage() {} -func (*LeaseRevokeRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{27} } +func (*LeaseRevokeRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{29} } func (m *LeaseRevokeRequest) GetID() int64 { if m != nil { @@ -1961,7 +2148,7 @@ type LeaseRevokeResponse struct { func (m *LeaseRevokeResponse) Reset() { *m = LeaseRevokeResponse{} } func (m *LeaseRevokeResponse) String() string { return proto.CompactTextString(m) } func (*LeaseRevokeResponse) ProtoMessage() {} -func (*LeaseRevokeResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{28} } +func (*LeaseRevokeResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{30} } func (m *LeaseRevokeResponse) GetHeader() *ResponseHeader { if m != nil { @@ -1980,7 +2167,7 @@ type LeaseCheckpoint struct { func (m *LeaseCheckpoint) Reset() { *m = LeaseCheckpoint{} } func (m *LeaseCheckpoint) String() string { return proto.CompactTextString(m) } func (*LeaseCheckpoint) ProtoMessage() {} -func (*LeaseCheckpoint) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{29} } +func (*LeaseCheckpoint) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{31} } func (m *LeaseCheckpoint) GetID() int64 { if m != nil { @@ -2003,7 +2190,7 @@ type LeaseCheckpointRequest struct { func (m *LeaseCheckpointRequest) Reset() { *m = LeaseCheckpointRequest{} } func (m *LeaseCheckpointRequest) String() string { return proto.CompactTextString(m) } func (*LeaseCheckpointRequest) ProtoMessage() {} -func (*LeaseCheckpointRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{30} } +func (*LeaseCheckpointRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{32} } func (m *LeaseCheckpointRequest) GetCheckpoints() []*LeaseCheckpoint { if m != nil { @@ -2019,7 +2206,7 @@ type LeaseCheckpointResponse struct { func (m *LeaseCheckpointResponse) Reset() { *m = LeaseCheckpointResponse{} } func (m *LeaseCheckpointResponse) String() string { return proto.CompactTextString(m) } func (*LeaseCheckpointResponse) ProtoMessage() {} -func (*LeaseCheckpointResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{31} } +func (*LeaseCheckpointResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{33} } func (m *LeaseCheckpointResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2036,7 +2223,7 @@ type LeaseKeepAliveRequest struct { func (m *LeaseKeepAliveRequest) Reset() { *m = LeaseKeepAliveRequest{} } func (m *LeaseKeepAliveRequest) String() string { return proto.CompactTextString(m) } func (*LeaseKeepAliveRequest) ProtoMessage() {} -func (*LeaseKeepAliveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{32} } +func (*LeaseKeepAliveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{34} } func (m *LeaseKeepAliveRequest) GetID() int64 { if m != nil { @@ -2056,7 +2243,7 @@ type LeaseKeepAliveResponse struct { func (m *LeaseKeepAliveResponse) Reset() { *m = LeaseKeepAliveResponse{} } func (m *LeaseKeepAliveResponse) String() string { return proto.CompactTextString(m) } func (*LeaseKeepAliveResponse) ProtoMessage() {} -func (*LeaseKeepAliveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{33} } +func (*LeaseKeepAliveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{35} } func (m *LeaseKeepAliveResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2089,7 +2276,7 @@ type LeaseTimeToLiveRequest struct { func (m *LeaseTimeToLiveRequest) Reset() { *m = LeaseTimeToLiveRequest{} } func (m *LeaseTimeToLiveRequest) String() string { return proto.CompactTextString(m) } func (*LeaseTimeToLiveRequest) ProtoMessage() {} -func (*LeaseTimeToLiveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{34} } +func (*LeaseTimeToLiveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{36} } func (m *LeaseTimeToLiveRequest) GetID() int64 { if m != nil { @@ -2120,7 +2307,7 @@ type LeaseTimeToLiveResponse struct { func (m *LeaseTimeToLiveResponse) Reset() { *m = LeaseTimeToLiveResponse{} } func (m *LeaseTimeToLiveResponse) String() string { return proto.CompactTextString(m) } func (*LeaseTimeToLiveResponse) ProtoMessage() {} -func (*LeaseTimeToLiveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{35} } +func (*LeaseTimeToLiveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{37} } func (m *LeaseTimeToLiveResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2163,7 +2350,7 @@ type LeaseLeasesRequest struct { func (m *LeaseLeasesRequest) Reset() { *m = LeaseLeasesRequest{} } func (m *LeaseLeasesRequest) String() string { return proto.CompactTextString(m) } func (*LeaseLeasesRequest) ProtoMessage() {} -func (*LeaseLeasesRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{36} } +func (*LeaseLeasesRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{38} } type LeaseStatus struct { ID int64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` @@ -2172,7 +2359,7 @@ type LeaseStatus struct { func (m *LeaseStatus) Reset() { *m = LeaseStatus{} } func (m *LeaseStatus) String() string { return proto.CompactTextString(m) } func (*LeaseStatus) ProtoMessage() {} -func (*LeaseStatus) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{37} } +func (*LeaseStatus) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{39} } func (m *LeaseStatus) GetID() int64 { if m != nil { @@ -2189,7 +2376,7 @@ type LeaseLeasesResponse struct { func (m *LeaseLeasesResponse) Reset() { *m = LeaseLeasesResponse{} } func (m *LeaseLeasesResponse) String() string { return proto.CompactTextString(m) } func (*LeaseLeasesResponse) ProtoMessage() {} -func (*LeaseLeasesResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{38} } +func (*LeaseLeasesResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{40} } func (m *LeaseLeasesResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2221,7 +2408,7 @@ type Member struct { func (m *Member) Reset() { *m = Member{} } func (m *Member) String() string { return proto.CompactTextString(m) } func (*Member) ProtoMessage() {} -func (*Member) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{39} } +func (*Member) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{41} } func (m *Member) GetID() uint64 { if m != nil { @@ -2268,7 +2455,7 @@ type MemberAddRequest struct { func (m *MemberAddRequest) Reset() { *m = MemberAddRequest{} } func (m *MemberAddRequest) String() string { return proto.CompactTextString(m) } func (*MemberAddRequest) ProtoMessage() {} -func (*MemberAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{40} } +func (*MemberAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{42} } func (m *MemberAddRequest) GetPeerURLs() []string { if m != nil { @@ -2295,7 +2482,7 @@ type MemberAddResponse struct { func (m *MemberAddResponse) Reset() { *m = MemberAddResponse{} } func (m *MemberAddResponse) String() string { return proto.CompactTextString(m) } func (*MemberAddResponse) ProtoMessage() {} -func (*MemberAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{41} } +func (*MemberAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{43} } func (m *MemberAddResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2326,7 +2513,7 @@ type MemberRemoveRequest struct { func (m *MemberRemoveRequest) Reset() { *m = MemberRemoveRequest{} } func (m *MemberRemoveRequest) String() string { return proto.CompactTextString(m) } func (*MemberRemoveRequest) ProtoMessage() {} -func (*MemberRemoveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{42} } +func (*MemberRemoveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{44} } func (m *MemberRemoveRequest) GetID() uint64 { if m != nil { @@ -2344,7 +2531,7 @@ type MemberRemoveResponse struct { func (m *MemberRemoveResponse) Reset() { *m = MemberRemoveResponse{} } func (m *MemberRemoveResponse) String() string { return proto.CompactTextString(m) } func (*MemberRemoveResponse) ProtoMessage() {} -func (*MemberRemoveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{43} } +func (*MemberRemoveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{45} } func (m *MemberRemoveResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2370,7 +2557,7 @@ type MemberUpdateRequest struct { func (m *MemberUpdateRequest) Reset() { *m = MemberUpdateRequest{} } func (m *MemberUpdateRequest) String() string { return proto.CompactTextString(m) } func (*MemberUpdateRequest) ProtoMessage() {} -func (*MemberUpdateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{44} } +func (*MemberUpdateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{46} } func (m *MemberUpdateRequest) GetID() uint64 { if m != nil { @@ -2395,7 +2582,7 @@ type MemberUpdateResponse struct { func (m *MemberUpdateResponse) Reset() { *m = MemberUpdateResponse{} } func (m *MemberUpdateResponse) String() string { return proto.CompactTextString(m) } func (*MemberUpdateResponse) ProtoMessage() {} -func (*MemberUpdateResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{45} } +func (*MemberUpdateResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{47} } func (m *MemberUpdateResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2418,7 +2605,7 @@ type MemberListRequest struct { func (m *MemberListRequest) Reset() { *m = MemberListRequest{} } func (m *MemberListRequest) String() string { return proto.CompactTextString(m) } func (*MemberListRequest) ProtoMessage() {} -func (*MemberListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{46} } +func (*MemberListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{48} } func (m *MemberListRequest) GetLinearizable() bool { if m != nil { @@ -2436,7 +2623,7 @@ type MemberListResponse struct { func (m *MemberListResponse) Reset() { *m = MemberListResponse{} } func (m *MemberListResponse) String() string { return proto.CompactTextString(m) } func (*MemberListResponse) ProtoMessage() {} -func (*MemberListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{47} } +func (*MemberListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{49} } func (m *MemberListResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2460,7 +2647,7 @@ type MemberPromoteRequest struct { func (m *MemberPromoteRequest) Reset() { *m = MemberPromoteRequest{} } func (m *MemberPromoteRequest) String() string { return proto.CompactTextString(m) } func (*MemberPromoteRequest) ProtoMessage() {} -func (*MemberPromoteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{48} } +func (*MemberPromoteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{50} } func (m *MemberPromoteRequest) GetID() uint64 { if m != nil { @@ -2478,7 +2665,7 @@ type MemberPromoteResponse struct { func (m *MemberPromoteResponse) Reset() { *m = MemberPromoteResponse{} } func (m *MemberPromoteResponse) String() string { return proto.CompactTextString(m) } func (*MemberPromoteResponse) ProtoMessage() {} -func (*MemberPromoteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{49} } +func (*MemberPromoteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{51} } func (m *MemberPromoteResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2500,7 +2687,7 @@ type DefragmentRequest struct { func (m *DefragmentRequest) Reset() { *m = DefragmentRequest{} } func (m *DefragmentRequest) String() string { return proto.CompactTextString(m) } func (*DefragmentRequest) ProtoMessage() {} -func (*DefragmentRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{50} } +func (*DefragmentRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{52} } type DefragmentResponse struct { Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` @@ -2509,7 +2696,7 @@ type DefragmentResponse struct { func (m *DefragmentResponse) Reset() { *m = DefragmentResponse{} } func (m *DefragmentResponse) String() string { return proto.CompactTextString(m) } func (*DefragmentResponse) ProtoMessage() {} -func (*DefragmentResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{51} } +func (*DefragmentResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{53} } func (m *DefragmentResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2526,7 +2713,7 @@ type MoveLeaderRequest struct { func (m *MoveLeaderRequest) Reset() { *m = MoveLeaderRequest{} } func (m *MoveLeaderRequest) String() string { return proto.CompactTextString(m) } func (*MoveLeaderRequest) ProtoMessage() {} -func (*MoveLeaderRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{52} } +func (*MoveLeaderRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{54} } func (m *MoveLeaderRequest) GetTargetID() uint64 { if m != nil { @@ -2542,7 +2729,7 @@ type MoveLeaderResponse struct { func (m *MoveLeaderResponse) Reset() { *m = MoveLeaderResponse{} } func (m *MoveLeaderResponse) String() string { return proto.CompactTextString(m) } func (*MoveLeaderResponse) ProtoMessage() {} -func (*MoveLeaderResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{53} } +func (*MoveLeaderResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{55} } func (m *MoveLeaderResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2566,7 +2753,7 @@ type AlarmRequest struct { func (m *AlarmRequest) Reset() { *m = AlarmRequest{} } func (m *AlarmRequest) String() string { return proto.CompactTextString(m) } func (*AlarmRequest) ProtoMessage() {} -func (*AlarmRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{54} } +func (*AlarmRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{56} } func (m *AlarmRequest) GetAction() AlarmRequest_AlarmAction { if m != nil { @@ -2599,7 +2786,7 @@ type AlarmMember struct { func (m *AlarmMember) Reset() { *m = AlarmMember{} } func (m *AlarmMember) String() string { return proto.CompactTextString(m) } func (*AlarmMember) ProtoMessage() {} -func (*AlarmMember) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{55} } +func (*AlarmMember) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{57} } func (m *AlarmMember) GetMemberID() uint64 { if m != nil { @@ -2624,7 +2811,7 @@ type AlarmResponse struct { func (m *AlarmResponse) Reset() { *m = AlarmResponse{} } func (m *AlarmResponse) String() string { return proto.CompactTextString(m) } func (*AlarmResponse) ProtoMessage() {} -func (*AlarmResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{56} } +func (*AlarmResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{58} } func (m *AlarmResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2652,7 +2839,7 @@ type DowngradeRequest struct { func (m *DowngradeRequest) Reset() { *m = DowngradeRequest{} } func (m *DowngradeRequest) String() string { return proto.CompactTextString(m) } func (*DowngradeRequest) ProtoMessage() {} -func (*DowngradeRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{57} } +func (*DowngradeRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{59} } func (m *DowngradeRequest) GetAction() DowngradeRequest_DowngradeAction { if m != nil { @@ -2677,7 +2864,7 @@ type DowngradeResponse struct { func (m *DowngradeResponse) Reset() { *m = DowngradeResponse{} } func (m *DowngradeResponse) String() string { return proto.CompactTextString(m) } func (*DowngradeResponse) ProtoMessage() {} -func (*DowngradeResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{58} } +func (*DowngradeResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{60} } func (m *DowngradeResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2699,7 +2886,7 @@ type StatusRequest struct { func (m *StatusRequest) Reset() { *m = StatusRequest{} } func (m *StatusRequest) String() string { return proto.CompactTextString(m) } func (*StatusRequest) ProtoMessage() {} -func (*StatusRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{59} } +func (*StatusRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{61} } type StatusResponse struct { Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` @@ -2726,7 +2913,7 @@ type StatusResponse struct { func (m *StatusResponse) Reset() { *m = StatusResponse{} } func (m *StatusResponse) String() string { return proto.CompactTextString(m) } func (*StatusResponse) ProtoMessage() {} -func (*StatusResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{60} } +func (*StatusResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{62} } func (m *StatusResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2804,7 +2991,7 @@ type AuthEnableRequest struct { func (m *AuthEnableRequest) Reset() { *m = AuthEnableRequest{} } func (m *AuthEnableRequest) String() string { return proto.CompactTextString(m) } func (*AuthEnableRequest) ProtoMessage() {} -func (*AuthEnableRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{61} } +func (*AuthEnableRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{63} } type AuthDisableRequest struct { } @@ -2812,7 +2999,7 @@ type AuthDisableRequest struct { func (m *AuthDisableRequest) Reset() { *m = AuthDisableRequest{} } func (m *AuthDisableRequest) String() string { return proto.CompactTextString(m) } func (*AuthDisableRequest) ProtoMessage() {} -func (*AuthDisableRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{62} } +func (*AuthDisableRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{64} } type AuthStatusRequest struct { } @@ -2820,7 +3007,7 @@ type AuthStatusRequest struct { func (m *AuthStatusRequest) Reset() { *m = AuthStatusRequest{} } func (m *AuthStatusRequest) String() string { return proto.CompactTextString(m) } func (*AuthStatusRequest) ProtoMessage() {} -func (*AuthStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{63} } +func (*AuthStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{65} } type AuthenticateRequest struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -2830,7 +3017,7 @@ type AuthenticateRequest struct { func (m *AuthenticateRequest) Reset() { *m = AuthenticateRequest{} } func (m *AuthenticateRequest) String() string { return proto.CompactTextString(m) } func (*AuthenticateRequest) ProtoMessage() {} -func (*AuthenticateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{64} } +func (*AuthenticateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{66} } func (m *AuthenticateRequest) GetName() string { if m != nil { @@ -2856,7 +3043,7 @@ type AuthUserAddRequest struct { func (m *AuthUserAddRequest) Reset() { *m = AuthUserAddRequest{} } func (m *AuthUserAddRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserAddRequest) ProtoMessage() {} -func (*AuthUserAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{65} } +func (*AuthUserAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{67} } func (m *AuthUserAddRequest) GetName() string { if m != nil { @@ -2893,7 +3080,7 @@ type AuthUserGetRequest struct { func (m *AuthUserGetRequest) Reset() { *m = AuthUserGetRequest{} } func (m *AuthUserGetRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserGetRequest) ProtoMessage() {} -func (*AuthUserGetRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{66} } +func (*AuthUserGetRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{68} } func (m *AuthUserGetRequest) GetName() string { if m != nil { @@ -2910,7 +3097,7 @@ type AuthUserDeleteRequest struct { func (m *AuthUserDeleteRequest) Reset() { *m = AuthUserDeleteRequest{} } func (m *AuthUserDeleteRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserDeleteRequest) ProtoMessage() {} -func (*AuthUserDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{67} } +func (*AuthUserDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{69} } func (m *AuthUserDeleteRequest) GetName() string { if m != nil { @@ -2932,7 +3119,7 @@ func (m *AuthUserChangePasswordRequest) Reset() { *m = AuthUserChangePas func (m *AuthUserChangePasswordRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserChangePasswordRequest) ProtoMessage() {} func (*AuthUserChangePasswordRequest) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{68} + return fileDescriptorRpc, []int{70} } func (m *AuthUserChangePasswordRequest) GetName() string { @@ -2966,7 +3153,7 @@ type AuthUserGrantRoleRequest struct { func (m *AuthUserGrantRoleRequest) Reset() { *m = AuthUserGrantRoleRequest{} } func (m *AuthUserGrantRoleRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserGrantRoleRequest) ProtoMessage() {} -func (*AuthUserGrantRoleRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{69} } +func (*AuthUserGrantRoleRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{71} } func (m *AuthUserGrantRoleRequest) GetUser() string { if m != nil { @@ -2990,7 +3177,7 @@ type AuthUserRevokeRoleRequest struct { func (m *AuthUserRevokeRoleRequest) Reset() { *m = AuthUserRevokeRoleRequest{} } func (m *AuthUserRevokeRoleRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserRevokeRoleRequest) ProtoMessage() {} -func (*AuthUserRevokeRoleRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{70} } +func (*AuthUserRevokeRoleRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{72} } func (m *AuthUserRevokeRoleRequest) GetName() string { if m != nil { @@ -3014,7 +3201,7 @@ type AuthRoleAddRequest struct { func (m *AuthRoleAddRequest) Reset() { *m = AuthRoleAddRequest{} } func (m *AuthRoleAddRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleAddRequest) ProtoMessage() {} -func (*AuthRoleAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{71} } +func (*AuthRoleAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{73} } func (m *AuthRoleAddRequest) GetName() string { if m != nil { @@ -3030,7 +3217,7 @@ type AuthRoleGetRequest struct { func (m *AuthRoleGetRequest) Reset() { *m = AuthRoleGetRequest{} } func (m *AuthRoleGetRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleGetRequest) ProtoMessage() {} -func (*AuthRoleGetRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{72} } +func (*AuthRoleGetRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{74} } func (m *AuthRoleGetRequest) GetRole() string { if m != nil { @@ -3045,7 +3232,7 @@ type AuthUserListRequest struct { func (m *AuthUserListRequest) Reset() { *m = AuthUserListRequest{} } func (m *AuthUserListRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserListRequest) ProtoMessage() {} -func (*AuthUserListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{73} } +func (*AuthUserListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{75} } type AuthRoleListRequest struct { } @@ -3053,7 +3240,7 @@ type AuthRoleListRequest struct { func (m *AuthRoleListRequest) Reset() { *m = AuthRoleListRequest{} } func (m *AuthRoleListRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleListRequest) ProtoMessage() {} -func (*AuthRoleListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{74} } +func (*AuthRoleListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{76} } type AuthRoleDeleteRequest struct { Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` @@ -3062,7 +3249,7 @@ type AuthRoleDeleteRequest struct { func (m *AuthRoleDeleteRequest) Reset() { *m = AuthRoleDeleteRequest{} } func (m *AuthRoleDeleteRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleDeleteRequest) ProtoMessage() {} -func (*AuthRoleDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{75} } +func (*AuthRoleDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{77} } func (m *AuthRoleDeleteRequest) GetRole() string { if m != nil { @@ -3082,7 +3269,7 @@ func (m *AuthRoleGrantPermissionRequest) Reset() { *m = AuthRoleGrantPer func (m *AuthRoleGrantPermissionRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleGrantPermissionRequest) ProtoMessage() {} func (*AuthRoleGrantPermissionRequest) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{76} + return fileDescriptorRpc, []int{78} } func (m *AuthRoleGrantPermissionRequest) GetName() string { @@ -3109,7 +3296,7 @@ func (m *AuthRoleRevokePermissionRequest) Reset() { *m = AuthRoleRevokeP func (m *AuthRoleRevokePermissionRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleRevokePermissionRequest) ProtoMessage() {} func (*AuthRoleRevokePermissionRequest) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{77} + return fileDescriptorRpc, []int{79} } func (m *AuthRoleRevokePermissionRequest) GetRole() string { @@ -3140,7 +3327,7 @@ type AuthEnableResponse struct { func (m *AuthEnableResponse) Reset() { *m = AuthEnableResponse{} } func (m *AuthEnableResponse) String() string { return proto.CompactTextString(m) } func (*AuthEnableResponse) ProtoMessage() {} -func (*AuthEnableResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{78} } +func (*AuthEnableResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{80} } func (m *AuthEnableResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3156,7 +3343,7 @@ type AuthDisableResponse struct { func (m *AuthDisableResponse) Reset() { *m = AuthDisableResponse{} } func (m *AuthDisableResponse) String() string { return proto.CompactTextString(m) } func (*AuthDisableResponse) ProtoMessage() {} -func (*AuthDisableResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{79} } +func (*AuthDisableResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{81} } func (m *AuthDisableResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3175,7 +3362,7 @@ type AuthStatusResponse struct { func (m *AuthStatusResponse) Reset() { *m = AuthStatusResponse{} } func (m *AuthStatusResponse) String() string { return proto.CompactTextString(m) } func (*AuthStatusResponse) ProtoMessage() {} -func (*AuthStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{80} } +func (*AuthStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{82} } func (m *AuthStatusResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3207,7 +3394,7 @@ type AuthenticateResponse struct { func (m *AuthenticateResponse) Reset() { *m = AuthenticateResponse{} } func (m *AuthenticateResponse) String() string { return proto.CompactTextString(m) } func (*AuthenticateResponse) ProtoMessage() {} -func (*AuthenticateResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{81} } +func (*AuthenticateResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{83} } func (m *AuthenticateResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3230,7 +3417,7 @@ type AuthUserAddResponse struct { func (m *AuthUserAddResponse) Reset() { *m = AuthUserAddResponse{} } func (m *AuthUserAddResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserAddResponse) ProtoMessage() {} -func (*AuthUserAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{82} } +func (*AuthUserAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{84} } func (m *AuthUserAddResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3247,7 +3434,7 @@ type AuthUserGetResponse struct { func (m *AuthUserGetResponse) Reset() { *m = AuthUserGetResponse{} } func (m *AuthUserGetResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserGetResponse) ProtoMessage() {} -func (*AuthUserGetResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{83} } +func (*AuthUserGetResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{85} } func (m *AuthUserGetResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3270,7 +3457,7 @@ type AuthUserDeleteResponse struct { func (m *AuthUserDeleteResponse) Reset() { *m = AuthUserDeleteResponse{} } func (m *AuthUserDeleteResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserDeleteResponse) ProtoMessage() {} -func (*AuthUserDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{84} } +func (*AuthUserDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{86} } func (m *AuthUserDeleteResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3287,7 +3474,7 @@ func (m *AuthUserChangePasswordResponse) Reset() { *m = AuthUserChangePa func (m *AuthUserChangePasswordResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserChangePasswordResponse) ProtoMessage() {} func (*AuthUserChangePasswordResponse) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{85} + return fileDescriptorRpc, []int{87} } func (m *AuthUserChangePasswordResponse) GetHeader() *ResponseHeader { @@ -3304,7 +3491,7 @@ type AuthUserGrantRoleResponse struct { func (m *AuthUserGrantRoleResponse) Reset() { *m = AuthUserGrantRoleResponse{} } func (m *AuthUserGrantRoleResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserGrantRoleResponse) ProtoMessage() {} -func (*AuthUserGrantRoleResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{86} } +func (*AuthUserGrantRoleResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{88} } func (m *AuthUserGrantRoleResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3320,7 +3507,7 @@ type AuthUserRevokeRoleResponse struct { func (m *AuthUserRevokeRoleResponse) Reset() { *m = AuthUserRevokeRoleResponse{} } func (m *AuthUserRevokeRoleResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserRevokeRoleResponse) ProtoMessage() {} -func (*AuthUserRevokeRoleResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{87} } +func (*AuthUserRevokeRoleResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{89} } func (m *AuthUserRevokeRoleResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3336,7 +3523,7 @@ type AuthRoleAddResponse struct { func (m *AuthRoleAddResponse) Reset() { *m = AuthRoleAddResponse{} } func (m *AuthRoleAddResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleAddResponse) ProtoMessage() {} -func (*AuthRoleAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{88} } +func (*AuthRoleAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{90} } func (m *AuthRoleAddResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3353,7 +3540,7 @@ type AuthRoleGetResponse struct { func (m *AuthRoleGetResponse) Reset() { *m = AuthRoleGetResponse{} } func (m *AuthRoleGetResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleGetResponse) ProtoMessage() {} -func (*AuthRoleGetResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{89} } +func (*AuthRoleGetResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{91} } func (m *AuthRoleGetResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3377,7 +3564,7 @@ type AuthRoleListResponse struct { func (m *AuthRoleListResponse) Reset() { *m = AuthRoleListResponse{} } func (m *AuthRoleListResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleListResponse) ProtoMessage() {} -func (*AuthRoleListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{90} } +func (*AuthRoleListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{92} } func (m *AuthRoleListResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3401,7 +3588,7 @@ type AuthUserListResponse struct { func (m *AuthUserListResponse) Reset() { *m = AuthUserListResponse{} } func (m *AuthUserListResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserListResponse) ProtoMessage() {} -func (*AuthUserListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{91} } +func (*AuthUserListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{93} } func (m *AuthUserListResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3424,7 +3611,7 @@ type AuthRoleDeleteResponse struct { func (m *AuthRoleDeleteResponse) Reset() { *m = AuthRoleDeleteResponse{} } func (m *AuthRoleDeleteResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleDeleteResponse) ProtoMessage() {} -func (*AuthRoleDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{92} } +func (*AuthRoleDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{94} } func (m *AuthRoleDeleteResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3441,7 +3628,7 @@ func (m *AuthRoleGrantPermissionResponse) Reset() { *m = AuthRoleGrantPe func (m *AuthRoleGrantPermissionResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleGrantPermissionResponse) ProtoMessage() {} func (*AuthRoleGrantPermissionResponse) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{93} + return fileDescriptorRpc, []int{95} } func (m *AuthRoleGrantPermissionResponse) GetHeader() *ResponseHeader { @@ -3459,7 +3646,7 @@ func (m *AuthRoleRevokePermissionResponse) Reset() { *m = AuthRoleRevoke func (m *AuthRoleRevokePermissionResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleRevokePermissionResponse) ProtoMessage() {} func (*AuthRoleRevokePermissionResponse) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{94} + return fileDescriptorRpc, []int{96} } func (m *AuthRoleRevokePermissionResponse) GetHeader() *ResponseHeader { @@ -3472,7 +3659,9 @@ func (m *AuthRoleRevokePermissionResponse) GetHeader() *ResponseHeader { func init() { proto.RegisterType((*ResponseHeader)(nil), "etcdserverpb.ResponseHeader") proto.RegisterType((*RangeRequest)(nil), "etcdserverpb.RangeRequest") + proto.RegisterType((*RangeStreamRequest)(nil), "etcdserverpb.RangeStreamRequest") proto.RegisterType((*RangeResponse)(nil), "etcdserverpb.RangeResponse") + proto.RegisterType((*RangeStreamResponse)(nil), "etcdserverpb.RangeStreamResponse") proto.RegisterType((*PutRequest)(nil), "etcdserverpb.PutRequest") proto.RegisterType((*PutResponse)(nil), "etcdserverpb.PutResponse") proto.RegisterType((*DeleteRangeRequest)(nil), "etcdserverpb.DeleteRangeRequest") @@ -3588,6 +3777,8 @@ const _ = grpc.SupportPackageIsVersion4 type KVClient interface { // Range gets the keys in the range from the key-value store. Range(ctx context.Context, in *RangeRequest, opts ...grpc.CallOption) (*RangeResponse, error) + // RangeStream gets the keys in the range stream from the key-value store. + RangeStream(ctx context.Context, in *RangeStreamRequest, opts ...grpc.CallOption) (KV_RangeStreamClient, error) // Put puts the given key into the key-value store. // A put request increments the revision of the key-value store // and generates one event in the event history. @@ -3624,6 +3815,38 @@ func (c *kVClient) Range(ctx context.Context, in *RangeRequest, opts ...grpc.Cal return out, nil } +func (c *kVClient) RangeStream(ctx context.Context, in *RangeStreamRequest, opts ...grpc.CallOption) (KV_RangeStreamClient, error) { + stream, err := grpc.NewClientStream(ctx, &_KV_serviceDesc.Streams[0], c.cc, "/etcdserverpb.KV/RangeStream", opts...) + if err != nil { + return nil, err + } + x := &kVRangeStreamClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type KV_RangeStreamClient interface { + Recv() (*RangeStreamResponse, error) + grpc.ClientStream +} + +type kVRangeStreamClient struct { + grpc.ClientStream +} + +func (x *kVRangeStreamClient) Recv() (*RangeStreamResponse, error) { + m := new(RangeStreamResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func (c *kVClient) Put(ctx context.Context, in *PutRequest, opts ...grpc.CallOption) (*PutResponse, error) { out := new(PutResponse) err := grpc.Invoke(ctx, "/etcdserverpb.KV/Put", in, out, c.cc, opts...) @@ -3665,6 +3888,8 @@ func (c *kVClient) Compact(ctx context.Context, in *CompactionRequest, opts ...g type KVServer interface { // Range gets the keys in the range from the key-value store. Range(context.Context, *RangeRequest) (*RangeResponse, error) + // RangeStream gets the keys in the range stream from the key-value store. + RangeStream(*RangeStreamRequest, KV_RangeStreamServer) error // Put puts the given key into the key-value store. // A put request increments the revision of the key-value store // and generates one event in the event history. @@ -3706,6 +3931,27 @@ func _KV_Range_Handler(srv interface{}, ctx context.Context, dec func(interface{ return interceptor(ctx, in, info, handler) } +func _KV_RangeStream_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(RangeStreamRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(KVServer).RangeStream(m, &kVRangeStreamServer{stream}) +} + +type KV_RangeStreamServer interface { + Send(*RangeStreamResponse) error + grpc.ServerStream +} + +type kVRangeStreamServer struct { + grpc.ServerStream +} + +func (x *kVRangeStreamServer) Send(m *RangeStreamResponse) error { + return x.ServerStream.SendMsg(m) +} + func _KV_Put_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(PutRequest) if err := dec(in); err != nil { @@ -3803,7 +4049,13 @@ var _KV_serviceDesc = grpc.ServiceDesc{ Handler: _KV_Compact_Handler, }, }, - Streams: []grpc.StreamDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "RangeStream", + Handler: _KV_RangeStream_Handler, + ServerStreams: true, + }, + }, Metadata: "rpc.proto", } @@ -5479,6 +5731,66 @@ func (m *RangeRequest) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *RangeStreamRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RangeStreamRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Key) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + } + if len(m.RangeEnd) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.RangeEnd))) + i += copy(dAtA[i:], m.RangeEnd) + } + if m.Limit != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Limit)) + } + if m.Revision != 0 { + dAtA[i] = 0x20 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Revision)) + } + if m.Serializable { + dAtA[i] = 0x38 + i++ + if m.Serializable { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.KeysOnly { + dAtA[i] = 0x40 + i++ + if m.KeysOnly { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + func (m *RangeResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5534,7 +5846,7 @@ func (m *RangeResponse) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func (m *PutRequest) Marshal() (dAtA []byte, err error) { +func (m *RangeStreamResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalTo(dAtA) @@ -5544,32 +5856,87 @@ func (m *PutRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PutRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *RangeStreamResponse) MarshalTo(dAtA []byte) (int, error) { var i int _ = i var l int _ = l - if len(m.Key) > 0 { + if m.Header != nil { dAtA[i] = 0xa i++ - i = encodeVarintRpc(dAtA, i, uint64(len(m.Key))) - i += copy(dAtA[i:], m.Key) - } - if len(m.Value) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintRpc(dAtA, i, uint64(len(m.Value))) - i += copy(dAtA[i:], m.Value) - } - if m.Lease != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintRpc(dAtA, i, uint64(m.Lease)) + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n2, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 } - if m.PrevKv { - dAtA[i] = 0x20 - i++ - if m.PrevKv { + if len(m.Kvs) > 0 { + for _, msg := range m.Kvs { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Count != 0 { + dAtA[i] = 0x20 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Count)) + } + if m.TotalCount != 0 { + dAtA[i] = 0x28 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.TotalCount)) + } + if m.TotalSize != 0 { + dAtA[i] = 0x30 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.TotalSize)) + } + return i, nil +} + +func (m *PutRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PutRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Key) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + } + if len(m.Value) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + } + if m.Lease != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Lease)) + } + if m.PrevKv { + dAtA[i] = 0x20 + i++ + if m.PrevKv { dAtA[i] = 1 } else { dAtA[i] = 0 @@ -5618,21 +5985,21 @@ func (m *PutResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n2, err := m.Header.MarshalTo(dAtA[i:]) + n3, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n2 + i += n3 } if m.PrevKv != nil { dAtA[i] = 0x12 i++ i = encodeVarintRpc(dAtA, i, uint64(m.PrevKv.Size())) - n3, err := m.PrevKv.MarshalTo(dAtA[i:]) + n4, err := m.PrevKv.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n3 + i += n4 } return i, nil } @@ -5696,11 +6063,11 @@ func (m *DeleteRangeResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n4, err := m.Header.MarshalTo(dAtA[i:]) + n5, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n4 + i += n5 } if m.Deleted != 0 { dAtA[i] = 0x10 @@ -5738,11 +6105,11 @@ func (m *RequestOp) MarshalTo(dAtA []byte) (int, error) { var l int _ = l if m.Request != nil { - nn5, err := m.Request.MarshalTo(dAtA[i:]) + nn6, err := m.Request.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += nn5 + i += nn6 } return i, nil } @@ -5753,11 +6120,11 @@ func (m *RequestOp_RequestRange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.RequestRange.Size())) - n6, err := m.RequestRange.MarshalTo(dAtA[i:]) + n7, err := m.RequestRange.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n6 + i += n7 } return i, nil } @@ -5767,11 +6134,11 @@ func (m *RequestOp_RequestPut) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintRpc(dAtA, i, uint64(m.RequestPut.Size())) - n7, err := m.RequestPut.MarshalTo(dAtA[i:]) + n8, err := m.RequestPut.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n7 + i += n8 } return i, nil } @@ -5781,11 +6148,11 @@ func (m *RequestOp_RequestDeleteRange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintRpc(dAtA, i, uint64(m.RequestDeleteRange.Size())) - n8, err := m.RequestDeleteRange.MarshalTo(dAtA[i:]) + n9, err := m.RequestDeleteRange.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n8 + i += n9 } return i, nil } @@ -5795,11 +6162,25 @@ func (m *RequestOp_RequestTxn) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintRpc(dAtA, i, uint64(m.RequestTxn.Size())) - n9, err := m.RequestTxn.MarshalTo(dAtA[i:]) + n10, err := m.RequestTxn.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n9 + i += n10 + } + return i, nil +} +func (m *RequestOp_RequestRangeStream) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.RequestRangeStream != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.RequestRangeStream.Size())) + n11, err := m.RequestRangeStream.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n11 } return i, nil } @@ -5819,11 +6200,11 @@ func (m *ResponseOp) MarshalTo(dAtA []byte) (int, error) { var l int _ = l if m.Response != nil { - nn10, err := m.Response.MarshalTo(dAtA[i:]) + nn12, err := m.Response.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += nn10 + i += nn12 } return i, nil } @@ -5834,11 +6215,11 @@ func (m *ResponseOp_ResponseRange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.ResponseRange.Size())) - n11, err := m.ResponseRange.MarshalTo(dAtA[i:]) + n13, err := m.ResponseRange.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n11 + i += n13 } return i, nil } @@ -5848,11 +6229,11 @@ func (m *ResponseOp_ResponsePut) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintRpc(dAtA, i, uint64(m.ResponsePut.Size())) - n12, err := m.ResponsePut.MarshalTo(dAtA[i:]) + n14, err := m.ResponsePut.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n12 + i += n14 } return i, nil } @@ -5862,11 +6243,11 @@ func (m *ResponseOp_ResponseDeleteRange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintRpc(dAtA, i, uint64(m.ResponseDeleteRange.Size())) - n13, err := m.ResponseDeleteRange.MarshalTo(dAtA[i:]) + n15, err := m.ResponseDeleteRange.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n13 + i += n15 } return i, nil } @@ -5876,11 +6257,25 @@ func (m *ResponseOp_ResponseTxn) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintRpc(dAtA, i, uint64(m.ResponseTxn.Size())) - n14, err := m.ResponseTxn.MarshalTo(dAtA[i:]) + n16, err := m.ResponseTxn.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n14 + i += n16 + } + return i, nil +} +func (m *ResponseOp_ResponseRangeStream) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.ResponseRangeStream != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ResponseRangeStream.Size())) + n17, err := m.ResponseRangeStream.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n17 } return i, nil } @@ -5916,11 +6311,11 @@ func (m *Compare) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], m.Key) } if m.TargetUnion != nil { - nn15, err := m.TargetUnion.MarshalTo(dAtA[i:]) + nn18, err := m.TargetUnion.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += nn15 + i += nn18 } if len(m.RangeEnd) > 0 { dAtA[i] = 0x82 @@ -6044,11 +6439,11 @@ func (m *TxnResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n16, err := m.Header.MarshalTo(dAtA[i:]) + n19, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n16 + i += n19 } if m.Succeeded { dAtA[i] = 0x10 @@ -6127,11 +6522,11 @@ func (m *CompactionResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n17, err := m.Header.MarshalTo(dAtA[i:]) + n20, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n17 + i += n20 } return i, nil } @@ -6196,11 +6591,11 @@ func (m *HashKVResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n18, err := m.Header.MarshalTo(dAtA[i:]) + n21, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n18 + i += n21 } if m.Hash != 0 { dAtA[i] = 0x10 @@ -6234,11 +6629,11 @@ func (m *HashResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n19, err := m.Header.MarshalTo(dAtA[i:]) + n22, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n19 + i += n22 } if m.Hash != 0 { dAtA[i] = 0x10 @@ -6285,11 +6680,11 @@ func (m *SnapshotResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n20, err := m.Header.MarshalTo(dAtA[i:]) + n23, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n20 + i += n23 } if m.RemainingBytes != 0 { dAtA[i] = 0x10 @@ -6321,11 +6716,11 @@ func (m *WatchRequest) MarshalTo(dAtA []byte) (int, error) { var l int _ = l if m.RequestUnion != nil { - nn21, err := m.RequestUnion.MarshalTo(dAtA[i:]) + nn24, err := m.RequestUnion.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += nn21 + i += nn24 } return i, nil } @@ -6336,11 +6731,11 @@ func (m *WatchRequest_CreateRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.CreateRequest.Size())) - n22, err := m.CreateRequest.MarshalTo(dAtA[i:]) + n25, err := m.CreateRequest.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n22 + i += n25 } return i, nil } @@ -6350,11 +6745,11 @@ func (m *WatchRequest_CancelRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintRpc(dAtA, i, uint64(m.CancelRequest.Size())) - n23, err := m.CancelRequest.MarshalTo(dAtA[i:]) + n26, err := m.CancelRequest.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n23 + i += n26 } return i, nil } @@ -6364,11 +6759,11 @@ func (m *WatchRequest_ProgressRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintRpc(dAtA, i, uint64(m.ProgressRequest.Size())) - n24, err := m.ProgressRequest.MarshalTo(dAtA[i:]) + n27, err := m.ProgressRequest.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n24 + i += n27 } return i, nil } @@ -6415,21 +6810,21 @@ func (m *WatchCreateRequest) MarshalTo(dAtA []byte) (int, error) { i++ } if len(m.Filters) > 0 { - dAtA26 := make([]byte, len(m.Filters)*10) - var j25 int + dAtA29 := make([]byte, len(m.Filters)*10) + var j28 int for _, num := range m.Filters { for num >= 1<<7 { - dAtA26[j25] = uint8(uint64(num)&0x7f | 0x80) + dAtA29[j28] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j25++ + j28++ } - dAtA26[j25] = uint8(num) - j25++ + dAtA29[j28] = uint8(num) + j28++ } dAtA[i] = 0x2a i++ - i = encodeVarintRpc(dAtA, i, uint64(j25)) - i += copy(dAtA[i:], dAtA26[:j25]) + i = encodeVarintRpc(dAtA, i, uint64(j28)) + i += copy(dAtA[i:], dAtA29[:j28]) } if m.PrevKv { dAtA[i] = 0x30 @@ -6519,11 +6914,11 @@ func (m *WatchResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n27, err := m.Header.MarshalTo(dAtA[i:]) + n30, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n27 + i += n30 } if m.WatchId != 0 { dAtA[i] = 0x10 @@ -6633,11 +7028,11 @@ func (m *LeaseGrantResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n28, err := m.Header.MarshalTo(dAtA[i:]) + n31, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n28 + i += n31 } if m.ID != 0 { dAtA[i] = 0x10 @@ -6700,11 +7095,11 @@ func (m *LeaseRevokeResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n29, err := m.Header.MarshalTo(dAtA[i:]) + n32, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n29 + i += n32 } return i, nil } @@ -6786,11 +7181,11 @@ func (m *LeaseCheckpointResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n30, err := m.Header.MarshalTo(dAtA[i:]) + n33, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n30 + i += n33 } return i, nil } @@ -6837,11 +7232,11 @@ func (m *LeaseKeepAliveResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n31, err := m.Header.MarshalTo(dAtA[i:]) + n34, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n31 + i += n34 } if m.ID != 0 { dAtA[i] = 0x10 @@ -6908,11 +7303,11 @@ func (m *LeaseTimeToLiveResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n32, err := m.Header.MarshalTo(dAtA[i:]) + n35, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n32 + i += n35 } if m.ID != 0 { dAtA[i] = 0x10 @@ -7000,11 +7395,11 @@ func (m *LeaseLeasesResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n33, err := m.Header.MarshalTo(dAtA[i:]) + n36, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n33 + i += n36 } if len(m.Leases) > 0 { for _, msg := range m.Leases { @@ -7152,21 +7547,21 @@ func (m *MemberAddResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n34, err := m.Header.MarshalTo(dAtA[i:]) + n37, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n34 + i += n37 } if m.Member != nil { dAtA[i] = 0x12 i++ i = encodeVarintRpc(dAtA, i, uint64(m.Member.Size())) - n35, err := m.Member.MarshalTo(dAtA[i:]) + n38, err := m.Member.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n35 + i += n38 } if len(m.Members) > 0 { for _, msg := range m.Members { @@ -7225,11 +7620,11 @@ func (m *MemberRemoveResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n36, err := m.Header.MarshalTo(dAtA[i:]) + n39, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n36 + i += n39 } if len(m.Members) > 0 { for _, msg := range m.Members { @@ -7303,11 +7698,11 @@ func (m *MemberUpdateResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n37, err := m.Header.MarshalTo(dAtA[i:]) + n40, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n37 + i += n40 } if len(m.Members) > 0 { for _, msg := range m.Members { @@ -7371,11 +7766,11 @@ func (m *MemberListResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n38, err := m.Header.MarshalTo(dAtA[i:]) + n41, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n38 + i += n41 } if len(m.Members) > 0 { for _, msg := range m.Members { @@ -7434,11 +7829,11 @@ func (m *MemberPromoteResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n39, err := m.Header.MarshalTo(dAtA[i:]) + n42, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n39 + i += n42 } if len(m.Members) > 0 { for _, msg := range m.Members { @@ -7492,11 +7887,11 @@ func (m *DefragmentResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n40, err := m.Header.MarshalTo(dAtA[i:]) + n43, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n40 + i += n43 } return i, nil } @@ -7543,11 +7938,11 @@ func (m *MoveLeaderResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n41, err := m.Header.MarshalTo(dAtA[i:]) + n44, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n41 + i += n44 } return i, nil } @@ -7632,11 +8027,11 @@ func (m *AlarmResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n42, err := m.Header.MarshalTo(dAtA[i:]) + n45, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n42 + i += n45 } if len(m.Alarms) > 0 { for _, msg := range m.Alarms { @@ -7701,11 +8096,11 @@ func (m *DowngradeResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n43, err := m.Header.MarshalTo(dAtA[i:]) + n46, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n43 + i += n46 } if len(m.Version) > 0 { dAtA[i] = 0x12 @@ -7753,11 +8148,11 @@ func (m *StatusResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n44, err := m.Header.MarshalTo(dAtA[i:]) + n47, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n44 + i += n47 } if len(m.Version) > 0 { dAtA[i] = 0x12 @@ -7938,11 +8333,11 @@ func (m *AuthUserAddRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintRpc(dAtA, i, uint64(m.Options.Size())) - n45, err := m.Options.MarshalTo(dAtA[i:]) + n48, err := m.Options.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n45 + i += n48 } if len(m.HashedPassword) > 0 { dAtA[i] = 0x22 @@ -8230,11 +8625,11 @@ func (m *AuthRoleGrantPermissionRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintRpc(dAtA, i, uint64(m.Perm.Size())) - n46, err := m.Perm.MarshalTo(dAtA[i:]) + n49, err := m.Perm.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n46 + i += n49 } return i, nil } @@ -8294,11 +8689,11 @@ func (m *AuthEnableResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n47, err := m.Header.MarshalTo(dAtA[i:]) + n50, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n47 + i += n50 } return i, nil } @@ -8322,11 +8717,11 @@ func (m *AuthDisableResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n48, err := m.Header.MarshalTo(dAtA[i:]) + n51, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n48 + i += n51 } return i, nil } @@ -8350,11 +8745,11 @@ func (m *AuthStatusResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n49, err := m.Header.MarshalTo(dAtA[i:]) + n52, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n49 + i += n52 } if m.Enabled { dAtA[i] = 0x10 @@ -8393,11 +8788,11 @@ func (m *AuthenticateResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n50, err := m.Header.MarshalTo(dAtA[i:]) + n53, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n50 + i += n53 } if len(m.Token) > 0 { dAtA[i] = 0x12 @@ -8427,11 +8822,11 @@ func (m *AuthUserAddResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n51, err := m.Header.MarshalTo(dAtA[i:]) + n54, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n51 + i += n54 } return i, nil } @@ -8455,11 +8850,11 @@ func (m *AuthUserGetResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n52, err := m.Header.MarshalTo(dAtA[i:]) + n55, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n52 + i += n55 } if len(m.Roles) > 0 { for _, s := range m.Roles { @@ -8498,11 +8893,11 @@ func (m *AuthUserDeleteResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n53, err := m.Header.MarshalTo(dAtA[i:]) + n56, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n53 + i += n56 } return i, nil } @@ -8526,11 +8921,11 @@ func (m *AuthUserChangePasswordResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n54, err := m.Header.MarshalTo(dAtA[i:]) + n57, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n54 + i += n57 } return i, nil } @@ -8554,11 +8949,11 @@ func (m *AuthUserGrantRoleResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n55, err := m.Header.MarshalTo(dAtA[i:]) + n58, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n55 + i += n58 } return i, nil } @@ -8582,11 +8977,11 @@ func (m *AuthUserRevokeRoleResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n56, err := m.Header.MarshalTo(dAtA[i:]) + n59, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n56 + i += n59 } return i, nil } @@ -8610,11 +9005,11 @@ func (m *AuthRoleAddResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n57, err := m.Header.MarshalTo(dAtA[i:]) + n60, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n57 + i += n60 } return i, nil } @@ -8638,11 +9033,11 @@ func (m *AuthRoleGetResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n58, err := m.Header.MarshalTo(dAtA[i:]) + n61, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n58 + i += n61 } if len(m.Perm) > 0 { for _, msg := range m.Perm { @@ -8678,11 +9073,11 @@ func (m *AuthRoleListResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n59, err := m.Header.MarshalTo(dAtA[i:]) + n62, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n59 + i += n62 } if len(m.Roles) > 0 { for _, s := range m.Roles { @@ -8721,11 +9116,11 @@ func (m *AuthUserListResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n60, err := m.Header.MarshalTo(dAtA[i:]) + n63, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n60 + i += n63 } if len(m.Users) > 0 { for _, s := range m.Users { @@ -8764,11 +9159,11 @@ func (m *AuthRoleDeleteResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n61, err := m.Header.MarshalTo(dAtA[i:]) + n64, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n61 + i += n64 } return i, nil } @@ -8792,11 +9187,11 @@ func (m *AuthRoleGrantPermissionResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n62, err := m.Header.MarshalTo(dAtA[i:]) + n65, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n62 + i += n65 } return i, nil } @@ -8820,11 +9215,11 @@ func (m *AuthRoleRevokePermissionResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n63, err := m.Header.MarshalTo(dAtA[i:]) + n66, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n63 + i += n66 } return i, nil } @@ -8903,21 +9298,47 @@ func (m *RangeRequest) Size() (n int) { return n } -func (m *RangeResponse) Size() (n int) { +func (m *RangeStreamRequest) Size() (n int) { var l int _ = l - if m.Header != nil { - l = m.Header.Size() + l = len(m.Key) + if l > 0 { n += 1 + l + sovRpc(uint64(l)) } - if len(m.Kvs) > 0 { - for _, e := range m.Kvs { - l = e.Size() - n += 1 + l + sovRpc(uint64(l)) - } - } - if m.More { - n += 2 + l = len(m.RangeEnd) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + if m.Limit != 0 { + n += 1 + sovRpc(uint64(m.Limit)) + } + if m.Revision != 0 { + n += 1 + sovRpc(uint64(m.Revision)) + } + if m.Serializable { + n += 2 + } + if m.KeysOnly { + n += 2 + } + return n +} + +func (m *RangeResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if len(m.Kvs) > 0 { + for _, e := range m.Kvs { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + if m.More { + n += 2 } if m.Count != 0 { n += 1 + sovRpc(uint64(m.Count)) @@ -8925,6 +9346,31 @@ func (m *RangeResponse) Size() (n int) { return n } +func (m *RangeStreamResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if len(m.Kvs) > 0 { + for _, e := range m.Kvs { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + if m.Count != 0 { + n += 1 + sovRpc(uint64(m.Count)) + } + if m.TotalCount != 0 { + n += 1 + sovRpc(uint64(m.TotalCount)) + } + if m.TotalSize != 0 { + n += 1 + sovRpc(uint64(m.TotalSize)) + } + return n +} + func (m *PutRequest) Size() (n int) { var l int _ = l @@ -9046,6 +9492,15 @@ func (m *RequestOp_RequestTxn) Size() (n int) { } return n } +func (m *RequestOp_RequestRangeStream) Size() (n int) { + var l int + _ = l + if m.RequestRangeStream != nil { + l = m.RequestRangeStream.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} func (m *ResponseOp) Size() (n int) { var l int _ = l @@ -9091,6 +9546,15 @@ func (m *ResponseOp_ResponseTxn) Size() (n int) { } return n } +func (m *ResponseOp_ResponseRangeStream) Size() (n int) { + var l int + _ = l + if m.ResponseRangeStream != nil { + l = m.ResponseRangeStream.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} func (m *Compare) Size() (n int) { var l int _ = l @@ -10761,6 +11225,196 @@ func (m *RangeRequest) Unmarshal(dAtA []byte) error { } return nil } +func (m *RangeStreamRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RangeStreamRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RangeStreamRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RangeEnd", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RangeEnd = append(m.RangeEnd[:0], dAtA[iNdEx:postIndex]...) + if m.RangeEnd == nil { + m.RangeEnd = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) + } + m.Limit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Limit |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) + } + m.Revision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Revision |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Serializable", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Serializable = bool(v != 0) + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field KeysOnly", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.KeysOnly = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *RangeResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -10914,6 +11568,177 @@ func (m *RangeResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *RangeStreamResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RangeStreamResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RangeStreamResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kvs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kvs = append(m.Kvs, &mvccpb.KeyValue{}) + if err := m.Kvs[len(m.Kvs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Count", wireType) + } + m.Count = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Count |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalCount", wireType) + } + m.TotalCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TotalCount |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalSize", wireType) + } + m.TotalSize = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TotalSize |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *PutRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -11643,6 +12468,38 @@ func (m *RequestOp) Unmarshal(dAtA []byte) error { } m.Request = &RequestOp_RequestTxn{v} iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestRangeStream", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RangeStreamRequest{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Request = &RequestOp_RequestRangeStream{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRpc(dAtA[iNdEx:]) @@ -11821,6 +12678,38 @@ func (m *ResponseOp) Unmarshal(dAtA []byte) error { } m.Response = &ResponseOp_ResponseTxn{v} iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResponseRangeStream", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &RangeStreamResponse{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Response = &ResponseOp_ResponseRangeStream{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRpc(dAtA[iNdEx:]) @@ -20724,262 +21613,270 @@ var ( func init() { proto.RegisterFile("rpc.proto", fileDescriptorRpc) } var fileDescriptorRpc = []byte{ - // 4111 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0x5b, 0x73, 0x1b, 0xc9, - 0x75, 0xe6, 0x00, 0xc4, 0xed, 0xe0, 0x42, 0xb0, 0x79, 0x11, 0x04, 0x49, 0x14, 0xb7, 0xb5, 0xd2, - 0x72, 0xa5, 0x5d, 0x62, 0x4d, 0xdb, 0xd9, 0x2a, 0x25, 0x71, 0x0c, 0x91, 0x58, 0x89, 0x4b, 0x8a, - 0xe4, 0x0e, 0x21, 0xed, 0xa5, 0x5c, 0x61, 0x0d, 0x81, 0x26, 0x39, 0x21, 0x30, 0x03, 0xcf, 0x0c, - 0x20, 0x72, 0x73, 0x71, 0xca, 0xe5, 0xb8, 0x92, 0x57, 0xbb, 0x2a, 0x95, 0x3c, 0x24, 0x2f, 0xa9, - 0x94, 0xcb, 0x0f, 0x7e, 0xce, 0x5f, 0xc8, 0x53, 0x2e, 0x95, 0x3f, 0x90, 0xda, 0xf8, 0x25, 0xf9, - 0x11, 0x29, 0x57, 0xdf, 0x66, 0x7a, 0x6e, 0xa4, 0x6c, 0xac, 0xf6, 0x85, 0x9c, 0x3e, 0x7d, 0xfa, - 0x7c, 0xa7, 0x4f, 0x77, 0x9f, 0xd3, 0x7d, 0xba, 0x01, 0x25, 0x67, 0xd4, 0x5b, 0x1f, 0x39, 0xb6, - 0x67, 0xa3, 0x0a, 0xf1, 0x7a, 0x7d, 0x97, 0x38, 0x13, 0xe2, 0x8c, 0x8e, 0x9b, 0x8b, 0xa7, 0xf6, - 0xa9, 0xcd, 0x2a, 0x5a, 0xf4, 0x8b, 0xf3, 0x34, 0x6f, 0x52, 0x9e, 0xd6, 0x70, 0xd2, 0xeb, 0xb1, - 0x3f, 0xa3, 0xe3, 0xd6, 0xf9, 0x44, 0x54, 0xdd, 0x62, 0x55, 0xc6, 0xd8, 0x3b, 0x63, 0x7f, 0x46, - 0xc7, 0xec, 0x9f, 0xa8, 0xbc, 0x7d, 0x6a, 0xdb, 0xa7, 0x03, 0xd2, 0x32, 0x46, 0x66, 0xcb, 0xb0, - 0x2c, 0xdb, 0x33, 0x3c, 0xd3, 0xb6, 0x5c, 0x5e, 0x8b, 0xff, 0x4a, 0x83, 0x9a, 0x4e, 0xdc, 0x91, - 0x6d, 0xb9, 0xe4, 0x19, 0x31, 0xfa, 0xc4, 0x41, 0x77, 0x00, 0x7a, 0x83, 0xb1, 0xeb, 0x11, 0xe7, - 0xc8, 0xec, 0x37, 0xb4, 0x55, 0x6d, 0x6d, 0x56, 0x2f, 0x09, 0xca, 0x76, 0x1f, 0xdd, 0x82, 0xd2, - 0x90, 0x0c, 0x8f, 0x79, 0x6d, 0x86, 0xd5, 0x16, 0x39, 0x61, 0xbb, 0x8f, 0x9a, 0x50, 0x74, 0xc8, - 0xc4, 0x74, 0x4d, 0xdb, 0x6a, 0x64, 0x57, 0xb5, 0xb5, 0xac, 0xee, 0x97, 0x69, 0x43, 0xc7, 0x38, - 0xf1, 0x8e, 0x3c, 0xe2, 0x0c, 0x1b, 0xb3, 0xbc, 0x21, 0x25, 0x74, 0x89, 0x33, 0xc4, 0x3f, 0xc9, - 0x41, 0x45, 0x37, 0xac, 0x53, 0xa2, 0x93, 0x1f, 0x8e, 0x89, 0xeb, 0xa1, 0x3a, 0x64, 0xcf, 0xc9, - 0x25, 0x83, 0xaf, 0xe8, 0xf4, 0x93, 0xb7, 0xb7, 0x4e, 0xc9, 0x11, 0xb1, 0x38, 0x70, 0x85, 0xb6, - 0xb7, 0x4e, 0x49, 0xc7, 0xea, 0xa3, 0x45, 0xc8, 0x0d, 0xcc, 0xa1, 0xe9, 0x09, 0x54, 0x5e, 0x08, - 0xa9, 0x33, 0x1b, 0x51, 0x67, 0x13, 0xc0, 0xb5, 0x1d, 0xef, 0xc8, 0x76, 0xfa, 0xc4, 0x69, 0xe4, - 0x56, 0xb5, 0xb5, 0xda, 0xc6, 0xdb, 0xeb, 0xea, 0x40, 0xac, 0xab, 0x0a, 0xad, 0x1f, 0xda, 0x8e, - 0xb7, 0x4f, 0x79, 0xf5, 0x92, 0x2b, 0x3f, 0xd1, 0x47, 0x50, 0x66, 0x42, 0x3c, 0xc3, 0x39, 0x25, - 0x5e, 0x23, 0xcf, 0xa4, 0xdc, 0xbf, 0x46, 0x4a, 0x97, 0x31, 0xeb, 0x0c, 0x9e, 0x7f, 0x23, 0x0c, - 0x15, 0x97, 0x38, 0xa6, 0x31, 0x30, 0xbf, 0x34, 0x8e, 0x07, 0xa4, 0x51, 0x58, 0xd5, 0xd6, 0x8a, - 0x7a, 0x88, 0x46, 0xfb, 0x7f, 0x4e, 0x2e, 0xdd, 0x23, 0xdb, 0x1a, 0x5c, 0x36, 0x8a, 0x8c, 0xa1, - 0x48, 0x09, 0xfb, 0xd6, 0xe0, 0x92, 0x0d, 0x9a, 0x3d, 0xb6, 0x3c, 0x5e, 0x5b, 0x62, 0xb5, 0x25, - 0x46, 0x61, 0xd5, 0x6b, 0x50, 0x1f, 0x9a, 0xd6, 0xd1, 0xd0, 0xee, 0x1f, 0xf9, 0x06, 0x01, 0x66, - 0x90, 0xda, 0xd0, 0xb4, 0x9e, 0xdb, 0x7d, 0x5d, 0x9a, 0x85, 0x72, 0x1a, 0x17, 0x61, 0xce, 0xb2, - 0xe0, 0x34, 0x2e, 0x54, 0xce, 0x75, 0x58, 0xa0, 0x32, 0x7b, 0x0e, 0x31, 0x3c, 0x12, 0x30, 0x57, - 0x18, 0xf3, 0xfc, 0xd0, 0xb4, 0x36, 0x59, 0x4d, 0x88, 0xdf, 0xb8, 0x88, 0xf1, 0x57, 0x05, 0xbf, - 0x71, 0x11, 0xe6, 0xc7, 0xeb, 0x50, 0xf2, 0x6d, 0x8e, 0x8a, 0x30, 0xbb, 0xb7, 0xbf, 0xd7, 0xa9, - 0xcf, 0x20, 0x80, 0x7c, 0xfb, 0x70, 0xb3, 0xb3, 0xb7, 0x55, 0xd7, 0x50, 0x19, 0x0a, 0x5b, 0x1d, - 0x5e, 0xc8, 0xe0, 0x27, 0x00, 0x81, 0x75, 0x51, 0x01, 0xb2, 0x3b, 0x9d, 0xcf, 0xeb, 0x33, 0x94, - 0xe7, 0x65, 0x47, 0x3f, 0xdc, 0xde, 0xdf, 0xab, 0x6b, 0xb4, 0xf1, 0xa6, 0xde, 0x69, 0x77, 0x3b, - 0xf5, 0x0c, 0xe5, 0x78, 0xbe, 0xbf, 0x55, 0xcf, 0xa2, 0x12, 0xe4, 0x5e, 0xb6, 0x77, 0x5f, 0x74, - 0xea, 0xb3, 0xf8, 0xe7, 0x1a, 0x54, 0xc5, 0x78, 0xf1, 0x35, 0x81, 0xbe, 0x03, 0xf9, 0x33, 0xb6, - 0x2e, 0xd8, 0x54, 0x2c, 0x6f, 0xdc, 0x8e, 0x0c, 0x6e, 0x68, 0xed, 0xe8, 0x82, 0x17, 0x61, 0xc8, - 0x9e, 0x4f, 0xdc, 0x46, 0x66, 0x35, 0xbb, 0x56, 0xde, 0xa8, 0xaf, 0xf3, 0x05, 0xbb, 0xbe, 0x43, - 0x2e, 0x5f, 0x1a, 0x83, 0x31, 0xd1, 0x69, 0x25, 0x42, 0x30, 0x3b, 0xb4, 0x1d, 0xc2, 0x66, 0x6c, - 0x51, 0x67, 0xdf, 0x74, 0x1a, 0xb3, 0x41, 0x13, 0xb3, 0x95, 0x17, 0xf0, 0x2f, 0x35, 0x80, 0x83, - 0xb1, 0x97, 0xbe, 0x34, 0x16, 0x21, 0x37, 0xa1, 0x82, 0xc5, 0xb2, 0xe0, 0x05, 0xb6, 0x26, 0x88, - 0xe1, 0x12, 0x7f, 0x4d, 0xd0, 0x02, 0xba, 0x01, 0x85, 0x91, 0x43, 0x26, 0x47, 0xe7, 0x13, 0x06, - 0x52, 0xd4, 0xf3, 0xb4, 0xb8, 0x33, 0x41, 0x6f, 0x41, 0xc5, 0x3c, 0xb5, 0x6c, 0x87, 0x1c, 0x71, - 0x59, 0x39, 0x56, 0x5b, 0xe6, 0x34, 0xa6, 0xb7, 0xc2, 0xc2, 0x05, 0xe7, 0x55, 0x96, 0x5d, 0x4a, - 0xc2, 0x16, 0x94, 0x99, 0xaa, 0x53, 0x99, 0xef, 0xdd, 0x40, 0xc7, 0x0c, 0x6b, 0x16, 0x37, 0xa1, - 0xd0, 0x1a, 0xff, 0x00, 0xd0, 0x16, 0x19, 0x10, 0x8f, 0x4c, 0xe3, 0x3d, 0x14, 0x9b, 0x64, 0x55, - 0x9b, 0xe0, 0x9f, 0x69, 0xb0, 0x10, 0x12, 0x3f, 0x55, 0xb7, 0x1a, 0x50, 0xe8, 0x33, 0x61, 0x5c, - 0x83, 0xac, 0x2e, 0x8b, 0xe8, 0x11, 0x14, 0x85, 0x02, 0x6e, 0x23, 0x9b, 0x32, 0x69, 0x0a, 0x5c, - 0x27, 0x17, 0xff, 0x32, 0x03, 0x25, 0xd1, 0xd1, 0xfd, 0x11, 0x6a, 0x43, 0xd5, 0xe1, 0x85, 0x23, - 0xd6, 0x1f, 0xa1, 0x51, 0x33, 0xdd, 0x09, 0x3d, 0x9b, 0xd1, 0x2b, 0xa2, 0x09, 0x23, 0xa3, 0xdf, - 0x87, 0xb2, 0x14, 0x31, 0x1a, 0x7b, 0xc2, 0xe4, 0x8d, 0xb0, 0x80, 0x60, 0xfe, 0x3d, 0x9b, 0xd1, - 0x41, 0xb0, 0x1f, 0x8c, 0x3d, 0xd4, 0x85, 0x45, 0xd9, 0x98, 0xf7, 0x46, 0xa8, 0x91, 0x65, 0x52, - 0x56, 0xc3, 0x52, 0xe2, 0x43, 0xf5, 0x6c, 0x46, 0x47, 0xa2, 0xbd, 0x52, 0xa9, 0xaa, 0xe4, 0x5d, - 0x70, 0xe7, 0x1d, 0x53, 0xa9, 0x7b, 0x61, 0xc5, 0x55, 0xea, 0x5e, 0x58, 0x4f, 0x4a, 0x50, 0x10, - 0x25, 0xfc, 0x2f, 0x19, 0x00, 0x39, 0x1a, 0xfb, 0x23, 0xb4, 0x05, 0x35, 0x47, 0x94, 0x42, 0xd6, - 0xba, 0x95, 0x68, 0x2d, 0x31, 0x88, 0x33, 0x7a, 0x55, 0x36, 0xe2, 0xca, 0x7d, 0x0f, 0x2a, 0xbe, - 0x94, 0xc0, 0x60, 0x37, 0x13, 0x0c, 0xe6, 0x4b, 0x28, 0xcb, 0x06, 0xd4, 0x64, 0x9f, 0xc2, 0x92, - 0xdf, 0x3e, 0xc1, 0x66, 0x6f, 0x5d, 0x61, 0x33, 0x5f, 0xe0, 0x82, 0x94, 0xa0, 0x5a, 0x4d, 0x55, - 0x2c, 0x30, 0xdb, 0xcd, 0x04, 0xb3, 0xc5, 0x15, 0xa3, 0x86, 0x03, 0x1a, 0x2f, 0x79, 0x11, 0xff, - 0x6f, 0x16, 0x0a, 0x9b, 0xf6, 0x70, 0x64, 0x38, 0x74, 0x34, 0xf2, 0x0e, 0x71, 0xc7, 0x03, 0x8f, - 0x99, 0xab, 0xb6, 0x71, 0x2f, 0x2c, 0x51, 0xb0, 0xc9, 0xff, 0x3a, 0x63, 0xd5, 0x45, 0x13, 0xda, - 0x58, 0x84, 0xc7, 0xcc, 0x6b, 0x34, 0x16, 0xc1, 0x51, 0x34, 0x91, 0x0b, 0x39, 0x1b, 0x2c, 0xe4, - 0x26, 0x14, 0x26, 0xc4, 0x09, 0x42, 0xfa, 0xb3, 0x19, 0x5d, 0x12, 0xd0, 0xbb, 0x30, 0x17, 0x0d, - 0x2f, 0x39, 0xc1, 0x53, 0xeb, 0x85, 0xa3, 0xd1, 0x3d, 0xa8, 0x84, 0x62, 0x5c, 0x5e, 0xf0, 0x95, - 0x87, 0x4a, 0x88, 0x5b, 0x96, 0x7e, 0x95, 0xc6, 0xe3, 0xca, 0xb3, 0x19, 0xe9, 0x59, 0x97, 0xa5, - 0x67, 0x2d, 0x8a, 0x56, 0xc2, 0xb7, 0x86, 0x9c, 0xcc, 0xf7, 0xc3, 0x4e, 0x06, 0x7f, 0x1f, 0xaa, - 0x21, 0x03, 0xd1, 0xb8, 0xd3, 0xf9, 0xe4, 0x45, 0x7b, 0x97, 0x07, 0xa9, 0xa7, 0x2c, 0x2e, 0xe9, - 0x75, 0x8d, 0xc6, 0xba, 0xdd, 0xce, 0xe1, 0x61, 0x3d, 0x83, 0xaa, 0x50, 0xda, 0xdb, 0xef, 0x1e, - 0x71, 0xae, 0x2c, 0x7e, 0xea, 0x4b, 0x10, 0x41, 0x4e, 0x89, 0x6d, 0x33, 0x4a, 0x6c, 0xd3, 0x64, - 0x6c, 0xcb, 0x04, 0xb1, 0x8d, 0x85, 0xb9, 0xdd, 0x4e, 0xfb, 0xb0, 0x53, 0x9f, 0x7d, 0x52, 0x83, - 0x0a, 0xb7, 0xef, 0xd1, 0xd8, 0xa2, 0xa1, 0xf6, 0x9f, 0x34, 0x80, 0x60, 0x35, 0xa1, 0x16, 0x14, - 0x7a, 0x1c, 0xa7, 0xa1, 0x31, 0x67, 0xb4, 0x94, 0x38, 0x64, 0xba, 0xe4, 0x42, 0xdf, 0x82, 0x82, - 0x3b, 0xee, 0xf5, 0x88, 0x2b, 0x43, 0xde, 0x8d, 0xa8, 0x3f, 0x14, 0xde, 0x4a, 0x97, 0x7c, 0xb4, - 0xc9, 0x89, 0x61, 0x0e, 0xc6, 0x2c, 0x00, 0x5e, 0xdd, 0x44, 0xf0, 0xe1, 0xbf, 0xd7, 0xa0, 0xac, - 0x4c, 0xde, 0xdf, 0xd1, 0x09, 0xdf, 0x86, 0x12, 0xd3, 0x81, 0xf4, 0x85, 0x1b, 0x2e, 0xea, 0x01, - 0x01, 0xfd, 0x1e, 0x94, 0xe4, 0x0a, 0x90, 0x9e, 0xb8, 0x91, 0x2c, 0x76, 0x7f, 0xa4, 0x07, 0xac, - 0x78, 0x07, 0xe6, 0x99, 0x55, 0x7a, 0x74, 0x73, 0x2d, 0xed, 0xa8, 0x6e, 0x3f, 0xb5, 0xc8, 0xf6, - 0xb3, 0x09, 0xc5, 0xd1, 0xd9, 0xa5, 0x6b, 0xf6, 0x8c, 0x81, 0xd0, 0xc2, 0x2f, 0xe3, 0x8f, 0x01, - 0xa9, 0xc2, 0xa6, 0xe9, 0x2e, 0xae, 0x42, 0xf9, 0x99, 0xe1, 0x9e, 0x09, 0x95, 0xf0, 0x23, 0xa8, - 0xd2, 0xe2, 0xce, 0xcb, 0xd7, 0xd0, 0x91, 0x1d, 0x0e, 0x24, 0xf7, 0x54, 0x36, 0x47, 0x30, 0x7b, - 0x66, 0xb8, 0x67, 0xac, 0xa3, 0x55, 0x9d, 0x7d, 0xa3, 0x77, 0xa1, 0xde, 0xe3, 0x9d, 0x3c, 0x8a, - 0x1c, 0x19, 0xe6, 0x04, 0xdd, 0xdf, 0x09, 0x7e, 0x06, 0x15, 0xde, 0x87, 0xaf, 0x5b, 0x09, 0x3c, - 0x0f, 0x73, 0x87, 0x96, 0x31, 0x72, 0xcf, 0x6c, 0x19, 0xdd, 0x68, 0xa7, 0xeb, 0x01, 0x6d, 0x2a, - 0xc4, 0x77, 0x60, 0xce, 0x21, 0x43, 0xc3, 0xb4, 0x4c, 0xeb, 0xf4, 0xe8, 0xf8, 0xd2, 0x23, 0xae, - 0x38, 0x30, 0xd5, 0x7c, 0xf2, 0x13, 0x4a, 0xa5, 0xaa, 0x1d, 0x0f, 0xec, 0x63, 0xe1, 0xe6, 0xd8, - 0x37, 0xfe, 0x69, 0x06, 0x2a, 0x9f, 0x1a, 0x5e, 0x4f, 0x0e, 0x1d, 0xda, 0x86, 0x9a, 0xef, 0xdc, - 0x18, 0x45, 0xe8, 0x12, 0x09, 0xb1, 0xac, 0x8d, 0xdc, 0x4a, 0xcb, 0xe8, 0x58, 0xed, 0xa9, 0x04, - 0x26, 0xca, 0xb0, 0x7a, 0x64, 0xe0, 0x8b, 0xca, 0xa4, 0x8b, 0x62, 0x8c, 0xaa, 0x28, 0x95, 0x80, - 0xf6, 0xa1, 0x3e, 0x72, 0xec, 0x53, 0x87, 0xb8, 0xae, 0x2f, 0x8c, 0x87, 0x31, 0x9c, 0x20, 0xec, - 0x40, 0xb0, 0x06, 0xe2, 0xe6, 0x46, 0x61, 0xd2, 0x93, 0xb9, 0x60, 0x3f, 0xc3, 0x9d, 0xd3, 0x7f, - 0x66, 0x00, 0xc5, 0x3b, 0xf5, 0xdb, 0x6e, 0xf1, 0xee, 0x43, 0xcd, 0xf5, 0x0c, 0x27, 0x36, 0xd9, - 0xaa, 0x8c, 0xea, 0x7b, 0xfc, 0x77, 0xc0, 0x57, 0xe8, 0xc8, 0xb2, 0x3d, 0xf3, 0xe4, 0x52, 0xec, - 0x92, 0x6b, 0x92, 0xbc, 0xc7, 0xa8, 0xa8, 0x03, 0x85, 0x13, 0x73, 0xe0, 0x11, 0xc7, 0x6d, 0xe4, - 0x56, 0xb3, 0x6b, 0xb5, 0x8d, 0x47, 0xd7, 0x0d, 0xc3, 0xfa, 0x47, 0x8c, 0xbf, 0x7b, 0x39, 0x22, - 0xba, 0x6c, 0xab, 0xee, 0x3c, 0xf3, 0xa1, 0xdd, 0xf8, 0x4d, 0x28, 0xbe, 0xa2, 0x22, 0xe8, 0x29, - 0xbb, 0xc0, 0x37, 0x8b, 0xac, 0xcc, 0x0f, 0xd9, 0x27, 0x8e, 0x71, 0x3a, 0x24, 0x96, 0x27, 0xcf, - 0x81, 0xb2, 0x8c, 0xef, 0x03, 0x04, 0x30, 0xd4, 0xe5, 0xef, 0xed, 0x1f, 0xbc, 0xe8, 0xd6, 0x67, - 0x50, 0x05, 0x8a, 0x7b, 0xfb, 0x5b, 0x9d, 0xdd, 0x0e, 0x8d, 0x0f, 0xb8, 0x25, 0x4d, 0x1a, 0x1a, - 0x4b, 0x15, 0x53, 0x0b, 0x61, 0xe2, 0x65, 0x58, 0x4c, 0x1a, 0x40, 0xba, 0x17, 0xad, 0x8a, 0x59, - 0x3a, 0xd5, 0x52, 0x51, 0xa1, 0x33, 0xe1, 0xee, 0x36, 0xa0, 0xc0, 0x67, 0x6f, 0x5f, 0x6c, 0xce, - 0x65, 0x91, 0x1a, 0x82, 0x4f, 0x46, 0xd2, 0x17, 0xa3, 0xe4, 0x97, 0x13, 0xdd, 0x4b, 0x2e, 0xd1, - 0xbd, 0xa0, 0x7b, 0x50, 0xf5, 0x57, 0x83, 0xe1, 0x8a, 0xbd, 0x40, 0x49, 0xaf, 0xc8, 0x89, 0x4e, - 0x69, 0x21, 0xa3, 0x17, 0xc2, 0x46, 0x47, 0xf7, 0x21, 0x4f, 0x26, 0xc4, 0xf2, 0xdc, 0x46, 0x99, - 0x45, 0x8c, 0xaa, 0xdc, 0xbb, 0x77, 0x28, 0x55, 0x17, 0x95, 0xf8, 0xbb, 0x30, 0xcf, 0xce, 0x48, - 0x4f, 0x1d, 0xc3, 0x52, 0x0f, 0x73, 0xdd, 0xee, 0xae, 0x30, 0x37, 0xfd, 0x44, 0x35, 0xc8, 0x6c, - 0x6f, 0x09, 0x23, 0x64, 0xb6, 0xb7, 0xf0, 0x8f, 0x35, 0x40, 0x6a, 0xbb, 0xa9, 0xec, 0x1c, 0x11, - 0x2e, 0xe1, 0xb3, 0x01, 0xfc, 0x22, 0xe4, 0x88, 0xe3, 0xd8, 0x0e, 0xb3, 0x68, 0x49, 0xe7, 0x05, - 0xfc, 0xb6, 0xd0, 0x41, 0x27, 0x13, 0xfb, 0xdc, 0x5f, 0x83, 0x5c, 0x9a, 0xe6, 0xab, 0xba, 0x03, - 0x0b, 0x21, 0xae, 0xa9, 0x22, 0xd7, 0x47, 0x30, 0xc7, 0x84, 0x6d, 0x9e, 0x91, 0xde, 0xf9, 0xc8, - 0x36, 0xad, 0x18, 0x1e, 0x1d, 0xb9, 0xc0, 0xc1, 0xd2, 0x7e, 0xf0, 0x8e, 0x55, 0x7c, 0x62, 0xb7, - 0xbb, 0x8b, 0x3f, 0x87, 0xe5, 0x88, 0x1c, 0xa9, 0xfe, 0x1f, 0x41, 0xb9, 0xe7, 0x13, 0x5d, 0xb1, - 0xd7, 0xb9, 0x13, 0x56, 0x2e, 0xda, 0x54, 0x6d, 0x81, 0xf7, 0xe1, 0x46, 0x4c, 0xf4, 0x54, 0x7d, - 0x7e, 0x07, 0x96, 0x98, 0xc0, 0x1d, 0x42, 0x46, 0xed, 0x81, 0x39, 0x49, 0xb5, 0xf4, 0x48, 0x74, - 0x4a, 0x61, 0x7c, 0xb3, 0xf3, 0x02, 0xff, 0x81, 0x40, 0xec, 0x9a, 0x43, 0xd2, 0xb5, 0x77, 0xd3, - 0x75, 0xa3, 0xd1, 0xec, 0x9c, 0x5c, 0xba, 0x62, 0x5b, 0xc3, 0xbe, 0xf1, 0x3f, 0x6b, 0xc2, 0x54, - 0x6a, 0xf3, 0x37, 0x3c, 0x93, 0x57, 0x00, 0x4e, 0xe9, 0x92, 0x21, 0x7d, 0x5a, 0xc1, 0x33, 0x2a, - 0x0a, 0xc5, 0xd7, 0x93, 0xfa, 0xef, 0x8a, 0xd0, 0x73, 0x51, 0xcc, 0x73, 0xf6, 0xc7, 0xf7, 0x72, - 0x77, 0xa0, 0xcc, 0x08, 0x87, 0x9e, 0xe1, 0x8d, 0xdd, 0xd8, 0x60, 0xfc, 0x85, 0x98, 0xf6, 0xb2, - 0xd1, 0x54, 0xfd, 0xfa, 0x16, 0xe4, 0xd9, 0x61, 0x42, 0x6e, 0xa5, 0x6f, 0x26, 0xcc, 0x47, 0xae, - 0x87, 0x2e, 0x18, 0xf1, 0x4f, 0x35, 0xc8, 0x3f, 0x67, 0x29, 0x58, 0x45, 0xb5, 0x59, 0x39, 0x16, - 0x96, 0x31, 0xe4, 0x89, 0xa1, 0x92, 0xce, 0xbe, 0xd9, 0xd6, 0x93, 0x10, 0xe7, 0x85, 0xbe, 0xcb, - 0xb7, 0xb8, 0x25, 0xdd, 0x2f, 0x53, 0x9b, 0xf5, 0x06, 0x26, 0xb1, 0x3c, 0x56, 0x3b, 0xcb, 0x6a, - 0x15, 0x0a, 0xdd, 0x3d, 0x9b, 0xee, 0x2e, 0x31, 0x1c, 0x4b, 0x24, 0x4d, 0x8b, 0x7a, 0x40, 0xc0, - 0xbb, 0x50, 0xe7, 0x7a, 0xb4, 0xfb, 0x7d, 0x65, 0x83, 0xe9, 0xa3, 0x69, 0x11, 0xb4, 0x90, 0xb4, - 0x4c, 0x54, 0xda, 0x2f, 0x34, 0x98, 0x57, 0xc4, 0x4d, 0x65, 0xd5, 0xf7, 0x20, 0xcf, 0x93, 0xd4, - 0x62, 0xa7, 0xb3, 0x18, 0x6e, 0xc5, 0x61, 0x74, 0xc1, 0x83, 0xd6, 0xa1, 0xc0, 0xbf, 0xe4, 0x19, - 0x20, 0x99, 0x5d, 0x32, 0xe1, 0xfb, 0xb0, 0x20, 0x48, 0x64, 0x68, 0x27, 0x2d, 0x0c, 0x36, 0x18, - 0xf8, 0xcf, 0x60, 0x31, 0xcc, 0x36, 0x55, 0x97, 0x14, 0x25, 0x33, 0xaf, 0xa3, 0x64, 0x5b, 0x2a, - 0xf9, 0x62, 0xd4, 0x57, 0xf6, 0x51, 0xd1, 0x19, 0xa3, 0x8e, 0x57, 0x26, 0x3c, 0x5e, 0x41, 0x07, - 0xa4, 0x88, 0x6f, 0xb4, 0x03, 0x1f, 0xca, 0xe9, 0xb0, 0x6b, 0xba, 0xbe, 0x0f, 0xc7, 0x50, 0x19, - 0x98, 0x16, 0x31, 0x1c, 0x91, 0x39, 0xd7, 0x78, 0xe6, 0x5c, 0xa5, 0xe1, 0x2f, 0x01, 0xa9, 0x0d, - 0xbf, 0x51, 0xa5, 0x1f, 0x48, 0x93, 0x1d, 0x38, 0xf6, 0xd0, 0x4e, 0x35, 0x3b, 0xfe, 0x73, 0x58, - 0x8a, 0xf0, 0x7d, 0xa3, 0x6a, 0x2e, 0xc0, 0xfc, 0x16, 0x91, 0x1b, 0x1a, 0xe9, 0xf6, 0x3e, 0x06, - 0xa4, 0x12, 0xa7, 0x8a, 0x6c, 0x2d, 0x98, 0x7f, 0x6e, 0x4f, 0xa8, 0x8b, 0xa4, 0xd4, 0xc0, 0x37, - 0xf0, 0x3c, 0x84, 0x6f, 0x0a, 0xbf, 0x4c, 0xc1, 0xd5, 0x06, 0x53, 0x81, 0xff, 0xbb, 0x06, 0x95, - 0xf6, 0xc0, 0x70, 0x86, 0x12, 0xf8, 0x7b, 0x90, 0xe7, 0xa7, 0x6b, 0x91, 0xd0, 0x7a, 0x10, 0x16, - 0xa3, 0xf2, 0xf2, 0x42, 0x9b, 0x9f, 0xc5, 0x45, 0x2b, 0xaa, 0xb8, 0xb8, 0xf3, 0xda, 0x8a, 0xdc, - 0x81, 0x6d, 0xa1, 0xf7, 0x21, 0x67, 0xd0, 0x26, 0x2c, 0x14, 0xd5, 0xa2, 0x79, 0x0d, 0x26, 0x8d, - 0x9d, 0x01, 0x38, 0x17, 0xfe, 0x0e, 0x94, 0x15, 0x04, 0x54, 0x80, 0xec, 0xd3, 0x8e, 0xd8, 0xb0, - 0xb7, 0x37, 0xbb, 0xdb, 0x2f, 0x79, 0x42, 0xa7, 0x06, 0xb0, 0xd5, 0xf1, 0xcb, 0x19, 0xfc, 0x99, - 0x68, 0x25, 0xdc, 0xbe, 0xaa, 0x8f, 0x96, 0xa6, 0x4f, 0xe6, 0xb5, 0xf4, 0xb9, 0x80, 0xaa, 0xe8, - 0xfe, 0xb4, 0x61, 0x8c, 0xc9, 0x4b, 0x09, 0x63, 0x8a, 0xf2, 0xba, 0x60, 0xc4, 0xbf, 0xd2, 0xa0, - 0xbe, 0x65, 0xbf, 0xb2, 0x4e, 0x1d, 0xa3, 0xef, 0xaf, 0x93, 0x8f, 0x22, 0x23, 0xb5, 0x1e, 0x49, - 0x8e, 0x46, 0xf8, 0x03, 0x42, 0x64, 0xc4, 0x1a, 0x41, 0xda, 0x90, 0xc7, 0x42, 0x59, 0xc4, 0x1f, - 0xc2, 0x5c, 0xa4, 0x11, 0xb5, 0xfd, 0xcb, 0xf6, 0xee, 0xf6, 0x16, 0xb5, 0x35, 0x4b, 0xac, 0x75, - 0xf6, 0xda, 0x4f, 0x76, 0x3b, 0xe2, 0x02, 0xa9, 0xbd, 0xb7, 0xd9, 0xd9, 0xad, 0x67, 0x70, 0x0f, - 0xe6, 0x15, 0xf8, 0x69, 0x6f, 0x06, 0x52, 0xb4, 0x9b, 0x83, 0xaa, 0x88, 0xf6, 0x62, 0x51, 0xfe, - 0x5b, 0x06, 0x6a, 0x92, 0xf2, 0x66, 0x30, 0xd1, 0x32, 0xe4, 0xfb, 0xc7, 0x87, 0xe6, 0x97, 0xf2, - 0xe6, 0x48, 0x94, 0x28, 0x7d, 0xc0, 0x71, 0xf8, 0xf5, 0xad, 0x28, 0xd1, 0x30, 0xee, 0x18, 0x27, - 0xde, 0xb6, 0xd5, 0x27, 0x17, 0x6c, 0x53, 0x30, 0xab, 0x07, 0x04, 0x96, 0x61, 0x12, 0xd7, 0xbc, - 0xec, 0x64, 0xa5, 0x5c, 0xfb, 0xa2, 0x87, 0x50, 0xa7, 0xdf, 0xed, 0xd1, 0x68, 0x60, 0x92, 0x3e, - 0x17, 0x50, 0x60, 0x3c, 0x31, 0x3a, 0x45, 0x67, 0x67, 0x11, 0xb7, 0x51, 0x64, 0x61, 0x49, 0x94, - 0xd0, 0x2a, 0x94, 0xb9, 0x7e, 0xdb, 0xd6, 0x0b, 0x97, 0xb0, 0xbb, 0xcf, 0xac, 0xae, 0x92, 0xc2, - 0xdb, 0x0c, 0x88, 0x6e, 0x33, 0x16, 0x60, 0xbe, 0x3d, 0xf6, 0xce, 0x3a, 0x16, 0x8d, 0x15, 0xd2, - 0xca, 0x8b, 0x80, 0x28, 0x71, 0xcb, 0x74, 0x55, 0xaa, 0x60, 0x0d, 0x0f, 0x48, 0x07, 0x16, 0x28, - 0x91, 0x58, 0x9e, 0xd9, 0x53, 0xe2, 0xaa, 0xdc, 0x79, 0x69, 0x91, 0x9d, 0x97, 0xe1, 0xba, 0xaf, - 0x6c, 0xa7, 0x2f, 0x6c, 0xee, 0x97, 0xf1, 0x3f, 0x6a, 0x1c, 0xf2, 0x85, 0x1b, 0xda, 0x3e, 0xfd, - 0x96, 0x62, 0xd0, 0x07, 0x50, 0xb0, 0x47, 0xec, 0x86, 0x5f, 0xa4, 0x61, 0x96, 0xd7, 0xf9, 0x9b, - 0x80, 0x75, 0x21, 0x78, 0x9f, 0xd7, 0xea, 0x92, 0x0d, 0x3d, 0x80, 0xda, 0x99, 0xe1, 0x9e, 0x91, - 0xfe, 0x81, 0x94, 0xc9, 0x4f, 0x7e, 0x11, 0x2a, 0x5e, 0x0b, 0xf4, 0x7b, 0x4a, 0xbc, 0x2b, 0xf4, - 0xc3, 0x8f, 0x60, 0x49, 0x72, 0x8a, 0xdb, 0x89, 0x2b, 0x98, 0x5f, 0xc1, 0x1d, 0xc9, 0xbc, 0x79, - 0x66, 0x58, 0xa7, 0x44, 0x02, 0xfe, 0xae, 0x16, 0x88, 0xf7, 0x27, 0x9b, 0xd8, 0x9f, 0x27, 0xd0, - 0xf0, 0xfb, 0xc3, 0x4e, 0xd6, 0xf6, 0x40, 0x55, 0x74, 0xec, 0x8a, 0xf5, 0x54, 0xd2, 0xd9, 0x37, - 0xa5, 0x39, 0xf6, 0xc0, 0xdf, 0x4a, 0xd3, 0x6f, 0xbc, 0x09, 0x37, 0xa5, 0x0c, 0x71, 0xe6, 0x0d, - 0x0b, 0x89, 0x29, 0x9e, 0x24, 0x44, 0x18, 0x96, 0x36, 0xbd, 0x7a, 0xe0, 0x55, 0xce, 0xf0, 0x10, - 0x30, 0x99, 0x9a, 0x22, 0x73, 0x89, 0x4f, 0x4a, 0xaa, 0x98, 0xb2, 0x5b, 0x92, 0x64, 0x2a, 0x40, - 0x25, 0x8b, 0x01, 0xa3, 0xe4, 0xd8, 0x80, 0xc5, 0x44, 0xff, 0x00, 0x56, 0x7c, 0x25, 0xa8, 0xdd, - 0x0e, 0x88, 0x33, 0x34, 0x5d, 0x57, 0xc9, 0x7b, 0x27, 0x75, 0xfc, 0x01, 0xcc, 0x8e, 0x88, 0x08, - 0x42, 0xe5, 0x0d, 0x24, 0x27, 0xa5, 0xd2, 0x98, 0xd5, 0xe3, 0x3e, 0xdc, 0x95, 0xd2, 0xb9, 0x45, - 0x13, 0xc5, 0x47, 0x95, 0x92, 0xd9, 0xc0, 0x4c, 0x4a, 0x36, 0x30, 0x1b, 0xb9, 0x8b, 0xf9, 0x98, - 0x1b, 0x52, 0xae, 0xf9, 0xa9, 0x36, 0x17, 0x3b, 0xdc, 0xa6, 0xbe, 0xab, 0x98, 0x4a, 0xd8, 0x5f, - 0x0b, 0x2f, 0xf0, 0x75, 0x79, 0x78, 0xc2, 0x7a, 0x28, 0x2f, 0x3a, 0x64, 0x91, 0xee, 0x9a, 0xe9, - 0x00, 0xe8, 0x6a, 0x2e, 0x74, 0x56, 0x0f, 0xd1, 0xf0, 0x31, 0x2c, 0x86, 0xfd, 0xda, 0x54, 0xba, - 0x2c, 0x42, 0xce, 0xb3, 0xcf, 0x89, 0x8c, 0x35, 0xbc, 0x20, 0x6d, 0xe7, 0xfb, 0xbc, 0xa9, 0x6c, - 0x67, 0x04, 0xc2, 0xd8, 0xea, 0x98, 0x56, 0x5f, 0x3a, 0xb1, 0xe4, 0x19, 0x88, 0x17, 0xf0, 0x1e, - 0x2c, 0x47, 0x3d, 0xdb, 0x54, 0x2a, 0xbf, 0xe4, 0x6b, 0x29, 0xc9, 0xf9, 0x4d, 0x25, 0xf7, 0x93, - 0xc0, 0x2f, 0x29, 0xbe, 0x6d, 0x2a, 0x91, 0x3a, 0x34, 0x93, 0x5c, 0xdd, 0xd7, 0xb1, 0x74, 0x7c, - 0xcf, 0x37, 0x95, 0x30, 0x37, 0x10, 0x36, 0xfd, 0xf0, 0x07, 0xee, 0x2a, 0x7b, 0xa5, 0xbb, 0x12, - 0x8b, 0x24, 0x70, 0xa8, 0x6f, 0x60, 0xd2, 0x09, 0x8c, 0xc0, 0x97, 0x4f, 0x8b, 0x41, 0xc3, 0x99, - 0x8f, 0xc1, 0x0a, 0x72, 0x62, 0xab, 0x11, 0x60, 0xaa, 0xc1, 0xf8, 0x34, 0x70, 0xe3, 0xb1, 0x20, - 0x31, 0x95, 0xe0, 0xcf, 0x60, 0x35, 0x3d, 0x3e, 0x4c, 0x23, 0xf9, 0x61, 0x0b, 0x4a, 0xfe, 0x61, - 0x48, 0x79, 0x6f, 0x56, 0x86, 0xc2, 0xde, 0xfe, 0xe1, 0x41, 0x7b, 0xb3, 0xc3, 0x1f, 0x9c, 0x6d, - 0xee, 0xeb, 0xfa, 0x8b, 0x83, 0x6e, 0x3d, 0xb3, 0xf1, 0xeb, 0x2c, 0x64, 0x76, 0x5e, 0xa2, 0xcf, - 0x21, 0xc7, 0x5f, 0x5f, 0x5c, 0xf1, 0xe4, 0xa6, 0x79, 0xd5, 0x03, 0x13, 0x7c, 0xe3, 0xc7, 0xff, - 0xf5, 0xeb, 0x9f, 0x67, 0xe6, 0x71, 0xa5, 0x35, 0xf9, 0x76, 0xeb, 0x7c, 0xd2, 0x62, 0x61, 0xea, - 0xb1, 0xf6, 0x10, 0x7d, 0x02, 0xd9, 0x83, 0xb1, 0x87, 0x52, 0x9f, 0xe2, 0x34, 0xd3, 0xdf, 0x9c, - 0xe0, 0x25, 0x26, 0x74, 0x0e, 0x83, 0x10, 0x3a, 0x1a, 0x7b, 0x54, 0xe4, 0x0f, 0xa1, 0xac, 0xbe, - 0x18, 0xb9, 0xf6, 0x7d, 0x4e, 0xf3, 0xfa, 0xd7, 0x28, 0xf8, 0x0e, 0x83, 0xba, 0x81, 0x91, 0x80, - 0xe2, 0x6f, 0x5a, 0xd4, 0x5e, 0x74, 0x2f, 0x2c, 0x94, 0xfa, 0x7a, 0xa7, 0x99, 0xfe, 0x40, 0x25, - 0xd6, 0x0b, 0xef, 0xc2, 0xa2, 0x22, 0xff, 0x44, 0xbc, 0x4d, 0xe9, 0x79, 0xe8, 0x6e, 0xc2, 0xdb, - 0x04, 0xf5, 0x16, 0xbe, 0xb9, 0x9a, 0xce, 0x20, 0x40, 0x6e, 0x33, 0x90, 0x65, 0x3c, 0x2f, 0x40, - 0x7a, 0x3e, 0xcb, 0x63, 0xed, 0xe1, 0x46, 0x0f, 0x72, 0xec, 0x86, 0x0b, 0x7d, 0x21, 0x3f, 0x9a, - 0x09, 0x57, 0x7d, 0x29, 0x03, 0x1d, 0xba, 0x1b, 0xc3, 0x8b, 0x0c, 0xa8, 0x86, 0x4b, 0x14, 0x88, - 0xdd, 0x6f, 0x3d, 0xd6, 0x1e, 0xae, 0x69, 0x1f, 0x68, 0x1b, 0xbf, 0xca, 0x41, 0x8e, 0xa5, 0x76, - 0xd1, 0x39, 0x40, 0x70, 0xdb, 0x13, 0xed, 0x5d, 0xec, 0xfe, 0x28, 0xda, 0xbb, 0xf8, 0x45, 0x11, - 0x6e, 0x32, 0xd0, 0x45, 0x3c, 0x47, 0x41, 0x59, 0xc6, 0xb8, 0xc5, 0x92, 0xe0, 0xd4, 0x8e, 0x7f, - 0xa3, 0x89, 0xcc, 0x36, 0x5f, 0x4b, 0x28, 0x49, 0x5a, 0xe8, 0xca, 0x27, 0x3a, 0x1d, 0x12, 0xae, - 0x7b, 0xf0, 0x77, 0x19, 0x60, 0x0b, 0xd7, 0x03, 0x40, 0x87, 0x71, 0x3c, 0xd6, 0x1e, 0x7e, 0xd1, - 0xc0, 0x0b, 0xc2, 0xca, 0x91, 0x1a, 0xf4, 0x23, 0xa8, 0x85, 0xaf, 0x34, 0xd0, 0xbd, 0x04, 0xac, - 0xe8, 0xcd, 0x48, 0xf3, 0xed, 0xab, 0x99, 0x84, 0x4e, 0x2b, 0x4c, 0x27, 0x01, 0xce, 0x91, 0xcf, - 0x09, 0x19, 0x19, 0x94, 0x49, 0x8c, 0x01, 0xfa, 0x07, 0x4d, 0xdc, 0x38, 0x05, 0x77, 0x14, 0x28, - 0x49, 0x7a, 0xec, 0x06, 0xa4, 0x79, 0xff, 0x1a, 0x2e, 0xa1, 0xc4, 0x1f, 0x32, 0x25, 0x3e, 0xc4, - 0x8b, 0x81, 0x12, 0x9e, 0x39, 0x24, 0x9e, 0x2d, 0xb4, 0xf8, 0xe2, 0x36, 0xbe, 0x11, 0x32, 0x4e, - 0xa8, 0x36, 0x18, 0x2c, 0x7e, 0xcf, 0x90, 0x38, 0x58, 0xa1, 0x7b, 0x8b, 0xc4, 0xc1, 0x0a, 0x5f, - 0x52, 0x24, 0x0d, 0x16, 0xbf, 0x55, 0x48, 0x1a, 0x2c, 0xbf, 0x66, 0xe3, 0xff, 0x66, 0xa1, 0xb0, - 0xc9, 0xdf, 0x84, 0x23, 0x1b, 0x4a, 0x7e, 0x9a, 0x1e, 0xad, 0x24, 0xe5, 0x19, 0x83, 0x63, 0x4d, - 0xf3, 0x6e, 0x6a, 0xbd, 0x50, 0xe8, 0x2d, 0xa6, 0xd0, 0x2d, 0xbc, 0x4c, 0x91, 0xc5, 0xb3, 0xf3, - 0x16, 0x4f, 0x66, 0xb5, 0x8c, 0x7e, 0x9f, 0x1a, 0xe2, 0x4f, 0xa1, 0xa2, 0xe6, 0xd1, 0xd1, 0x5b, - 0x89, 0xb9, 0x4d, 0x35, 0x15, 0xdf, 0xc4, 0x57, 0xb1, 0x08, 0xe4, 0xb7, 0x19, 0xf2, 0x0a, 0xbe, - 0x99, 0x80, 0xec, 0x30, 0xd6, 0x10, 0x38, 0xcf, 0x81, 0x27, 0x83, 0x87, 0x52, 0xec, 0xc9, 0xe0, - 0xe1, 0x14, 0xfa, 0x95, 0xe0, 0x63, 0xc6, 0x4a, 0xc1, 0x5d, 0x80, 0x20, 0x93, 0x8d, 0x12, 0x6d, - 0xa9, 0x9c, 0xeb, 0xa2, 0xce, 0x21, 0x9e, 0x04, 0xc7, 0x98, 0xc1, 0x8a, 0x79, 0x17, 0x81, 0x1d, - 0x98, 0xae, 0xc7, 0x17, 0x66, 0x35, 0x94, 0x9a, 0x46, 0x89, 0xfd, 0x09, 0xe7, 0xb7, 0x9b, 0xf7, - 0xae, 0xe4, 0x11, 0xe8, 0xf7, 0x19, 0xfa, 0x5d, 0xdc, 0x4c, 0x40, 0x1f, 0x71, 0x5e, 0x3a, 0xd9, - 0xfe, 0x3f, 0x0f, 0xe5, 0xe7, 0x86, 0x69, 0x79, 0xc4, 0x32, 0xac, 0x1e, 0x41, 0xc7, 0x90, 0x63, - 0x91, 0x3a, 0xea, 0x88, 0xd5, 0xb4, 0x6d, 0xd4, 0x11, 0x87, 0x72, 0x9a, 0x78, 0x95, 0x01, 0x37, - 0xf1, 0x12, 0x05, 0x1e, 0x06, 0xa2, 0x5b, 0x2c, 0x15, 0x49, 0x3b, 0x7d, 0x02, 0x79, 0x71, 0xdb, - 0x17, 0x11, 0x14, 0x4a, 0xfe, 0x34, 0x6f, 0x27, 0x57, 0x26, 0xcd, 0x65, 0x15, 0xc6, 0x65, 0x7c, - 0x14, 0x67, 0x02, 0x10, 0xe4, 0xd8, 0xa3, 0x23, 0x1a, 0x4b, 0xc9, 0x37, 0x57, 0xd3, 0x19, 0x92, - 0x6c, 0xaa, 0x62, 0xf6, 0x7d, 0x5e, 0x8a, 0xfb, 0xc7, 0x30, 0xfb, 0xcc, 0x70, 0xcf, 0x50, 0x24, - 0xf6, 0x2a, 0x6f, 0xc5, 0x9a, 0xcd, 0xa4, 0x2a, 0x81, 0x72, 0x97, 0xa1, 0xdc, 0xe4, 0xae, 0x4c, - 0x45, 0x39, 0x33, 0x5c, 0x1a, 0xd4, 0x50, 0x1f, 0xf2, 0xfc, 0xe9, 0x58, 0xd4, 0x7e, 0xa1, 0xe7, - 0x67, 0x51, 0xfb, 0x85, 0x5f, 0x9b, 0x5d, 0x8f, 0x32, 0x82, 0xa2, 0x7c, 0xab, 0x85, 0x22, 0x17, - 0xf7, 0x91, 0x77, 0x5d, 0xcd, 0x95, 0xb4, 0x6a, 0x81, 0x75, 0x8f, 0x61, 0xdd, 0xc1, 0x8d, 0xd8, - 0x58, 0x09, 0xce, 0xc7, 0xda, 0xc3, 0x0f, 0x34, 0xf4, 0x23, 0x80, 0xe0, 0x5a, 0x22, 0xb6, 0x02, - 0xa3, 0x37, 0x1c, 0xb1, 0x15, 0x18, 0xbb, 0xd1, 0xc0, 0xeb, 0x0c, 0x77, 0x0d, 0xdf, 0x8b, 0xe2, - 0x7a, 0x8e, 0x61, 0xb9, 0x27, 0xc4, 0x79, 0x9f, 0x67, 0x59, 0xdd, 0x33, 0x73, 0x44, 0xbb, 0xec, - 0x40, 0xc9, 0xcf, 0x3a, 0x47, 0xbd, 0x6d, 0x34, 0x1b, 0x1e, 0xf5, 0xb6, 0xb1, 0x74, 0x75, 0xd8, - 0xed, 0x84, 0x66, 0x8b, 0x64, 0xa5, 0x0b, 0xf0, 0x17, 0x75, 0x98, 0xa5, 0xbb, 0x6e, 0xba, 0x39, - 0x09, 0xf2, 0x26, 0xd1, 0xde, 0xc7, 0xb2, 0xa8, 0xd1, 0xde, 0xc7, 0x53, 0x2e, 0xe1, 0xcd, 0x09, - 0xfb, 0x05, 0x13, 0x4f, 0x51, 0xd0, 0x9e, 0xda, 0x50, 0x56, 0x12, 0x2b, 0x28, 0x41, 0x58, 0x38, - 0x3d, 0x1b, 0x0d, 0x77, 0x09, 0x59, 0x19, 0x7c, 0x8b, 0xe1, 0x2d, 0xf1, 0x70, 0xc7, 0xf0, 0xfa, - 0x9c, 0x83, 0x02, 0x8a, 0xde, 0x89, 0x75, 0x9f, 0xd0, 0xbb, 0xf0, 0xda, 0x5f, 0x4d, 0x67, 0x48, - 0xed, 0x5d, 0xb0, 0xf0, 0x5f, 0x41, 0x45, 0x4d, 0xaf, 0xa0, 0x04, 0xe5, 0x23, 0x29, 0xe5, 0x68, - 0x1c, 0x49, 0xca, 0xce, 0x84, 0x3d, 0x9b, 0xff, 0x93, 0x30, 0xc9, 0x46, 0x81, 0x07, 0x50, 0x10, - 0xf9, 0x96, 0x24, 0x93, 0x86, 0xd3, 0xcf, 0x49, 0x26, 0x8d, 0x24, 0x6b, 0xc2, 0xbb, 0x67, 0x86, - 0x48, 0x8f, 0x94, 0x32, 0x56, 0x0b, 0xb4, 0xa7, 0xc4, 0x4b, 0x43, 0x0b, 0x32, 0x99, 0x69, 0x68, - 0xca, 0x71, 0x3e, 0x0d, 0xed, 0x94, 0x78, 0xc2, 0x1f, 0xc8, 0x63, 0x32, 0x4a, 0x11, 0xa6, 0xc6, - 0x47, 0x7c, 0x15, 0x4b, 0xd2, 0xe1, 0x26, 0x00, 0x94, 0xc1, 0xf1, 0x02, 0x20, 0xc8, 0x06, 0x45, - 0x77, 0xac, 0x89, 0x59, 0xf0, 0xe8, 0x8e, 0x35, 0x39, 0xa1, 0x14, 0xf6, 0x7d, 0x01, 0x2e, 0x3f, - 0x5b, 0x51, 0xe4, 0x9f, 0x69, 0x80, 0xe2, 0x89, 0x23, 0xf4, 0x28, 0x59, 0x7a, 0x62, 0x6e, 0xbd, - 0xf9, 0xde, 0xeb, 0x31, 0x27, 0x85, 0xb3, 0x40, 0xa5, 0x1e, 0xe3, 0x1e, 0xbd, 0xa2, 0x4a, 0xfd, - 0xa5, 0x06, 0xd5, 0x50, 0xd6, 0x09, 0x3d, 0x48, 0x19, 0xd3, 0x48, 0xca, 0xbd, 0xf9, 0xce, 0xb5, - 0x7c, 0x49, 0x5b, 0x79, 0x65, 0x06, 0xc8, 0x33, 0xcd, 0x4f, 0x34, 0xa8, 0x85, 0xb3, 0x54, 0x28, - 0x45, 0x76, 0x2c, 0x65, 0xdf, 0x5c, 0xbb, 0x9e, 0xf1, 0xea, 0xe1, 0x09, 0x8e, 0x33, 0x03, 0x28, - 0x88, 0xbc, 0x56, 0xd2, 0xc4, 0x0f, 0x27, 0xfb, 0x93, 0x26, 0x7e, 0x24, 0x29, 0x96, 0x30, 0xf1, - 0x1d, 0x7b, 0x40, 0x94, 0x65, 0x26, 0x12, 0x5f, 0x69, 0x68, 0x57, 0x2f, 0xb3, 0x48, 0xd6, 0x2c, - 0x0d, 0x2d, 0x58, 0x66, 0x32, 0xe3, 0x85, 0x52, 0x84, 0x5d, 0xb3, 0xcc, 0xa2, 0x09, 0xb3, 0x84, - 0x65, 0xc6, 0x00, 0x95, 0x65, 0x16, 0xe4, 0xa6, 0x92, 0x96, 0x59, 0xec, 0xee, 0x22, 0x69, 0x99, - 0xc5, 0xd3, 0x5b, 0x09, 0xe3, 0xc8, 0x70, 0x43, 0xcb, 0x6c, 0x21, 0x21, 0x8d, 0x85, 0xde, 0x4b, - 0x31, 0x62, 0xe2, 0x95, 0x48, 0xf3, 0xfd, 0xd7, 0xe4, 0x4e, 0x9d, 0xe3, 0xdc, 0xfc, 0x72, 0x8e, - 0xff, 0xad, 0x06, 0x8b, 0x49, 0x29, 0x30, 0x94, 0x82, 0x93, 0x72, 0x95, 0xd2, 0x5c, 0x7f, 0x5d, - 0xf6, 0xab, 0xad, 0xe5, 0xcf, 0xfa, 0x27, 0xf5, 0x7f, 0xfd, 0x6a, 0x45, 0xfb, 0x8f, 0xaf, 0x56, - 0xb4, 0xff, 0xfe, 0x6a, 0x45, 0xfb, 0xbb, 0xff, 0x59, 0x99, 0x39, 0xce, 0xb3, 0x1f, 0x1a, 0x7f, - 0xfb, 0x37, 0x01, 0x00, 0x00, 0xff, 0xff, 0x7a, 0xd4, 0x63, 0xa4, 0xef, 0x3c, 0x00, 0x00, + // 4231 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x3b, 0xcb, 0x72, 0x1b, 0x49, + 0x72, 0x6c, 0x80, 0x00, 0x88, 0xc4, 0x83, 0x60, 0xf1, 0x21, 0x08, 0x92, 0x28, 0xaa, 0x34, 0xd2, + 0x70, 0xa4, 0x19, 0x62, 0x96, 0xbb, 0xeb, 0x89, 0x90, 0xed, 0xf5, 0x42, 0x24, 0x46, 0xe2, 0x90, + 0x22, 0x39, 0x4d, 0x48, 0xf3, 0x88, 0x0d, 0x33, 0x9a, 0x40, 0x89, 0x6c, 0x13, 0xe8, 0xc6, 0x76, + 0x37, 0x20, 0x72, 0xfc, 0x58, 0xc7, 0xc6, 0x7a, 0xc3, 0xbe, 0x39, 0x76, 0x23, 0x1c, 0xf6, 0xc1, + 0xbe, 0x38, 0x1c, 0x1b, 0x7b, 0xd8, 0xab, 0x7f, 0xc0, 0x17, 0x9f, 0xfc, 0x08, 0x9f, 0x7c, 0x73, + 0x8c, 0x7d, 0xb1, 0x3f, 0xc2, 0x76, 0xd4, 0xab, 0xbb, 0xfa, 0x05, 0x6a, 0x07, 0xa3, 0xb9, 0x90, + 0x5d, 0x59, 0x59, 0x99, 0x59, 0x99, 0x55, 0x99, 0x59, 0x59, 0x05, 0x28, 0x3a, 0xc3, 0xee, 0xc6, + 0xd0, 0xb1, 0x3d, 0x1b, 0x95, 0x89, 0xd7, 0xed, 0xb9, 0xc4, 0x19, 0x13, 0x67, 0x78, 0xd2, 0x58, + 0x3a, 0xb5, 0x4f, 0x6d, 0xd6, 0xd1, 0xa4, 0x5f, 0x1c, 0xa7, 0x71, 0x9d, 0xe2, 0x34, 0x07, 0xe3, + 0x6e, 0x97, 0xfd, 0x19, 0x9e, 0x34, 0xcf, 0xc7, 0xa2, 0xeb, 0x06, 0xeb, 0x32, 0x46, 0xde, 0x19, + 0xfb, 0x33, 0x3c, 0x61, 0xff, 0x44, 0xe7, 0xcd, 0x53, 0xdb, 0x3e, 0xed, 0x93, 0xa6, 0x31, 0x34, + 0x9b, 0x86, 0x65, 0xd9, 0x9e, 0xe1, 0x99, 0xb6, 0xe5, 0xf2, 0x5e, 0xfc, 0x27, 0x1a, 0x54, 0x75, + 0xe2, 0x0e, 0x6d, 0xcb, 0x25, 0x4f, 0x89, 0xd1, 0x23, 0x0e, 0xba, 0x05, 0xd0, 0xed, 0x8f, 0x5c, + 0x8f, 0x38, 0xc7, 0x66, 0xaf, 0xae, 0xad, 0x69, 0xeb, 0xb3, 0x7a, 0x51, 0x40, 0x76, 0x7a, 0xe8, + 0x06, 0x14, 0x07, 0x64, 0x70, 0xc2, 0x7b, 0x33, 0xac, 0x77, 0x8e, 0x03, 0x76, 0x7a, 0xa8, 0x01, + 0x73, 0x0e, 0x19, 0x9b, 0xae, 0x69, 0x5b, 0xf5, 0xec, 0x9a, 0xb6, 0x9e, 0xd5, 0xfd, 0x36, 0x1d, + 0xe8, 0x18, 0x2f, 0xbd, 0x63, 0x8f, 0x38, 0x83, 0xfa, 0x2c, 0x1f, 0x48, 0x01, 0x1d, 0xe2, 0x0c, + 0xf0, 0x4f, 0x72, 0x50, 0xd6, 0x0d, 0xeb, 0x94, 0xe8, 0xe4, 0x87, 0x23, 0xe2, 0x7a, 0xa8, 0x06, + 0xd9, 0x73, 0x72, 0xc9, 0xd8, 0x97, 0x75, 0xfa, 0xc9, 0xc7, 0x5b, 0xa7, 0xe4, 0x98, 0x58, 0x9c, + 0x71, 0x99, 0x8e, 0xb7, 0x4e, 0x49, 0xdb, 0xea, 0xa1, 0x25, 0xc8, 0xf5, 0xcd, 0x81, 0xe9, 0x09, + 0xae, 0xbc, 0x11, 0x12, 0x67, 0x36, 0x22, 0xce, 0x16, 0x80, 0x6b, 0x3b, 0xde, 0xb1, 0xed, 0xf4, + 0x88, 0x53, 0xcf, 0xad, 0x69, 0xeb, 0xd5, 0xcd, 0xb7, 0x36, 0x54, 0x43, 0x6c, 0xa8, 0x02, 0x6d, + 0x1c, 0xd9, 0x8e, 0x77, 0x40, 0x71, 0xf5, 0xa2, 0x2b, 0x3f, 0xd1, 0x87, 0x50, 0x62, 0x44, 0x3c, + 0xc3, 0x39, 0x25, 0x5e, 0x3d, 0xcf, 0xa8, 0xdc, 0xbb, 0x82, 0x4a, 0x87, 0x21, 0xeb, 0x8c, 0x3d, + 0xff, 0x46, 0x18, 0xca, 0x2e, 0x71, 0x4c, 0xa3, 0x6f, 0x7e, 0x61, 0x9c, 0xf4, 0x49, 0xbd, 0xb0, + 0xa6, 0xad, 0xcf, 0xe9, 0x21, 0x18, 0x9d, 0xff, 0x39, 0xb9, 0x74, 0x8f, 0x6d, 0xab, 0x7f, 0x59, + 0x9f, 0x63, 0x08, 0x73, 0x14, 0x70, 0x60, 0xf5, 0x2f, 0x99, 0xd1, 0xec, 0x91, 0xe5, 0xf1, 0xde, + 0x22, 0xeb, 0x2d, 0x32, 0x08, 0xeb, 0x5e, 0x87, 0xda, 0xc0, 0xb4, 0x8e, 0x07, 0x76, 0xef, 0xd8, + 0x57, 0x08, 0x30, 0x85, 0x54, 0x07, 0xa6, 0xf5, 0xcc, 0xee, 0xe9, 0x52, 0x2d, 0x14, 0xd3, 0xb8, + 0x08, 0x63, 0x96, 0x04, 0xa6, 0x71, 0xa1, 0x62, 0x6e, 0xc0, 0x22, 0xa5, 0xd9, 0x75, 0x88, 0xe1, + 0x91, 0x00, 0xb9, 0xcc, 0x90, 0x17, 0x06, 0xa6, 0xb5, 0xc5, 0x7a, 0x42, 0xf8, 0xc6, 0x45, 0x0c, + 0xbf, 0x22, 0xf0, 0x8d, 0x8b, 0x30, 0x3e, 0xde, 0x80, 0xa2, 0xaf, 0x73, 0x34, 0x07, 0xb3, 0xfb, + 0x07, 0xfb, 0xed, 0xda, 0x0c, 0x02, 0xc8, 0xb7, 0x8e, 0xb6, 0xda, 0xfb, 0xdb, 0x35, 0x0d, 0x95, + 0xa0, 0xb0, 0xdd, 0xe6, 0x8d, 0x0c, 0x7e, 0x0c, 0x10, 0x68, 0x17, 0x15, 0x20, 0xbb, 0xdb, 0xfe, + 0xac, 0x36, 0x43, 0x71, 0x5e, 0xb4, 0xf5, 0xa3, 0x9d, 0x83, 0xfd, 0x9a, 0x46, 0x07, 0x6f, 0xe9, + 0xed, 0x56, 0xa7, 0x5d, 0xcb, 0x50, 0x8c, 0x67, 0x07, 0xdb, 0xb5, 0x2c, 0x2a, 0x42, 0xee, 0x45, + 0x6b, 0xef, 0x79, 0xbb, 0x36, 0x8b, 0xff, 0x5e, 0x03, 0xc4, 0xec, 0x75, 0xe4, 0x39, 0xc4, 0x18, + 0x7c, 0x63, 0x8b, 0x71, 0x5a, 0xfb, 0xe3, 0x9f, 0x6b, 0x50, 0x11, 0x0b, 0x8d, 0x6f, 0x66, 0xf4, + 0x1d, 0xc8, 0x9f, 0xb1, 0x0d, 0xcd, 0xc4, 0x2e, 0x6d, 0xde, 0x8c, 0xac, 0xca, 0xd0, 0xa6, 0xd7, + 0x05, 0x2e, 0xc2, 0x90, 0x3d, 0x1f, 0xbb, 0xf5, 0xcc, 0x5a, 0x76, 0xbd, 0xb4, 0x59, 0xdb, 0xe0, + 0x9e, 0x66, 0x63, 0x97, 0x5c, 0xbe, 0x30, 0xfa, 0x23, 0xa2, 0xd3, 0x4e, 0x84, 0x60, 0x76, 0x60, + 0x3b, 0x84, 0xcd, 0x6e, 0x4e, 0x67, 0xdf, 0x74, 0xca, 0x6c, 0xb5, 0x89, 0x99, 0xf1, 0x06, 0xfe, + 0x07, 0x0d, 0x16, 0x43, 0xea, 0x7c, 0xe3, 0xb2, 0x25, 0xca, 0x81, 0x56, 0x01, 0x3c, 0xdb, 0x33, + 0xfa, 0x5b, 0xac, 0x2b, 0xc7, 0xba, 0x14, 0x08, 0xba, 0x09, 0x45, 0xd6, 0x3a, 0x32, 0xbf, 0x20, + 0x6c, 0x13, 0x67, 0xf5, 0x00, 0x80, 0x7f, 0xa9, 0x01, 0x1c, 0x8e, 0xbc, 0xf4, 0xc5, 0xb0, 0x04, + 0xb9, 0x31, 0x15, 0x41, 0x2c, 0x04, 0xde, 0x60, 0xab, 0x80, 0x18, 0x2e, 0xf1, 0x57, 0x01, 0x6d, + 0xa0, 0x6b, 0x50, 0x18, 0x3a, 0x64, 0x7c, 0x7c, 0x3e, 0x66, 0x22, 0xce, 0xe9, 0x79, 0xda, 0xdc, + 0x1d, 0xa3, 0x3b, 0x50, 0x36, 0x4f, 0x2d, 0xdb, 0x21, 0xc7, 0x9c, 0x56, 0x8e, 0xf5, 0x96, 0x38, + 0x8c, 0xcd, 0x50, 0x41, 0xe1, 0x84, 0xf3, 0x2a, 0xca, 0x1e, 0x05, 0x61, 0x0b, 0x4a, 0x4c, 0xd4, + 0xa9, 0x14, 0xfd, 0x4e, 0x20, 0x63, 0x86, 0x0d, 0x8b, 0x2b, 0x5b, 0x48, 0x8d, 0x7f, 0x00, 0x68, + 0x9b, 0xf4, 0x89, 0x47, 0xa6, 0x71, 0xde, 0x8a, 0x4e, 0xb2, 0xaa, 0x4e, 0xf0, 0xcf, 0x34, 0x58, + 0x0c, 0x91, 0x9f, 0x6a, 0x5a, 0x75, 0x28, 0xf4, 0x18, 0x31, 0x2e, 0x41, 0x56, 0x97, 0x4d, 0xf4, + 0x10, 0xe6, 0x84, 0x00, 0x6e, 0x3d, 0x9b, 0xb2, 0xbc, 0x0a, 0x5c, 0x26, 0x17, 0xff, 0x5f, 0x06, + 0x8a, 0x62, 0xa2, 0x07, 0x43, 0xd4, 0x82, 0x8a, 0xc3, 0x1b, 0xc7, 0x6c, 0x3e, 0x42, 0xa2, 0x46, + 0x7a, 0x0c, 0x78, 0x3a, 0xa3, 0x97, 0xc5, 0x10, 0x06, 0x46, 0xbf, 0x09, 0x25, 0x49, 0x62, 0x38, + 0xf2, 0x84, 0xca, 0xeb, 0x61, 0x02, 0xc1, 0xfa, 0x7b, 0x3a, 0xa3, 0x83, 0x40, 0x3f, 0x1c, 0x79, + 0xa8, 0x03, 0x4b, 0x72, 0x30, 0x9f, 0x8d, 0x10, 0x23, 0xcb, 0xa8, 0xac, 0x85, 0xa9, 0xc4, 0x4d, + 0xf5, 0x74, 0x46, 0x47, 0x62, 0xbc, 0xd2, 0xa9, 0x8a, 0xe4, 0x5d, 0x70, 0x77, 0x15, 0x13, 0xa9, + 0x73, 0x61, 0xc5, 0x45, 0xea, 0x5c, 0x58, 0xaa, 0x48, 0xdc, 0xe6, 0x2e, 0xdb, 0xfd, 0x6c, 0x45, + 0xc7, 0x44, 0x8a, 0x7b, 0x5b, 0x45, 0x24, 0xa5, 0xf3, 0x71, 0x11, 0x0a, 0x02, 0x8a, 0xff, 0x3c, + 0x0b, 0x20, 0x6d, 0x7c, 0x30, 0x44, 0xdb, 0x50, 0x75, 0x44, 0x2b, 0x64, 0x83, 0x1b, 0x89, 0x36, + 0x10, 0x4b, 0x63, 0x46, 0xaf, 0xc8, 0x41, 0x7c, 0xca, 0xdf, 0x83, 0xb2, 0x4f, 0x25, 0x30, 0xc3, + 0xf5, 0x04, 0x33, 0xf8, 0x14, 0x4a, 0x72, 0x00, 0x35, 0xc4, 0x27, 0xb0, 0xec, 0x8f, 0x4f, 0xb0, + 0xc4, 0x9d, 0x09, 0x96, 0xf0, 0x09, 0x2e, 0x4a, 0x0a, 0xaa, 0x2d, 0x54, 0xc1, 0x02, 0x63, 0x5c, + 0x4f, 0x30, 0x46, 0x5c, 0x30, 0x6a, 0x0e, 0x55, 0xb0, 0x04, 0x7b, 0xdc, 0x99, 0x60, 0x8f, 0xb8, + 0x60, 0xaa, 0x45, 0x80, 0x06, 0x34, 0x0e, 0xc6, 0xff, 0x9d, 0x85, 0xc2, 0x96, 0x3d, 0x18, 0x1a, + 0x0e, 0x5d, 0x3c, 0x79, 0x87, 0xb8, 0xa3, 0xbe, 0xc7, 0xec, 0x50, 0xdd, 0xbc, 0x1b, 0xe6, 0x20, + 0xd0, 0xe4, 0x7f, 0x9d, 0xa1, 0xea, 0x62, 0x08, 0x1d, 0x2c, 0x92, 0xa9, 0xcc, 0x6b, 0x0c, 0x16, + 0xa9, 0x94, 0x18, 0x22, 0xfd, 0x4e, 0x36, 0xf0, 0x3b, 0x0d, 0x28, 0x8c, 0x89, 0x13, 0xc4, 0xdc, + 0xa7, 0x33, 0xba, 0x04, 0xa0, 0x77, 0x60, 0x3e, 0x9a, 0x8c, 0xe4, 0x04, 0x4e, 0xb5, 0x1b, 0xce, + 0x5d, 0xee, 0x42, 0x39, 0x94, 0x11, 0xe5, 0x05, 0x5e, 0x69, 0xa0, 0x24, 0x44, 0x2b, 0x32, 0x0c, + 0xd0, 0xe8, 0x5d, 0x7e, 0x3a, 0x23, 0x03, 0xc1, 0x8a, 0x0c, 0x04, 0x73, 0x62, 0x94, 0x08, 0x05, + 0x21, 0x9f, 0xf8, 0xfd, 0xb0, 0x4f, 0xc4, 0xdf, 0x87, 0x4a, 0x48, 0x41, 0x34, 0x4b, 0x69, 0x7f, + 0xfc, 0xbc, 0xb5, 0xc7, 0x53, 0x9a, 0x27, 0x2c, 0x8b, 0xd1, 0x6b, 0x1a, 0xcd, 0x8c, 0xf6, 0xda, + 0x47, 0x47, 0xb5, 0x0c, 0xaa, 0x40, 0x71, 0xff, 0xa0, 0x73, 0xcc, 0xb1, 0xb2, 0xf8, 0x89, 0x4f, + 0x41, 0xa4, 0x44, 0x4a, 0x26, 0x34, 0xa3, 0x64, 0x42, 0x9a, 0xcc, 0x84, 0x32, 0x41, 0x26, 0xc4, + 0x92, 0xa2, 0xbd, 0x76, 0xeb, 0xa8, 0x5d, 0x9b, 0x7d, 0x5c, 0x85, 0x32, 0xd7, 0xef, 0xf1, 0xc8, + 0xa2, 0x89, 0xd9, 0xdf, 0x6a, 0x00, 0xc1, 0xe6, 0x47, 0x4d, 0x28, 0x74, 0x39, 0x9f, 0xba, 0xc6, + 0x7c, 0xe7, 0x72, 0xa2, 0xc9, 0x74, 0x89, 0x85, 0xbe, 0x05, 0x05, 0x77, 0xd4, 0xed, 0x12, 0x57, + 0xc6, 0xf2, 0x6b, 0x51, 0xf7, 0x2d, 0x9c, 0xab, 0x2e, 0xf1, 0xe8, 0x90, 0x97, 0x86, 0xd9, 0x1f, + 0xb1, 0xac, 0x63, 0xf2, 0x10, 0x81, 0x87, 0xff, 0x4a, 0x83, 0x92, 0xb2, 0x2b, 0xbe, 0x62, 0xcc, + 0xb8, 0x09, 0x45, 0x26, 0x03, 0xe9, 0x89, 0xa8, 0x31, 0xa7, 0x07, 0x00, 0xf4, 0x1b, 0x50, 0x94, + 0x3b, 0x40, 0x06, 0x8e, 0x7a, 0x32, 0xd9, 0x83, 0xa1, 0x1e, 0xa0, 0xe2, 0x5d, 0x58, 0x60, 0x5a, + 0xe9, 0xd2, 0xa3, 0x98, 0xd4, 0xa3, 0x9a, 0x1f, 0x6a, 0x91, 0xfc, 0xb0, 0x01, 0x73, 0xc3, 0xb3, + 0x4b, 0xd7, 0xec, 0x1a, 0x7d, 0x21, 0x85, 0xdf, 0xc6, 0x1f, 0x01, 0x52, 0x89, 0x4d, 0x33, 0x5d, + 0x5c, 0x81, 0xd2, 0x53, 0xc3, 0x3d, 0x13, 0x22, 0xe1, 0x87, 0x50, 0xa1, 0xcd, 0xdd, 0x17, 0xaf, + 0x21, 0x23, 0x3b, 0x4a, 0x4a, 0xec, 0xa9, 0x74, 0x8e, 0x60, 0xf6, 0xcc, 0x70, 0xcf, 0xd8, 0x44, + 0x2b, 0x3a, 0xfb, 0x46, 0xef, 0x40, 0xad, 0xcb, 0x27, 0x79, 0x1c, 0x39, 0x60, 0xce, 0x0b, 0xb8, + 0x7f, 0x6e, 0xf8, 0x14, 0xca, 0x7c, 0x0e, 0x5f, 0xb7, 0x10, 0x78, 0x01, 0xe6, 0x8f, 0x2c, 0x63, + 0xe8, 0x9e, 0xd9, 0x32, 0x18, 0xd3, 0x49, 0xd7, 0x02, 0xd8, 0x54, 0x1c, 0xdf, 0x86, 0x79, 0x87, + 0x0c, 0x0c, 0xd3, 0x32, 0xad, 0xd3, 0xe3, 0x93, 0x4b, 0x8f, 0xb8, 0xe2, 0x78, 0x5d, 0xf5, 0xc1, + 0x8f, 0x29, 0x94, 0x8a, 0x76, 0xd2, 0xb7, 0x4f, 0x84, 0x9b, 0x63, 0xdf, 0xf8, 0xa7, 0x19, 0x28, + 0x7f, 0x62, 0x78, 0x5d, 0x69, 0x3a, 0xb4, 0x03, 0x55, 0xdf, 0xb9, 0x31, 0x88, 0x90, 0x25, 0x12, + 0x7e, 0xd9, 0x18, 0x79, 0xf0, 0x92, 0xe1, 0xb7, 0xd2, 0x55, 0x01, 0x8c, 0x94, 0x61, 0x75, 0x49, + 0xdf, 0x27, 0x95, 0x49, 0x27, 0xc5, 0x10, 0x55, 0x52, 0x2a, 0x00, 0x1d, 0x40, 0x6d, 0xe8, 0xd8, + 0xa7, 0x0e, 0x71, 0x5d, 0x9f, 0x18, 0x8f, 0x8f, 0x38, 0x81, 0xd8, 0xa1, 0x40, 0x0d, 0xc8, 0xcd, + 0x0f, 0xc3, 0xa0, 0xc7, 0xf3, 0x41, 0xfa, 0xc5, 0x9d, 0xd3, 0xbf, 0x66, 0x00, 0xc5, 0x27, 0xf5, + 0xeb, 0x66, 0xa4, 0xf7, 0xa0, 0xea, 0x7a, 0x86, 0x13, 0x5b, 0x6c, 0x15, 0x06, 0xf5, 0x3d, 0xfe, + 0xdb, 0xe0, 0x0b, 0x74, 0x6c, 0xd9, 0x9e, 0xf9, 0xf2, 0x52, 0x24, 0xf5, 0x55, 0x09, 0xde, 0x67, + 0x50, 0xd4, 0x86, 0xc2, 0x4b, 0xb3, 0xef, 0x11, 0xc7, 0xad, 0xe7, 0xd6, 0xb2, 0xeb, 0xd5, 0xcd, + 0x87, 0x57, 0x99, 0x61, 0xe3, 0x43, 0x86, 0xdf, 0xb9, 0x1c, 0x12, 0x5d, 0x8e, 0x55, 0x13, 0xe5, + 0x7c, 0xe8, 0xf0, 0x70, 0x1d, 0xe6, 0x5e, 0x51, 0x12, 0xc7, 0x66, 0x8f, 0x45, 0x9f, 0xac, 0x5e, + 0x60, 0x6d, 0x5e, 0x92, 0x79, 0xe9, 0x18, 0xa7, 0x03, 0x62, 0x79, 0xf2, 0xd4, 0x28, 0xdb, 0xf8, + 0x1e, 0x40, 0xc0, 0x86, 0xba, 0xfc, 0xfd, 0x83, 0xc3, 0xe7, 0x9d, 0xda, 0x0c, 0x2a, 0xc3, 0xdc, + 0xfe, 0xc1, 0x76, 0x7b, 0xaf, 0x4d, 0xe3, 0x03, 0x6e, 0x4a, 0x95, 0x86, 0x6c, 0xa9, 0xf2, 0xd4, + 0x42, 0x3c, 0xf1, 0x0a, 0x2c, 0x25, 0x19, 0x10, 0xff, 0x32, 0x03, 0x15, 0xb1, 0x4a, 0xa7, 0xda, + 0x2a, 0x2a, 0xeb, 0x4c, 0x78, 0xba, 0x75, 0x28, 0xf0, 0xd5, 0xdb, 0x13, 0x67, 0x09, 0xd9, 0xa4, + 0x8a, 0xe0, 0x8b, 0x91, 0xf4, 0x84, 0x95, 0xfc, 0x76, 0xa2, 0x7b, 0xc9, 0x25, 0xba, 0x17, 0x74, + 0x17, 0x2a, 0xfe, 0x6e, 0x30, 0x5c, 0x91, 0x0b, 0x14, 0xf5, 0xb2, 0x5c, 0xe8, 0x14, 0x16, 0x52, + 0x7a, 0x21, 0xac, 0x74, 0x74, 0x0f, 0xf2, 0x64, 0x4c, 0x2c, 0xcf, 0xad, 0x97, 0x58, 0xc4, 0xa8, + 0xc8, 0xa3, 0x46, 0x9b, 0x42, 0x75, 0xd1, 0x89, 0xbf, 0x0b, 0x0b, 0xec, 0x48, 0xf7, 0xc4, 0x31, + 0x2c, 0xf5, 0xec, 0xd9, 0xe9, 0xec, 0x09, 0x75, 0xd3, 0x4f, 0x54, 0x85, 0xcc, 0xce, 0xb6, 0x50, + 0x42, 0x66, 0x67, 0x1b, 0xff, 0x58, 0x03, 0xa4, 0x8e, 0x9b, 0x4a, 0xcf, 0x11, 0xe2, 0x92, 0x7d, + 0x36, 0x60, 0xbf, 0x04, 0x39, 0xe2, 0x38, 0xb6, 0xc3, 0x34, 0x5a, 0xd4, 0x79, 0x03, 0xbf, 0x25, + 0x64, 0xd0, 0xc9, 0xd8, 0x3e, 0xf7, 0xf7, 0x20, 0xa7, 0xa6, 0xf9, 0xa2, 0xee, 0xc2, 0x62, 0x08, + 0x6b, 0xaa, 0xc8, 0xf5, 0x21, 0xcc, 0x33, 0x62, 0x5b, 0x67, 0xa4, 0x7b, 0x3e, 0xb4, 0x4d, 0x2b, + 0xc6, 0x8f, 0x5a, 0x2e, 0x70, 0xb0, 0x74, 0x1e, 0x7c, 0x62, 0x65, 0x1f, 0xd8, 0xe9, 0xec, 0xe1, + 0xcf, 0x60, 0x25, 0x42, 0x47, 0x8a, 0xff, 0x3b, 0x50, 0xea, 0xfa, 0x40, 0x57, 0xe4, 0x3a, 0xb7, + 0xc2, 0xc2, 0x45, 0x87, 0xaa, 0x23, 0xf0, 0x01, 0x5c, 0x8b, 0x91, 0x9e, 0x6a, 0xce, 0x6f, 0xc3, + 0x32, 0x23, 0xb8, 0x4b, 0xc8, 0xb0, 0xd5, 0x37, 0xc7, 0xa9, 0x9a, 0x1e, 0x8a, 0x49, 0x29, 0x88, + 0x6f, 0x76, 0x5d, 0xe0, 0xdf, 0x12, 0x1c, 0x3b, 0xe6, 0x80, 0x74, 0xec, 0xbd, 0x74, 0xd9, 0x68, + 0x34, 0x3b, 0x27, 0x97, 0xae, 0x48, 0x6b, 0xd8, 0x37, 0xfe, 0x3b, 0x4d, 0xa8, 0x4a, 0x1d, 0xfe, + 0x86, 0x57, 0xf2, 0x2a, 0xc0, 0x29, 0xdd, 0x32, 0xa4, 0x47, 0x3b, 0x78, 0xf9, 0x48, 0x81, 0xf8, + 0x72, 0x52, 0xff, 0x5d, 0x16, 0x72, 0x2e, 0x89, 0x75, 0xce, 0xfe, 0xf8, 0x5e, 0xee, 0x16, 0x94, + 0x18, 0xe0, 0xc8, 0x33, 0xbc, 0x91, 0x1b, 0x33, 0xc6, 0x1f, 0x89, 0x65, 0x2f, 0x07, 0x4d, 0x35, + 0xaf, 0x6f, 0x41, 0x9e, 0x1d, 0x26, 0x64, 0x2a, 0x7d, 0x3d, 0x61, 0x3d, 0x72, 0x39, 0x74, 0x81, + 0x88, 0x7f, 0xaa, 0x41, 0xfe, 0x19, 0x2b, 0xd8, 0x2b, 0xa2, 0xcd, 0x4a, 0x5b, 0x58, 0xc6, 0x80, + 0xd7, 0xb1, 0x8a, 0x3a, 0xfb, 0x66, 0xa9, 0x27, 0x21, 0xce, 0x73, 0x7d, 0x8f, 0xa7, 0xb8, 0x45, + 0xdd, 0x6f, 0x53, 0x9d, 0x75, 0xfb, 0x26, 0xb1, 0x3c, 0xd6, 0x3b, 0xcb, 0x7a, 0x15, 0x08, 0xcd, + 0x9e, 0x4d, 0x77, 0x8f, 0x18, 0x8e, 0x25, 0x4a, 0xec, 0x73, 0x7a, 0x00, 0xc0, 0x7b, 0x50, 0xe3, + 0x72, 0xb4, 0x7a, 0x3d, 0x25, 0xc1, 0xf4, 0xb9, 0x69, 0x11, 0x6e, 0x21, 0x6a, 0x99, 0x28, 0xb5, + 0x5f, 0x68, 0xb0, 0xa0, 0x90, 0x9b, 0x4a, 0xab, 0xef, 0x42, 0x9e, 0x5f, 0x69, 0x88, 0x4c, 0x67, + 0x29, 0x3c, 0x8a, 0xb3, 0xd1, 0x05, 0x0e, 0xda, 0x80, 0x02, 0xff, 0x92, 0x67, 0x80, 0x64, 0x74, + 0x89, 0x84, 0xef, 0xc1, 0xa2, 0x00, 0x91, 0x81, 0x9d, 0xb4, 0x31, 0x98, 0x31, 0xf0, 0x1f, 0xc0, + 0x52, 0x18, 0x6d, 0xaa, 0x29, 0x29, 0x42, 0x66, 0x5e, 0x47, 0xc8, 0x96, 0x14, 0xf2, 0xf9, 0xb0, + 0xa7, 0xe4, 0x51, 0xd1, 0x15, 0xa3, 0xda, 0x2b, 0x13, 0xb6, 0x57, 0x30, 0x01, 0x49, 0xe2, 0x1b, + 0x9d, 0xc0, 0x07, 0x72, 0x39, 0xec, 0x99, 0xae, 0xef, 0xc3, 0x31, 0x94, 0xfb, 0xa6, 0x45, 0x0c, + 0x47, 0xd4, 0xd9, 0x35, 0x5e, 0x67, 0x57, 0x61, 0xf8, 0x0b, 0x40, 0xea, 0xc0, 0x6f, 0x54, 0xe8, + 0xfb, 0x52, 0x65, 0x87, 0x8e, 0x3d, 0xb0, 0x53, 0xd5, 0x8e, 0xff, 0x10, 0x96, 0x23, 0x78, 0xdf, + 0xa8, 0x98, 0x8b, 0xb0, 0xb0, 0x4d, 0x64, 0x42, 0x23, 0xdd, 0xde, 0x47, 0x80, 0x54, 0xe0, 0x54, + 0x91, 0xad, 0x09, 0x0b, 0xcf, 0xec, 0x31, 0x75, 0x91, 0x14, 0x1a, 0xf8, 0x06, 0x5e, 0x87, 0xf0, + 0x55, 0xe1, 0xb7, 0x29, 0x73, 0x75, 0xc0, 0x54, 0xcc, 0xff, 0x59, 0x83, 0x72, 0xab, 0x6f, 0x38, + 0xfe, 0xf5, 0xcf, 0xf7, 0x20, 0xcf, 0x4f, 0xd7, 0xa2, 0xa0, 0x75, 0x3f, 0x4c, 0x46, 0xc5, 0xe5, + 0x8d, 0x16, 0x3f, 0x8b, 0x8b, 0x51, 0x54, 0x70, 0x71, 0x43, 0xba, 0x1d, 0xb9, 0x31, 0xdd, 0x46, + 0xef, 0x41, 0xce, 0xa0, 0x43, 0x58, 0x28, 0xaa, 0x46, 0xeb, 0x1a, 0x8c, 0x1a, 0x3b, 0x03, 0x70, + 0x2c, 0xfc, 0x1d, 0x28, 0x29, 0x1c, 0x50, 0x01, 0xb2, 0x4f, 0xda, 0x22, 0x61, 0x6f, 0x6d, 0x75, + 0x76, 0x5e, 0xf0, 0x82, 0x4e, 0x15, 0x60, 0xbb, 0xed, 0xb7, 0x33, 0xf8, 0x53, 0x31, 0x4a, 0xb8, + 0x7d, 0x55, 0x1e, 0x2d, 0x4d, 0x9e, 0xcc, 0x6b, 0xc9, 0x73, 0x01, 0x15, 0x31, 0xfd, 0x69, 0xc3, + 0x18, 0xa3, 0x97, 0x12, 0xc6, 0x14, 0xe1, 0x75, 0x81, 0x88, 0x7f, 0xa5, 0x41, 0x6d, 0xdb, 0x7e, + 0x65, 0x9d, 0x3a, 0x46, 0xcf, 0xdf, 0x27, 0x1f, 0x46, 0x2c, 0xb5, 0x11, 0xa9, 0xba, 0x46, 0xf0, + 0x03, 0x40, 0xc4, 0x62, 0xf5, 0xa0, 0x6c, 0xc8, 0x63, 0xa1, 0x6c, 0xe2, 0x0f, 0x60, 0x3e, 0x32, + 0x88, 0xea, 0xfe, 0x45, 0x6b, 0x6f, 0x67, 0x9b, 0xea, 0x9a, 0x15, 0xd6, 0xda, 0xfb, 0xad, 0xc7, + 0x7b, 0x6d, 0x71, 0xdd, 0xd8, 0xda, 0xdf, 0x6a, 0xef, 0xd5, 0x32, 0xb8, 0x0b, 0x0b, 0x0a, 0xfb, + 0x69, 0x2f, 0x32, 0x52, 0xa4, 0x9b, 0x87, 0x8a, 0x88, 0xf6, 0x62, 0x53, 0xfe, 0x53, 0x06, 0xaa, + 0x12, 0xf2, 0x66, 0x78, 0xa2, 0x15, 0xc8, 0xf7, 0x4e, 0xd8, 0xcd, 0x19, 0xcf, 0xa6, 0x44, 0x8b, + 0xc2, 0xfb, 0x9c, 0x0f, 0xbf, 0xec, 0x17, 0x2d, 0x1a, 0xc6, 0x1d, 0xe3, 0xa5, 0xb7, 0x63, 0xf5, + 0xc8, 0x05, 0x4b, 0x0a, 0x66, 0xf5, 0x00, 0xc0, 0x2a, 0x4c, 0xe2, 0x51, 0x00, 0x3b, 0x59, 0x29, + 0x8f, 0x04, 0xd0, 0x03, 0xa8, 0xd1, 0xef, 0xd6, 0x70, 0xd8, 0x37, 0x49, 0x8f, 0x13, 0x28, 0x30, + 0x9c, 0x18, 0x9c, 0x72, 0x67, 0x67, 0x11, 0xb7, 0x3e, 0xc7, 0xc2, 0x92, 0x68, 0xa1, 0x35, 0x28, + 0x71, 0xf9, 0x76, 0xac, 0xe7, 0x2e, 0x61, 0x37, 0xe5, 0x59, 0x5d, 0x05, 0x85, 0xd3, 0x0c, 0x88, + 0xa6, 0x19, 0x8b, 0xb0, 0xd0, 0x1a, 0x79, 0x67, 0x6d, 0x8b, 0xc6, 0x0a, 0xa9, 0xe5, 0x25, 0x40, + 0x14, 0xb8, 0x6d, 0xba, 0x2a, 0x54, 0xa0, 0x86, 0x0d, 0xd2, 0x86, 0x45, 0x0a, 0x24, 0x96, 0x67, + 0x76, 0x95, 0xb8, 0x2a, 0x33, 0x2f, 0x2d, 0x92, 0x79, 0x19, 0xae, 0xfb, 0xca, 0x76, 0x7a, 0x42, + 0xe7, 0x7e, 0x1b, 0xff, 0x8d, 0xc6, 0x59, 0x3e, 0x77, 0x43, 0xe9, 0xd3, 0xaf, 0x49, 0x06, 0xbd, + 0x0f, 0x05, 0x7b, 0xc8, 0xde, 0x83, 0x88, 0x32, 0xcc, 0xca, 0x06, 0x7f, 0x41, 0xb2, 0x21, 0x08, + 0x1f, 0xf0, 0x5e, 0x5d, 0xa2, 0xa1, 0xfb, 0x50, 0x3d, 0x33, 0xdc, 0x33, 0xd2, 0x3b, 0x94, 0x34, + 0xf9, 0xc9, 0x2f, 0x02, 0xc5, 0xeb, 0x81, 0x7c, 0x4f, 0x88, 0x37, 0x41, 0x3e, 0xfc, 0x10, 0x96, + 0x25, 0xa6, 0xb8, 0xf6, 0x98, 0x80, 0xfc, 0x0a, 0x6e, 0x49, 0xe4, 0xad, 0x33, 0xc3, 0x3a, 0x25, + 0x92, 0xe1, 0x57, 0xd5, 0x40, 0x7c, 0x3e, 0xd9, 0xc4, 0xf9, 0x3c, 0x86, 0xba, 0x3f, 0x1f, 0x76, + 0xb2, 0xb6, 0xfb, 0xaa, 0xa0, 0x23, 0x57, 0xec, 0xa7, 0xa2, 0xce, 0xbe, 0x29, 0xcc, 0xb1, 0xfb, + 0x7e, 0x2a, 0x4d, 0xbf, 0xf1, 0x16, 0x5c, 0x97, 0x34, 0xc4, 0x99, 0x37, 0x4c, 0x24, 0x26, 0x78, + 0x12, 0x11, 0xa1, 0x58, 0x3a, 0x74, 0xb2, 0xe1, 0x55, 0xcc, 0xb0, 0x09, 0x18, 0x4d, 0x4d, 0xa1, + 0xb9, 0xcc, 0x17, 0x25, 0x15, 0x4c, 0xc9, 0x96, 0x24, 0x98, 0x12, 0x50, 0xc1, 0xc2, 0x60, 0x14, + 0x1c, 0x33, 0x58, 0x8c, 0xf4, 0x0f, 0x60, 0xd5, 0x17, 0x82, 0xea, 0xed, 0x90, 0x38, 0x03, 0xd3, + 0x75, 0x95, 0xba, 0x77, 0xd2, 0xc4, 0xef, 0xc3, 0xec, 0x90, 0x88, 0x20, 0x54, 0xda, 0x44, 0x72, + 0x51, 0x2a, 0x83, 0x59, 0x3f, 0xee, 0xc1, 0x6d, 0x49, 0x9d, 0x6b, 0x34, 0x91, 0x7c, 0x54, 0x28, + 0x59, 0x0d, 0xcc, 0xa4, 0x54, 0x03, 0xb3, 0x91, 0xbb, 0x98, 0x8f, 0xb8, 0x22, 0xe5, 0x9e, 0x9f, + 0x2a, 0xb9, 0xd8, 0xe5, 0x3a, 0xf5, 0x5d, 0xc5, 0x54, 0xc4, 0xfe, 0x54, 0x78, 0x81, 0xaf, 0xcb, + 0xc3, 0x13, 0x36, 0x43, 0x79, 0xd1, 0x21, 0x9b, 0x34, 0x6b, 0xa6, 0x06, 0xd0, 0xd5, 0x5a, 0xe8, + 0xac, 0x1e, 0x82, 0xe1, 0x13, 0x58, 0x0a, 0xfb, 0xb5, 0xa9, 0x64, 0x59, 0x82, 0x9c, 0x67, 0x9f, + 0x13, 0x19, 0x6b, 0x78, 0x43, 0xea, 0xce, 0xf7, 0x79, 0x53, 0xe9, 0xce, 0x08, 0x88, 0xb1, 0xdd, + 0x31, 0xad, 0xbc, 0x74, 0x61, 0xc9, 0x33, 0x10, 0x6f, 0xe0, 0x7d, 0x58, 0x89, 0x7a, 0xb6, 0xa9, + 0x44, 0x7e, 0xc1, 0xf7, 0x52, 0x92, 0xf3, 0x9b, 0x8a, 0xee, 0xc7, 0x81, 0x5f, 0x52, 0x7c, 0xdb, + 0x54, 0x24, 0x75, 0x68, 0x24, 0xb9, 0xba, 0xaf, 0x63, 0xeb, 0xf8, 0x9e, 0x6f, 0x2a, 0x62, 0x6e, + 0x40, 0x6c, 0x7a, 0xf3, 0x07, 0xee, 0x2a, 0x3b, 0xd1, 0x5d, 0x89, 0x4d, 0x12, 0x38, 0xd4, 0x37, + 0xb0, 0xe8, 0x04, 0x8f, 0xc0, 0x97, 0x4f, 0xcb, 0x83, 0x86, 0x33, 0x9f, 0x07, 0x6b, 0xc8, 0x85, + 0xad, 0x46, 0x80, 0xa9, 0x8c, 0xf1, 0x49, 0xe0, 0xc6, 0x63, 0x41, 0x62, 0x2a, 0xc2, 0x9f, 0xc2, + 0x5a, 0x7a, 0x7c, 0x98, 0x86, 0xf2, 0x83, 0x26, 0x14, 0xfd, 0xc3, 0x90, 0xf2, 0x3a, 0xb1, 0x04, + 0x85, 0xfd, 0x83, 0xa3, 0xc3, 0xd6, 0x56, 0x9b, 0x3f, 0x4f, 0xdc, 0x3a, 0xd0, 0xf5, 0xe7, 0x87, + 0x9d, 0x5a, 0x66, 0xf3, 0xdf, 0x67, 0x21, 0xb3, 0xfb, 0x02, 0x7d, 0x06, 0x39, 0xfe, 0xac, 0x63, + 0xc2, 0x0b, 0xa1, 0xc6, 0xa4, 0x97, 0x2b, 0xf8, 0xda, 0x8f, 0xff, 0xed, 0xbf, 0x7e, 0x9e, 0x59, + 0xc0, 0xe5, 0xe6, 0xf8, 0xdb, 0xcd, 0xf3, 0x71, 0x93, 0x85, 0xa9, 0x47, 0xda, 0x03, 0xe4, 0x42, + 0x49, 0x79, 0x9e, 0x81, 0xae, 0x7c, 0x68, 0xd3, 0xb8, 0xfa, 0xe9, 0x07, 0xbe, 0xc5, 0x98, 0x5d, + 0xc3, 0x48, 0x65, 0xc6, 0xdf, 0x8f, 0x3c, 0xd2, 0x1e, 0xbc, 0xaf, 0xa1, 0x8f, 0x21, 0x7b, 0x38, + 0xf2, 0x50, 0xea, 0x73, 0xa5, 0x46, 0xfa, 0x0b, 0x1a, 0xbc, 0xcc, 0x88, 0xcf, 0x63, 0x10, 0xc4, + 0x87, 0x23, 0x8f, 0xce, 0xe3, 0x87, 0x50, 0x52, 0xdf, 0xbf, 0x5c, 0xf9, 0x86, 0xa9, 0x71, 0xf5, + 0xdb, 0x9a, 0xd8, 0x3c, 0xf8, 0x0b, 0x1d, 0x5f, 0x75, 0x1f, 0x43, 0xb6, 0x73, 0x61, 0xa1, 0xd4, + 0x17, 0x4e, 0x8d, 0xf4, 0xe7, 0x36, 0xb1, 0x59, 0x78, 0x17, 0x16, 0x25, 0xf9, 0x7b, 0xe2, 0x41, + 0x4c, 0xd7, 0x43, 0xb7, 0x13, 0x1e, 0x44, 0xa8, 0x57, 0xff, 0x8d, 0xb5, 0x74, 0x04, 0xc1, 0xe4, + 0x26, 0x63, 0xb2, 0x82, 0x17, 0x04, 0x93, 0xae, 0x8f, 0xf2, 0x48, 0x7b, 0xb0, 0xd9, 0x85, 0x1c, + 0xbb, 0x56, 0x43, 0x9f, 0xcb, 0x8f, 0x46, 0xc2, 0xfd, 0x62, 0xca, 0xea, 0x0a, 0x5d, 0xc8, 0xe1, + 0x25, 0xc6, 0xa8, 0x8a, 0x8b, 0x94, 0x11, 0xbb, 0x54, 0x7b, 0xa4, 0x3d, 0x58, 0xd7, 0xde, 0xd7, + 0x36, 0x7f, 0x95, 0x83, 0x1c, 0xab, 0x27, 0xa3, 0x73, 0x80, 0xe0, 0x8a, 0x29, 0x3a, 0xbb, 0xd8, + 0xa5, 0x55, 0x74, 0x76, 0xf1, 0xdb, 0x29, 0xdc, 0x60, 0x4c, 0x97, 0xf0, 0x3c, 0x65, 0xca, 0xca, + 0xd4, 0x4d, 0x56, 0x79, 0xa7, 0x7a, 0xfc, 0x33, 0x4d, 0x94, 0xd3, 0xf9, 0x06, 0x46, 0x49, 0xd4, + 0x42, 0xf7, 0x4c, 0xd1, 0xe5, 0x90, 0x70, 0xc7, 0x84, 0xbf, 0xcb, 0x18, 0x36, 0x71, 0x2d, 0x60, + 0xe8, 0x30, 0x8c, 0x47, 0xda, 0x83, 0xcf, 0xeb, 0x78, 0x51, 0x68, 0x39, 0xd2, 0x83, 0x7e, 0x04, + 0xd5, 0xf0, 0x3d, 0x0a, 0xba, 0x9b, 0xc0, 0x2b, 0x7a, 0x1d, 0xd3, 0x78, 0x6b, 0x32, 0x92, 0x90, + 0x69, 0x95, 0xc9, 0x24, 0x98, 0x73, 0xce, 0xe7, 0x84, 0x0c, 0x0d, 0x8a, 0x24, 0x6c, 0x80, 0xfe, + 0x5a, 0x13, 0xd7, 0x5c, 0xc1, 0xc5, 0x08, 0x4a, 0xa2, 0x1e, 0xbb, 0x76, 0x69, 0xdc, 0xbb, 0x02, + 0x4b, 0x08, 0xf1, 0xdb, 0x4c, 0x88, 0x0f, 0xf0, 0x52, 0x20, 0x84, 0x67, 0x0e, 0x88, 0x67, 0x0b, + 0x29, 0x3e, 0xbf, 0x89, 0xaf, 0x85, 0x94, 0x13, 0xea, 0x0d, 0x8c, 0xc5, 0x2f, 0x37, 0x12, 0x8d, + 0x15, 0xba, 0x2c, 0x49, 0x34, 0x56, 0xf8, 0x66, 0x24, 0xc9, 0x58, 0xfc, 0x2a, 0x23, 0xc9, 0x58, + 0x7e, 0xcf, 0xe6, 0xff, 0xcc, 0x42, 0x61, 0x8b, 0xff, 0x6c, 0x01, 0xd9, 0x50, 0xf4, 0xef, 0x06, + 0xd0, 0x6a, 0x52, 0x71, 0x33, 0x38, 0x4b, 0x35, 0x6e, 0xa7, 0xf6, 0x0b, 0x81, 0xee, 0x30, 0x81, + 0x6e, 0xe0, 0x15, 0xca, 0x59, 0xfc, 0x32, 0xa2, 0xc9, 0x2b, 0x68, 0x4d, 0xa3, 0xd7, 0xa3, 0x8a, + 0xf8, 0x7d, 0x28, 0xab, 0xc5, 0x7b, 0x74, 0x27, 0xb1, 0xa0, 0xaa, 0xd6, 0xff, 0x1b, 0x78, 0x12, + 0x8a, 0xe0, 0xfc, 0x16, 0xe3, 0xbc, 0x8a, 0xaf, 0x27, 0x70, 0x76, 0x18, 0x6a, 0x88, 0x39, 0x2f, + 0xbc, 0x27, 0x33, 0x0f, 0xd5, 0xf5, 0x93, 0x99, 0x87, 0xeb, 0xf6, 0x13, 0x99, 0x8f, 0x18, 0x2a, + 0x8f, 0x42, 0x10, 0x94, 0xcf, 0x51, 0xa2, 0x2e, 0x95, 0xc3, 0x64, 0xd4, 0x39, 0xc4, 0x2b, 0xef, + 0x18, 0x33, 0xb6, 0x62, 0xdd, 0x45, 0xd8, 0xf6, 0x4d, 0xd7, 0xe3, 0x1b, 0xb3, 0x12, 0xaa, 0x87, + 0xa3, 0xc4, 0xf9, 0x84, 0x8b, 0xea, 0x8d, 0xbb, 0x13, 0x71, 0x04, 0xf7, 0x7b, 0x8c, 0xfb, 0x6d, + 0xdc, 0x48, 0xe0, 0x3e, 0xe4, 0xb8, 0x74, 0xb1, 0xfd, 0x6f, 0x1e, 0x4a, 0xcf, 0x0c, 0xd3, 0xf2, + 0x88, 0x65, 0x58, 0x5d, 0x82, 0x4e, 0x20, 0xc7, 0xd2, 0x83, 0xa8, 0x23, 0x56, 0x6b, 0xc5, 0x51, + 0x47, 0x1c, 0x2a, 0xa4, 0xe2, 0x35, 0xc6, 0xb8, 0x81, 0x97, 0x29, 0xe3, 0x41, 0x40, 0xba, 0xc9, + 0xea, 0x9f, 0x74, 0xd2, 0x2f, 0x21, 0x2f, 0xae, 0x18, 0x23, 0x84, 0x42, 0x15, 0xa7, 0xc6, 0xcd, + 0xe4, 0xce, 0xa4, 0xb5, 0xac, 0xb2, 0x71, 0x19, 0x1e, 0xe5, 0x33, 0x06, 0x08, 0x0a, 0xfb, 0x51, + 0x8b, 0xc6, 0xee, 0x01, 0x1a, 0x6b, 0xe9, 0x08, 0x49, 0x3a, 0x55, 0x79, 0xf6, 0x7c, 0x5c, 0xca, + 0xf7, 0x77, 0x61, 0xf6, 0xa9, 0xe1, 0x9e, 0xa1, 0x48, 0xec, 0x55, 0x1e, 0xa8, 0x35, 0x1a, 0x49, + 0x5d, 0x82, 0xcb, 0x6d, 0xc6, 0xe5, 0x3a, 0x77, 0x65, 0x2a, 0x97, 0x33, 0xc3, 0xa5, 0x41, 0x0d, + 0xf5, 0x20, 0xcf, 0xdf, 0xab, 0x45, 0xf5, 0x17, 0x7a, 0xf3, 0x16, 0xd5, 0x5f, 0xf8, 0x89, 0xdb, + 0xd5, 0x5c, 0x86, 0x30, 0x27, 0x1f, 0x88, 0xa1, 0xc8, 0x6b, 0x81, 0xc8, 0x63, 0xb2, 0xc6, 0x6a, + 0x5a, 0xb7, 0xe0, 0x75, 0x97, 0xf1, 0xba, 0x85, 0xeb, 0x31, 0x5b, 0x09, 0x4c, 0x9e, 0x92, 0xfd, + 0x08, 0x20, 0xb8, 0x0b, 0x89, 0xed, 0xc0, 0xe8, 0xb5, 0x4a, 0x6c, 0x07, 0xc6, 0xae, 0x51, 0xf0, + 0x06, 0xe3, 0xbb, 0x8e, 0xef, 0x46, 0xf9, 0x7a, 0x8e, 0x61, 0xb9, 0x2f, 0x89, 0xf3, 0x1e, 0x2f, + 0xed, 0xba, 0x67, 0xe6, 0x90, 0x4e, 0xd9, 0x81, 0xa2, 0x5f, 0xea, 0x8e, 0x7a, 0xdb, 0x68, 0x09, + 0x3e, 0xea, 0x6d, 0x63, 0x35, 0xf2, 0xb0, 0xdb, 0x09, 0xad, 0x16, 0x89, 0x4a, 0x37, 0xe0, 0x2f, + 0x6a, 0x30, 0x4b, 0x53, 0x7d, 0x9a, 0x9c, 0x04, 0xc5, 0x9a, 0xe8, 0xec, 0x63, 0xa5, 0xdb, 0xe8, + 0xec, 0xe3, 0x75, 0x9e, 0x70, 0x72, 0xc2, 0x7e, 0x64, 0xc7, 0xeb, 0x22, 0x74, 0xa6, 0x36, 0x94, + 0x94, 0x6a, 0x0e, 0x4a, 0x20, 0x16, 0xae, 0x09, 0x47, 0xc3, 0x5d, 0x42, 0x29, 0x08, 0xdf, 0x60, + 0xfc, 0x96, 0x79, 0xb8, 0x63, 0xfc, 0x7a, 0x1c, 0x83, 0x32, 0x14, 0xb3, 0x13, 0xfb, 0x3e, 0x61, + 0x76, 0xe1, 0xbd, 0xbf, 0x96, 0x8e, 0x90, 0x3a, 0xbb, 0x60, 0xe3, 0xbf, 0x82, 0xb2, 0x5a, 0xd3, + 0x41, 0x09, 0xc2, 0x47, 0xea, 0xd8, 0xd1, 0x38, 0x92, 0x54, 0x12, 0x0a, 0x7b, 0x36, 0xff, 0x57, + 0x8b, 0x12, 0x8d, 0x32, 0xee, 0x43, 0x41, 0x14, 0x79, 0x92, 0x54, 0x1a, 0xae, 0x79, 0x27, 0xa9, + 0x34, 0x52, 0x21, 0x0a, 0x67, 0xcf, 0x8c, 0x23, 0x3d, 0xc7, 0xca, 0x58, 0x2d, 0xb8, 0x3d, 0x21, + 0x5e, 0x1a, 0xb7, 0xa0, 0x7c, 0x9a, 0xc6, 0x4d, 0xa9, 0x21, 0xa4, 0x71, 0x3b, 0x25, 0x9e, 0xf0, + 0x07, 0xf2, 0x6c, 0x8e, 0x52, 0x88, 0xa9, 0xf1, 0x11, 0x4f, 0x42, 0x49, 0x3a, 0xdc, 0x04, 0x0c, + 0x65, 0x70, 0xbc, 0x00, 0x08, 0x4a, 0x50, 0xd1, 0x8c, 0x35, 0xb1, 0xf4, 0x1e, 0xcd, 0x58, 0x93, + 0xab, 0x58, 0x61, 0xdf, 0x17, 0xf0, 0xe5, 0x67, 0x2b, 0xca, 0xf9, 0x67, 0x1a, 0xa0, 0x78, 0xb5, + 0x0a, 0x3d, 0x4c, 0xa6, 0x9e, 0x58, 0xd0, 0x6f, 0xbc, 0xfb, 0x7a, 0xc8, 0x49, 0xe1, 0x2c, 0x10, + 0xa9, 0xcb, 0xb0, 0x87, 0xaf, 0xa8, 0x50, 0x7f, 0xac, 0x41, 0x25, 0x54, 0xea, 0x42, 0xf7, 0x53, + 0x6c, 0x1a, 0xa9, 0xf3, 0x37, 0xde, 0xbe, 0x12, 0x2f, 0x29, 0x95, 0x57, 0x56, 0x80, 0x3c, 0xd3, + 0xfc, 0x44, 0x83, 0x6a, 0xb8, 0x34, 0x86, 0x52, 0x68, 0xc7, 0xee, 0x09, 0x1a, 0xeb, 0x57, 0x23, + 0x4e, 0x36, 0x4f, 0x70, 0x9c, 0xe9, 0x43, 0x41, 0x14, 0xd3, 0x92, 0x16, 0x7e, 0xf8, 0x86, 0x21, + 0x69, 0xe1, 0x47, 0x2a, 0x71, 0x09, 0x0b, 0xdf, 0xb1, 0xfb, 0x44, 0xd9, 0x66, 0xa2, 0xda, 0x96, + 0xc6, 0x6d, 0xf2, 0x36, 0x8b, 0x94, 0xea, 0xd2, 0xb8, 0x05, 0xdb, 0x4c, 0x96, 0xd9, 0x50, 0x0a, + 0xb1, 0x2b, 0xb6, 0x59, 0xb4, 0x4a, 0x97, 0xb0, 0xcd, 0x18, 0x43, 0x65, 0x9b, 0x05, 0x05, 0xb1, + 0xa4, 0x6d, 0x16, 0xbb, 0x30, 0x49, 0xda, 0x66, 0xf1, 0x9a, 0x5a, 0x82, 0x1d, 0x19, 0xdf, 0xd0, + 0x36, 0x5b, 0x4c, 0xa8, 0x9d, 0xa1, 0x77, 0x53, 0x94, 0x98, 0x78, 0x0f, 0xd3, 0x78, 0xef, 0x35, + 0xb1, 0x53, 0xd7, 0x38, 0x57, 0xbf, 0x5c, 0xe3, 0x7f, 0xa1, 0xc1, 0x52, 0x52, 0xdd, 0x0d, 0xa5, + 0xf0, 0x49, 0xb9, 0xbf, 0x69, 0x6c, 0xbc, 0x2e, 0xfa, 0x64, 0x6d, 0xf9, 0xab, 0xfe, 0x71, 0xed, + 0x1f, 0xbf, 0x5c, 0xd5, 0xfe, 0xe5, 0xcb, 0x55, 0xed, 0x3f, 0xbe, 0x5c, 0xd5, 0xfe, 0xf2, 0x3f, + 0x57, 0x67, 0x4e, 0xf2, 0xec, 0xb7, 0xf0, 0xdf, 0xfe, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8e, + 0xc3, 0xac, 0xe6, 0x92, 0x3f, 0x00, 0x00, } diff --git a/etcdserver/etcdserverpb/rpc.proto b/etcdserver/etcdserverpb/rpc.proto index 1c27bafae11..20ab3160366 100644 --- a/etcdserver/etcdserverpb/rpc.proto +++ b/etcdserver/etcdserverpb/rpc.proto @@ -20,6 +20,14 @@ service KV { }; } + // RangeStream gets the keys in the range stream from the key-value store. + rpc RangeStream(RangeStreamRequest) returns (stream RangeStreamResponse) { + option (google.api.http) = { + post: "/v3/kv/rangestream" + body: "*" + }; + } + // Put puts the given key into the key-value store. // A put request increments the revision of the key-value store // and generates one event in the event history. @@ -466,6 +474,35 @@ message RangeRequest { int64 max_create_revision = 13; } +message RangeStreamRequest { + // key is the first key for the range. If range_end is not given, the request only looks up key. + bytes key = 1; + // range_end is the upper bound on the requested range [key, range_end). + // If range_end is '\0', the range is all keys >= key. + // If range_end is key plus one (e.g., "aa"+1 == "ab", "a\xff"+1 == "b"), + // then the range request gets all keys prefixed with key. + // If both key and range_end are '\0', then the range request returns all keys. + bytes range_end = 2; + // limit is a limit on the number of keys returned for the request. When limit is set to 0, + // it is treated as no limit. + int64 limit = 3; + // revision is the point-in-time of the key-value store to use for the range. + // If revision is less or equal to zero, the range is over the newest key-value store. + // If the revision has been compacted, ErrCompacted is returned as a response. + int64 revision = 4; + + // serializable sets the range request to use serializable member-local reads. + // Range requests are linearizable by default; linearizable requests have higher + // latency and lower throughput than serializable requests but reflect the current + // consensus of the cluster. For better performance, in exchange for possible stale reads, + // a serializable range request is served locally without needing to reach consensus + // with other nodes in the cluster. + bool serializable = 7; + + // keys_only when set returns only the keys and not the values. + bool keys_only = 8; +} + message RangeResponse { ResponseHeader header = 1; // kvs is the list of key-value pairs matched by the range request. @@ -477,6 +514,19 @@ message RangeResponse { int64 count = 4; } +message RangeStreamResponse { + ResponseHeader header = 1; + // kvs is the list of key-value pairs matched by the range request. + // kvs is empty when count is requested. + repeated mvccpb.KeyValue kvs = 2; + // count is set to the number of keys within the range when requested. + int64 count = 4; + + int64 totalCount = 5; + + int64 totalSize = 6; +} + message PutRequest { // key is the key, in bytes, to put into the key-value store. bytes key = 1; @@ -535,6 +585,7 @@ message RequestOp { PutRequest request_put = 2; DeleteRangeRequest request_delete_range = 3; TxnRequest request_txn = 4; + RangeStreamRequest request_range_stream = 5; } } @@ -545,6 +596,7 @@ message ResponseOp { PutResponse response_put = 2; DeleteRangeResponse response_delete_range = 3; TxnResponse response_txn = 4; + RangeStreamResponse response_range_stream = 5; } } diff --git a/etcdserver/util.go b/etcdserver/util.go index 9c71280974e..6354ce97448 100644 --- a/etcdserver/util.go +++ b/etcdserver/util.go @@ -152,6 +152,14 @@ func warnOfExpensiveReadOnlyRangeRequest(lg *zap.Logger, now time.Time, reqStrin warnOfExpensiveGenericRequest(lg, now, reqStringer, "read-only range ", resp, err) } +func warnOfExpensiveReadOnlyRangeStreamRequest(lg *zap.Logger, now time.Time, reqStringer fmt.Stringer, rangeStreamResponse *pb.RangeStreamResponse, err error) { + var resp string + if !isNil(rangeStreamResponse) { + resp = fmt.Sprintf("range_stream_response_total_count:%d, size:%d", rangeStreamResponse.GetTotalCount(), rangeStreamResponse.GetTotalSize()) + } + warnOfExpensiveGenericRequest(lg, now, reqStringer, "read-only rangeStream ", resp, err) +} + func warnOfExpensiveGenericRequest(lg *zap.Logger, now time.Time, reqStringer fmt.Stringer, prefix string, resp string, err error) { d := time.Since(now) if d > warnApplyDuration { diff --git a/etcdserver/v3_server.go b/etcdserver/v3_server.go index e96f9660d44..9c29e78c70e 100644 --- a/etcdserver/v3_server.go +++ b/etcdserver/v3_server.go @@ -47,6 +47,7 @@ const ( type RaftKV interface { Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeResponse, error) + RangeStream(ctx context.Context, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse) error Put(ctx context.Context, r *pb.PutRequest) (*pb.PutResponse, error) DeleteRange(ctx context.Context, r *pb.DeleteRangeRequest) (*pb.DeleteRangeResponse, error) Txn(ctx context.Context, r *pb.TxnRequest) (*pb.TxnResponse, error) @@ -130,6 +131,47 @@ func (s *EtcdServer) Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeRe return resp, err } +func (s *EtcdServer) RangeStream(ctx context.Context, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse) error { + trace := traceutil.New("rangeStream", + s.getLogger(), + traceutil.Field{Key: "range_begin", Value: string(r.Key)}, + traceutil.Field{Key: "range_end", Value: string(r.RangeEnd)}, + ) + + ctx = context.WithValue(ctx, traceutil.TraceKey, trace) + + var resp *pb.RangeStreamResponse + var err error + defer func(start time.Time) { + warnOfExpensiveReadOnlyRangeStreamRequest(s.getLogger(), start, r, resp, err) + if resp != nil { + trace.AddField( + traceutil.Field{Key: "response_total_count", Value: resp.GetTotalCount}, + traceutil.Field{Key: "response_revision", Value: resp.Header.Revision}, + ) + } + trace.LogIfLong(traceThreshold) + }(time.Now()) + + if !r.Serializable { + err = s.linearizableReadNotify(ctx) + trace.Step("agreement among raft nodes before linearized reading") + if err != nil { + return err + } + } + chk := func(ai *auth.AuthInfo) error { + return s.authStore.IsRangePermitted(ai, r.Key, r.RangeEnd) + } + + get := func() { resp, err = s.applyV3Base.RangeStream(ctx, nil, r, rspC) } + if serr := s.doSerialize(ctx, chk, get); serr != nil { + err = serr + return err + } + return err +} + func (s *EtcdServer) Put(ctx context.Context, r *pb.PutRequest) (*pb.PutResponse, error) { ctx = context.WithValue(ctx, traceutil.StartTimeKey, time.Now()) resp, err := s.raftRequest(ctx, pb.InternalRaftRequest{Put: r}) diff --git a/mvcc/kv.go b/mvcc/kv.go index e26d8a63791..218a376eb5d 100644 --- a/mvcc/kv.go +++ b/mvcc/kv.go @@ -31,6 +31,7 @@ type RangeResult struct { KVs []mvccpb.KeyValue Rev int64 Count int + Err error } type ReadView interface { @@ -51,6 +52,8 @@ type ReadView interface { // Limit limits the number of keys returned. // If the required rev is compacted, ErrCompacted will be returned. Range(key, end []byte, ro RangeOptions) (r *RangeResult, err error) + + RangeStream(key, end []byte, ro RangeOptions, streamC chan *RangeResult) (err error) } // TxnRead represents a read-only transaction with operations that will not diff --git a/mvcc/kv_view.go b/mvcc/kv_view.go index 795316a2825..eedd2c9ec32 100644 --- a/mvcc/kv_view.go +++ b/mvcc/kv_view.go @@ -39,6 +39,12 @@ func (rv *readView) Range(key, end []byte, ro RangeOptions) (r *RangeResult, err return tr.Range(key, end, ro) } +func (rv *readView) RangeStream(key, end []byte, ro RangeOptions, streamC chan *RangeResult) (err error) { + tr := rv.kv.Read(traceutil.TODO()) + defer tr.End() + return tr.RangeStream(key, end, ro, streamC) +} + type writeView struct{ kv KV } func (wv *writeView) DeleteRange(key, end []byte) (n, rev int64) { diff --git a/mvcc/kvstore_txn.go b/mvcc/kvstore_txn.go index 28e39d0c650..e7d321b0e42 100644 --- a/mvcc/kvstore_txn.go +++ b/mvcc/kvstore_txn.go @@ -22,6 +22,8 @@ import ( "go.uber.org/zap" ) +const RangeStreamBatch int = 1000 + type storeTxnRead struct { s *store tx backend.ReadTx @@ -51,6 +53,10 @@ func (tr *storeTxnRead) Range(key, end []byte, ro RangeOptions) (r *RangeResult, return tr.rangeKeys(key, end, tr.Rev(), ro) } +func (tr *storeTxnRead) RangeStream(key, end []byte, ro RangeOptions, streamC chan *RangeResult) (err error) { + return tr.rangeStreamKeys(key, end, tr.Rev(), ro, streamC) +} + func (tr *storeTxnRead) End() { tr.tx.RUnlock() // RUnlock signals the end of concurrentReadTx. tr.s.mu.RUnlock() @@ -87,6 +93,14 @@ func (tw *storeTxnWrite) Range(key, end []byte, ro RangeOptions) (r *RangeResult return tw.rangeKeys(key, end, rev, ro) } +func (tw *storeTxnWrite) RangeStream(key, end []byte, ro RangeOptions, streamC chan *RangeResult) (err error) { + rev := tw.beginRev + if len(tw.changes) > 0 { + rev++ + } + return tw.rangeStreamKeys(key, end, rev, ro, streamC) +} + func (tw *storeTxnWrite) DeleteRange(key, end []byte) (int64, int64) { if n := tw.deleteRange(key, end); n != 0 || len(tw.changes) > 0 { return n, tw.beginRev + 1 @@ -164,6 +178,80 @@ func (tr *storeTxnRead) rangeKeys(key, end []byte, curRev int64, ro RangeOptions return &RangeResult{KVs: kvs, Count: len(revpairs), Rev: curRev}, nil } +func (tr *storeTxnRead) rangeStreamKeys(key, end []byte, curRev int64, ro RangeOptions, streamC chan *RangeResult) error { + defer close(streamC) + + rev := ro.Rev + if rev > curRev { + streamC <- &RangeResult{KVs: nil, Count: -1, Rev: curRev, Err: ErrFutureRev} + return ErrFutureRev + } + if rev <= 0 { + rev = curRev + } + if rev < tr.s.compactMainRev { + streamC <- &RangeResult{KVs: nil, Count: -1, Rev: 0, Err: ErrCompacted} + return ErrCompacted + } + revpairs := tr.s.kvindex.Revisions(key, end, rev, int(ro.Limit)) + tr.trace.Step("range keys from in-memory index tree") + if len(revpairs) == 0 { + streamC <- &RangeResult{KVs: nil, Count: 0, Rev: curRev} + return nil + } + + limit := int(ro.Limit) + if limit <= 0 || limit > len(revpairs) { + limit = len(revpairs) + } + + var kvsLen int + totalRevpairsCount := len(revpairs) + + if limit <= RangeStreamBatch { + kvsLen = limit + } else { + kvsLen = RangeStreamBatch + limit -= RangeStreamBatch + } + kvs := make([]mvccpb.KeyValue, kvsLen) + + revBytes := newRevBytes() + for i, revpair := range revpairs { + revToBytes(revpair, revBytes) + _, vs := tr.tx.UnsafeRange(keyBucketName, revBytes, nil, 0) + if len(vs) != 1 { + tr.s.lg.Fatal( + "range failed to find revision pair", + zap.Int64("revision-main", revpair.main), + zap.Int64("revision-sub", revpair.sub), + ) + } + if err := kvs[i%RangeStreamBatch].Unmarshal(vs[0]); err != nil { + tr.s.lg.Fatal( + "failed to unmarshal mvccpb.KeyValue", + zap.Error(err), + ) + } + if (i+1)%RangeStreamBatch == 0 && (i+1) != totalRevpairsCount { + streamC <- &RangeResult{KVs: kvs, Count: RangeStreamBatch, Rev: curRev} + + if limit <= RangeStreamBatch { + kvsLen = limit + } else { + kvsLen = RangeStreamBatch + limit -= RangeStreamBatch + } + kvs = make([]mvccpb.KeyValue, kvsLen) + } + } + + tr.trace.Step("range keys from bolt db") + streamC <- &RangeResult{KVs: kvs, Count: kvsLen, Rev: curRev} + + return nil +} + func (tw *storeTxnWrite) put(key, value []byte, leaseID lease.LeaseID) { rev := tw.beginRev + 1 c := rev diff --git a/mvcc/metrics_txn.go b/mvcc/metrics_txn.go index 89f9297ec43..2837d97cd04 100644 --- a/mvcc/metrics_txn.go +++ b/mvcc/metrics_txn.go @@ -18,18 +18,19 @@ import "go.etcd.io/etcd/v3/lease" type metricsTxnWrite struct { TxnWrite - ranges uint - puts uint - deletes uint - putSize int64 + ranges uint + puts uint + deletes uint + putSize int64 + rangeStreams uint } func newMetricsTxnRead(tr TxnRead) TxnRead { - return &metricsTxnWrite{&txnReadWrite{tr}, 0, 0, 0, 0} + return &metricsTxnWrite{&txnReadWrite{tr}, 0, 0, 0, 0, 0} } func newMetricsTxnWrite(tw TxnWrite) TxnWrite { - return &metricsTxnWrite{tw, 0, 0, 0, 0} + return &metricsTxnWrite{tw, 0, 0, 0, 0, 0} } func (tw *metricsTxnWrite) Range(key, end []byte, ro RangeOptions) (*RangeResult, error) { @@ -37,6 +38,11 @@ func (tw *metricsTxnWrite) Range(key, end []byte, ro RangeOptions) (*RangeResult return tw.TxnWrite.Range(key, end, ro) } +func (tw *metricsTxnWrite) RangeStream(key, end []byte, ro RangeOptions, streamC chan *RangeResult) (err error) { + tw.rangeStreams++ + return tw.TxnWrite.RangeStream(key, end, ro, streamC) +} + func (tw *metricsTxnWrite) DeleteRange(key, end []byte) (n, rev int64) { tw.deletes++ return tw.TxnWrite.DeleteRange(key, end) diff --git a/pkg/mock/mockserver/mockserver.go b/pkg/mock/mockserver/mockserver.go index c68cb3c2cd2..5c86c95fea9 100644 --- a/pkg/mock/mockserver/mockserver.go +++ b/pkg/mock/mockserver/mockserver.go @@ -171,6 +171,10 @@ func (m *mockKVServer) Range(context.Context, *pb.RangeRequest) (*pb.RangeRespon return &pb.RangeResponse{}, nil } +func (m *mockKVServer) RangeStream(r *pb.RangeStreamRequest, rss pb.KV_RangeStreamServer) error { + return nil +} + func (m *mockKVServer) Put(context.Context, *pb.PutRequest) (*pb.PutResponse, error) { return &pb.PutResponse{}, nil } diff --git a/proxy/grpcproxy/adapter/kv_client_adapter.go b/proxy/grpcproxy/adapter/kv_client_adapter.go index cc08e09d08f..cce29b085bb 100644 --- a/proxy/grpcproxy/adapter/kv_client_adapter.go +++ b/proxy/grpcproxy/adapter/kv_client_adapter.go @@ -32,6 +32,13 @@ func (s *kvs2kvc) Range(ctx context.Context, in *pb.RangeRequest, opts ...grpc.C return s.kvs.Range(ctx, in) } +func (s *kvs2kvc) RangeStream(ctx context.Context, in *pb.RangeStreamRequest, opts ...grpc.CallOption) (pb.KV_RangeStreamClient, error) { + cs := newPipeStream(ctx, func(ss chanServerStream) error { + return s.kvs.RangeStream(in, (&rs2rcServerStream{ss})) + }) + return &rs2rcClientStream{cs}, nil +} + func (s *kvs2kvc) Put(ctx context.Context, in *pb.PutRequest, opts ...grpc.CallOption) (*pb.PutResponse, error) { return s.kvs.Put(ctx, in) } @@ -47,3 +54,29 @@ func (s *kvs2kvc) Txn(ctx context.Context, in *pb.TxnRequest, opts ...grpc.CallO func (s *kvs2kvc) Compact(ctx context.Context, in *pb.CompactionRequest, opts ...grpc.CallOption) (*pb.CompactionResponse, error) { return s.kvs.Compact(ctx, in) } + +type rs2rcClientStream struct{ chanClientStream } + +type rs2rcServerStream struct{ chanServerStream } + +func (s *rs2rcClientStream) Send(wr *pb.RangeStreamRequest) error { + return s.SendMsg(wr) +} +func (s *rs2rcClientStream) Recv() (*pb.RangeStreamResponse, error) { + var v interface{} + if err := s.RecvMsg(&v); err != nil { + return nil, err + } + return v.(*pb.RangeStreamResponse), nil +} + +func (s *rs2rcServerStream) Send(wr *pb.RangeStreamResponse) error { + return s.SendMsg(wr) +} +func (s *rs2rcServerStream) Recv() (*pb.RangeStreamRequest, error) { + var v interface{} + if err := s.RecvMsg(&v); err != nil { + return nil, err + } + return v.(*pb.RangeStreamRequest), nil +} diff --git a/proxy/grpcproxy/kv.go b/proxy/grpcproxy/kv.go index 7340326f53d..5a77e3dff87 100644 --- a/proxy/grpcproxy/kv.go +++ b/proxy/grpcproxy/kv.go @@ -67,6 +67,11 @@ func (p *kvProxy) Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeRespo return gresp, nil } +// TODO yxj +func (p *kvProxy) RangeStream(*pb.RangeStreamRequest, pb.KV_RangeStreamServer) error { + panic("implement me") +} + func (p *kvProxy) Put(ctx context.Context, r *pb.PutRequest) (*pb.PutResponse, error) { p.cache.Invalidate(r.Key, nil) cacheKeys.Set(float64(p.cache.Size())) From 97df43333ed98b193bfefd4c54df5dd17d6eac78 Mon Sep 17 00:00:00 2001 From: yangxuanjia Date: Sun, 27 Sep 2020 18:27:43 +0800 Subject: [PATCH 02/16] range stream --- clientv3/kv.go | 10 ++++++++-- etcdserver/api/v3rpc/key.go | 24 +++++++++++++++++++++--- etcdserver/apply.go | 31 ++++++++++++++++++++++--------- etcdserver/apply_auth.go | 4 ++-- etcdserver/corrupt.go | 2 +- etcdserver/v3_server.go | 6 +++--- mvcc/kvstore_txn.go | 7 +++---- 7 files changed, 60 insertions(+), 24 deletions(-) diff --git a/clientv3/kv.go b/clientv3/kv.go index afe0bf6c81d..cc4f45962de 100644 --- a/clientv3/kv.go +++ b/clientv3/kv.go @@ -17,6 +17,7 @@ package clientv3 import ( "context" v3rpc "go.etcd.io/etcd/v3/etcdserver/api/v3rpc/rpctypes" + "io" "time" pb "go.etcd.io/etcd/v3/etcdserver/etcdserverpb" @@ -247,11 +248,12 @@ func (kv *kv) serveRangeStream(ctx context.Context, rsc pb.KV_RangeStreamClient) go kv.handleRangeStream(ctx, rsc, rspC, errC) +Loop: for { select { case subRsp := <-rspC: if subRsp == nil { - break + break Loop } if mainRSP == nil { mainRSP = subRsp @@ -261,7 +263,7 @@ func (kv *kv) serveRangeStream(ctx context.Context, rsc pb.KV_RangeStreamClient) case err := <-errC: return nil, err case <-ctx.Done(): - break + return nil, ctx.Err() } } @@ -272,6 +274,10 @@ func (kv *kv) handleRangeStream(ctx context.Context, rsc pb.KV_RangeStreamClient for { resp, err := rsc.Recv() if err != nil { + if err == io.EOF { + break + } + select { case errC <- err: case <-ctx.Done(): diff --git a/etcdserver/api/v3rpc/key.go b/etcdserver/api/v3rpc/key.go index cd504042b8b..a315ece0783 100644 --- a/etcdserver/api/v3rpc/key.go +++ b/etcdserver/api/v3rpc/key.go @@ -17,6 +17,7 @@ package v3rpc import ( "context" + "fmt" "go.uber.org/zap" "go.etcd.io/etcd/v3/etcdserver" @@ -69,17 +70,31 @@ func (s *kvServer) RangeStream(r *pb.RangeStreamRequest, rss pb.KV_RangeStreamSe }() go func() { - err := s.kv.RangeStream(rss.Context(), r, respC) + err := s.kv.RangeStream(rss.Context(), r, respC, errC) if err != nil { - errC <- togRPCError(err) + s.lg.Error("EtcdServer RangeStream error", zap.Error(togRPCError(err))) } }() + var count int +Loop: for { select { case resp := <-respC: + if resp == nil { + fmt.Printf("RangeStream server get resp := <-respC, and resp==nil, break\n") + break Loop + } + if resp.Kvs == nil || len(resp.Kvs) == 0 { + fmt.Printf("RangeStream server get resp := <-respC, and len(resp.Kvs) == 0, break\n") + break Loop + } + s.hdr.fill(resp.Header) serr := rss.Send(resp) + count++ + fmt.Printf("rss.Send end, count: [%d], resp:[%v] \n", count, resp) + fmt.Printf("serr:[%v] \n", serr) if serr != nil { if isClientCtxErr(rss.Context().Err(), serr) { s.lg.Debug("failed to send range stream response to gRPC stream", zap.Error(serr)) @@ -90,12 +105,15 @@ func (s *kvServer) RangeStream(r *pb.RangeStreamRequest, rss pb.KV_RangeStreamSe return nil } case err := <-errC: + fmt.Printf("err := <-errC \n") return err case <-rss.Context().Done(): - break + fmt.Printf("<-rss.Context().Done() \n") + return rss.Context().Err() } } + fmt.Printf("RangeStream server finish!!!\n") return nil } diff --git a/etcdserver/apply.go b/etcdserver/apply.go index e277a059980..0bc9fbafc7d 100644 --- a/etcdserver/apply.go +++ b/etcdserver/apply.go @@ -64,7 +64,7 @@ type applierV3 interface { Put(ctx context.Context, txn mvcc.TxnWrite, p *pb.PutRequest) (*pb.PutResponse, *traceutil.Trace, error) Range(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeRequest) (*pb.RangeResponse, error) - RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse) (*pb.RangeStreamResponse, error) + RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse, errC chan error) (*pb.RangeStreamResponse, error) DeleteRange(txn mvcc.TxnWrite, dr *pb.DeleteRangeRequest) (*pb.DeleteRangeResponse, error) Txn(ctx context.Context, rt *pb.TxnRequest) (*pb.TxnResponse, *traceutil.Trace, error) Compaction(compaction *pb.CompactionRequest) (*pb.CompactionResponse, <-chan struct{}, *traceutil.Trace, error) @@ -386,7 +386,7 @@ func (a *applierV3backend) Range(ctx context.Context, txn mvcc.TxnRead, r *pb.Ra return resp, nil } -func (a *applierV3backend) RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse) (*pb.RangeStreamResponse, error) { +func (a *applierV3backend) RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse, errC chan error) (*pb.RangeStreamResponse, error) { trace := traceutil.Get(ctx) lg := a.s.getLogger() @@ -394,6 +394,9 @@ func (a *applierV3backend) RangeStream(ctx context.Context, txn mvcc.TxnRead, r resp := &pb.RangeStreamResponse{} resp.Header = &pb.ResponseHeader{} streamC := make(chan *mvcc.RangeResult) + defer func() { + close(streamC) + }() var err error if txn == nil { @@ -413,20 +416,30 @@ func (a *applierV3backend) RangeStream(ctx context.Context, txn mvcc.TxnRead, r lg.Error("RangeStream error", zap.Error(err)) } }() - +Loop: for { select { case rr := <-streamC: if rr == nil { - break + select { + case rspC <- nil: + fmt.Printf("rr == nil, rspC <- nil\n") + case <-ctx.Done(): + return nil, ctx.Err() + } + fmt.Printf("streamC return nil, break\n") + break Loop } if rr.KVs == nil { if rr.Err != nil { - err = rr.Err - return nil, err + select { + case errC <- rr.Err: + case <-ctx.Done(): + return nil, ctx.Err() + } + return nil, rr.Err } - break } subResp := &pb.RangeStreamResponse{} @@ -451,11 +464,11 @@ func (a *applierV3backend) RangeStream(ctx context.Context, txn mvcc.TxnRead, r select { case rspC <- subResp: case <-ctx.Done(): - break + return nil, ctx.Err() } case <-ctx.Done(): - break + return nil, ctx.Err() } } diff --git a/etcdserver/apply_auth.go b/etcdserver/apply_auth.go index 920cb9c365d..cceadf3207f 100644 --- a/etcdserver/apply_auth.go +++ b/etcdserver/apply_auth.go @@ -92,11 +92,11 @@ func (aa *authApplierV3) Range(ctx context.Context, txn mvcc.TxnRead, r *pb.Rang return aa.applierV3.Range(ctx, txn, r) } -func (aa *authApplierV3) RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse) (*pb.RangeStreamResponse, error) { +func (aa *authApplierV3) RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse, errC chan error) (*pb.RangeStreamResponse, error) { if err := aa.as.IsRangePermitted(&aa.authInfo, r.Key, r.RangeEnd); err != nil { return nil, err } - return aa.applierV3.RangeStream(ctx, txn, r, rspC) + return aa.applierV3.RangeStream(ctx, txn, r, rspC, errC) } func (aa *authApplierV3) DeleteRange(txn mvcc.TxnWrite, r *pb.DeleteRangeRequest) (*pb.DeleteRangeResponse, error) { diff --git a/etcdserver/corrupt.go b/etcdserver/corrupt.go index b717640735d..745836005d9 100644 --- a/etcdserver/corrupt.go +++ b/etcdserver/corrupt.go @@ -317,7 +317,7 @@ func (a *applierV3Corrupt) Range(ctx context.Context, txn mvcc.TxnRead, p *pb.Ra return nil, ErrCorrupt } -func (a *applierV3Corrupt) RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse) (*pb.RangeStreamResponse, error) { +func (a *applierV3Corrupt) RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse, errC chan error) (*pb.RangeStreamResponse, error) { return nil, ErrCorrupt } diff --git a/etcdserver/v3_server.go b/etcdserver/v3_server.go index 9c29e78c70e..7ea646effb3 100644 --- a/etcdserver/v3_server.go +++ b/etcdserver/v3_server.go @@ -47,7 +47,7 @@ const ( type RaftKV interface { Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeResponse, error) - RangeStream(ctx context.Context, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse) error + RangeStream(ctx context.Context, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse, errC chan error) error Put(ctx context.Context, r *pb.PutRequest) (*pb.PutResponse, error) DeleteRange(ctx context.Context, r *pb.DeleteRangeRequest) (*pb.DeleteRangeResponse, error) Txn(ctx context.Context, r *pb.TxnRequest) (*pb.TxnResponse, error) @@ -131,7 +131,7 @@ func (s *EtcdServer) Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeRe return resp, err } -func (s *EtcdServer) RangeStream(ctx context.Context, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse) error { +func (s *EtcdServer) RangeStream(ctx context.Context, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse, errC chan error) error { trace := traceutil.New("rangeStream", s.getLogger(), traceutil.Field{Key: "range_begin", Value: string(r.Key)}, @@ -164,7 +164,7 @@ func (s *EtcdServer) RangeStream(ctx context.Context, r *pb.RangeStreamRequest, return s.authStore.IsRangePermitted(ai, r.Key, r.RangeEnd) } - get := func() { resp, err = s.applyV3Base.RangeStream(ctx, nil, r, rspC) } + get := func() { resp, err = s.applyV3Base.RangeStream(ctx, nil, r, rspC, errC) } if serr := s.doSerialize(ctx, chk, get); serr != nil { err = serr return err diff --git a/mvcc/kvstore_txn.go b/mvcc/kvstore_txn.go index e7d321b0e42..c535ae4a93f 100644 --- a/mvcc/kvstore_txn.go +++ b/mvcc/kvstore_txn.go @@ -22,7 +22,7 @@ import ( "go.uber.org/zap" ) -const RangeStreamBatch int = 1000 +const RangeStreamBatch int = 2 type storeTxnRead struct { s *store @@ -179,8 +179,6 @@ func (tr *storeTxnRead) rangeKeys(key, end []byte, curRev int64, ro RangeOptions } func (tr *storeTxnRead) rangeStreamKeys(key, end []byte, curRev int64, ro RangeOptions, streamC chan *RangeResult) error { - defer close(streamC) - rev := ro.Rev if rev > curRev { streamC <- &RangeResult{KVs: nil, Count: -1, Rev: curRev, Err: ErrFutureRev} @@ -197,6 +195,7 @@ func (tr *storeTxnRead) rangeStreamKeys(key, end []byte, curRev int64, ro RangeO tr.trace.Step("range keys from in-memory index tree") if len(revpairs) == 0 { streamC <- &RangeResult{KVs: nil, Count: 0, Rev: curRev} + streamC <- nil return nil } @@ -248,7 +247,7 @@ func (tr *storeTxnRead) rangeStreamKeys(key, end []byte, curRev int64, ro RangeO tr.trace.Step("range keys from bolt db") streamC <- &RangeResult{KVs: kvs, Count: kvsLen, Rev: curRev} - + streamC <- nil return nil } From 3ab92f64a71d5454cf4d258f719cbe8e47e8d3b0 Mon Sep 17 00:00:00 2001 From: yangxuanjia Date: Sun, 27 Sep 2020 18:41:12 +0800 Subject: [PATCH 03/16] range stream --- clientv3/kv.go | 8 +++++++- etcdserver/api/v3rpc/key.go | 4 ---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/clientv3/kv.go b/clientv3/kv.go index cc4f45962de..480082ba07e 100644 --- a/clientv3/kv.go +++ b/clientv3/kv.go @@ -16,6 +16,7 @@ package clientv3 import ( "context" + "fmt" v3rpc "go.etcd.io/etcd/v3/etcdserver/api/v3rpc/rpctypes" "io" "time" @@ -171,6 +172,7 @@ func (kv *kv) Do(ctx context.Context, op Op) (OpResponse, error) { var resp *pb.RangeStreamResponse rangeStreamClient, err = kv.openRangeStreamClient(ctx, op.toRangeStreamRequest(), kv.callOpts...) resp, err = kv.serveRangeStream(ctx, rangeStreamClient) + fmt.Printf("kv.serveRangeStream return: [%v] \n", resp) if err == nil { return OpResponse{getStream: (*GetStreamResponse)(resp)}, nil } @@ -275,6 +277,11 @@ func (kv *kv) handleRangeStream(ctx context.Context, rsc pb.KV_RangeStreamClient resp, err := rsc.Recv() if err != nil { if err == io.EOF { + select { + case rspC <- nil: + case <-ctx.Done(): + return + } break } @@ -290,6 +297,5 @@ func (kv *kv) handleRangeStream(ctx context.Context, rsc pb.KV_RangeStreamClient return } } - return } diff --git a/etcdserver/api/v3rpc/key.go b/etcdserver/api/v3rpc/key.go index a315ece0783..4116fb7b4cf 100644 --- a/etcdserver/api/v3rpc/key.go +++ b/etcdserver/api/v3rpc/key.go @@ -76,7 +76,6 @@ func (s *kvServer) RangeStream(r *pb.RangeStreamRequest, rss pb.KV_RangeStreamSe } }() - var count int Loop: for { select { @@ -92,9 +91,6 @@ Loop: s.hdr.fill(resp.Header) serr := rss.Send(resp) - count++ - fmt.Printf("rss.Send end, count: [%d], resp:[%v] \n", count, resp) - fmt.Printf("serr:[%v] \n", serr) if serr != nil { if isClientCtxErr(rss.Context().Err(), serr) { s.lg.Debug("failed to send range stream response to gRPC stream", zap.Error(serr)) From 03e8774a51bde2ee8f71a969185753a14a8bee9a Mon Sep 17 00:00:00 2001 From: yangxuanjia Date: Sun, 27 Sep 2020 18:41:59 +0800 Subject: [PATCH 04/16] range stream --- clientv3/kv.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/clientv3/kv.go b/clientv3/kv.go index 480082ba07e..bfb796f1c0e 100644 --- a/clientv3/kv.go +++ b/clientv3/kv.go @@ -16,7 +16,6 @@ package clientv3 import ( "context" - "fmt" v3rpc "go.etcd.io/etcd/v3/etcdserver/api/v3rpc/rpctypes" "io" "time" @@ -172,7 +171,6 @@ func (kv *kv) Do(ctx context.Context, op Op) (OpResponse, error) { var resp *pb.RangeStreamResponse rangeStreamClient, err = kv.openRangeStreamClient(ctx, op.toRangeStreamRequest(), kv.callOpts...) resp, err = kv.serveRangeStream(ctx, rangeStreamClient) - fmt.Printf("kv.serveRangeStream return: [%v] \n", resp) if err == nil { return OpResponse{getStream: (*GetStreamResponse)(resp)}, nil } From 5821cb80a171f3e693ba0feb47561a6f24f6d62a Mon Sep 17 00:00:00 2001 From: yangxuanjia Date: Mon, 28 Sep 2020 09:56:52 +0800 Subject: [PATCH 05/16] range stream --- clientv3/kv.go | 7 +++---- etcdserver/api/v3rpc/key.go | 7 +------ etcdserver/apply.go | 17 ++++++++--------- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/clientv3/kv.go b/clientv3/kv.go index bfb796f1c0e..2c44dcb89b9 100644 --- a/clientv3/kv.go +++ b/clientv3/kv.go @@ -239,7 +239,7 @@ func (kv *kv) serveRangeStream(ctx context.Context, rsc pb.KV_RangeStreamClient) rspC := make(chan *pb.RangeStreamResponse) errC := make(chan error) - var mainRSP *pb.RangeStreamResponse + mainRSP := &pb.RangeStreamResponse{} defer func() { close(rspC) @@ -255,9 +255,7 @@ Loop: if subRsp == nil { break Loop } - if mainRSP == nil { - mainRSP = subRsp - } + mainRSP.Kvs = append(mainRSP.Kvs, subRsp.Kvs...) mainRSP.TotalCount = subRsp.TotalCount case err := <-errC: @@ -289,6 +287,7 @@ func (kv *kv) handleRangeStream(ctx context.Context, rsc pb.KV_RangeStreamClient } return } + select { case rspC <- resp: case <-ctx.Done(): diff --git a/etcdserver/api/v3rpc/key.go b/etcdserver/api/v3rpc/key.go index 4116fb7b4cf..26df49b3b92 100644 --- a/etcdserver/api/v3rpc/key.go +++ b/etcdserver/api/v3rpc/key.go @@ -17,7 +17,6 @@ package v3rpc import ( "context" - "fmt" "go.uber.org/zap" "go.etcd.io/etcd/v3/etcdserver" @@ -81,15 +80,14 @@ Loop: select { case resp := <-respC: if resp == nil { - fmt.Printf("RangeStream server get resp := <-respC, and resp==nil, break\n") break Loop } if resp.Kvs == nil || len(resp.Kvs) == 0 { - fmt.Printf("RangeStream server get resp := <-respC, and len(resp.Kvs) == 0, break\n") break Loop } s.hdr.fill(resp.Header) + serr := rss.Send(resp) if serr != nil { if isClientCtxErr(rss.Context().Err(), serr) { @@ -101,15 +99,12 @@ Loop: return nil } case err := <-errC: - fmt.Printf("err := <-errC \n") return err case <-rss.Context().Done(): - fmt.Printf("<-rss.Context().Done() \n") return rss.Context().Err() } } - fmt.Printf("RangeStream server finish!!!\n") return nil } diff --git a/etcdserver/apply.go b/etcdserver/apply.go index 0bc9fbafc7d..42934a73391 100644 --- a/etcdserver/apply.go +++ b/etcdserver/apply.go @@ -416,6 +416,7 @@ func (a *applierV3backend) RangeStream(ctx context.Context, txn mvcc.TxnRead, r lg.Error("RangeStream error", zap.Error(err)) } }() + Loop: for { select { @@ -423,22 +424,18 @@ Loop: if rr == nil { select { case rspC <- nil: - fmt.Printf("rr == nil, rspC <- nil\n") case <-ctx.Done(): return nil, ctx.Err() } - fmt.Printf("streamC return nil, break\n") break Loop } - if rr.KVs == nil { - if rr.Err != nil { - select { - case errC <- rr.Err: - case <-ctx.Done(): - return nil, ctx.Err() - } + if rr.Err != nil { + select { + case errC <- rr.Err: return nil, rr.Err + case <-ctx.Done(): + return nil, ctx.Err() } } @@ -460,6 +457,8 @@ Loop: } // resp TotalSize just use monitor long time range stream resp.TotalSize += int64(proto.Size(subResp)) + // resp Header.Revision just use monitor long time range stream + resp.Header.Revision = subResp.Header.Revision select { case rspC <- subResp: From 7e29c802064c6791a7e265d4faf9edd73bbc12c9 Mon Sep 17 00:00:00 2001 From: yangxuanjia Date: Mon, 28 Sep 2020 11:23:28 +0800 Subject: [PATCH 06/16] range stream --- clientv3/kv.go | 25 ++++++++++++++++++------- etcdserver/api/v3rpc/key.go | 15 ++++++++++----- etcdserver/apply.go | 19 +++++++++++++++---- mvcc/kvstore_txn.go | 12 ++++++++++++ 4 files changed, 55 insertions(+), 16 deletions(-) diff --git a/clientv3/kv.go b/clientv3/kv.go index 2c44dcb89b9..3db19759fbf 100644 --- a/clientv3/kv.go +++ b/clientv3/kv.go @@ -17,6 +17,7 @@ package clientv3 import ( "context" v3rpc "go.etcd.io/etcd/v3/etcdserver/api/v3rpc/rpctypes" + "go.uber.org/zap" "io" "time" @@ -103,10 +104,11 @@ func (resp *TxnResponse) OpResponse() OpResponse { type kv struct { remote pb.KVClient callOpts []grpc.CallOption + lg *zap.Logger } func NewKV(c *Client) KV { - api := &kv{remote: RetryKVClient(c)} + api := &kv{remote: RetryKVClient(c), lg: c.lg} if c != nil { api.callOpts = c.callOpts } @@ -114,7 +116,7 @@ func NewKV(c *Client) KV { } func NewKVFromKVClient(remote pb.KVClient, c *Client) KV { - api := &kv{remote: remote} + api := &kv{remote: remote, lg: c.lg} if c != nil { api.callOpts = c.callOpts } @@ -241,11 +243,6 @@ func (kv *kv) serveRangeStream(ctx context.Context, rsc pb.KV_RangeStreamClient) mainRSP := &pb.RangeStreamResponse{} - defer func() { - close(rspC) - close(errC) - }() - go kv.handleRangeStream(ctx, rsc, rspC, errC) Loop: @@ -269,6 +266,20 @@ Loop: } func (kv *kv) handleRangeStream(ctx context.Context, rsc pb.KV_RangeStreamClient, rspC chan *pb.RangeStreamResponse, errC chan error) { + defer func() { + if err := recover(); err != nil { + switch e := err.(type) { + case error: + kv.lg.Error("kv handleRangeStream() panic error", zap.Error(e)) + } + } + }() + + defer func() { + close(rspC) + close(errC) + }() + for { resp, err := rsc.Recv() if err != nil { diff --git a/etcdserver/api/v3rpc/key.go b/etcdserver/api/v3rpc/key.go index 26df49b3b92..18978237228 100644 --- a/etcdserver/api/v3rpc/key.go +++ b/etcdserver/api/v3rpc/key.go @@ -56,6 +56,16 @@ func (s *kvServer) Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeResp } func (s *kvServer) RangeStream(r *pb.RangeStreamRequest, rss pb.KV_RangeStreamServer) error { + defer func() { + if err := recover(); err != nil { + switch e := err.(type) { + case error: + s.lg.Error( + "kvServer RangeStream() panic error", zap.Error(e)) + } + } + }() + if err := checkRangeStreamRequest(r); err != nil { return err } @@ -63,11 +73,6 @@ func (s *kvServer) RangeStream(r *pb.RangeStreamRequest, rss pb.KV_RangeStreamSe respC := make(chan *pb.RangeStreamResponse) errC := make(chan error) - defer func() { - close(respC) - close(errC) - }() - go func() { err := s.kv.RangeStream(rss.Context(), r, respC, errC) if err != nil { diff --git a/etcdserver/apply.go b/etcdserver/apply.go index 42934a73391..62c5b5da08e 100644 --- a/etcdserver/apply.go +++ b/etcdserver/apply.go @@ -387,6 +387,19 @@ func (a *applierV3backend) Range(ctx context.Context, txn mvcc.TxnRead, r *pb.Ra } func (a *applierV3backend) RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse, errC chan error) (*pb.RangeStreamResponse, error) { + defer func() { + if err := recover(); err != nil { + switch e := err.(type) { + case error: + a.s.getLogger().Error( + "applierV3backend RangeStream() panic error", zap.Error(e)) + } + } + }() + + defer close(rspC) + defer close(errC) + trace := traceutil.Get(ctx) lg := a.s.getLogger() @@ -394,9 +407,7 @@ func (a *applierV3backend) RangeStream(ctx context.Context, txn mvcc.TxnRead, r resp := &pb.RangeStreamResponse{} resp.Header = &pb.ResponseHeader{} streamC := make(chan *mvcc.RangeResult) - defer func() { - close(streamC) - }() + var err error if txn == nil { @@ -413,7 +424,7 @@ func (a *applierV3backend) RangeStream(ctx context.Context, txn mvcc.TxnRead, r go func() { err = txn.RangeStream(r.Key, mkGteRange(r.RangeEnd), ro, streamC) if err != nil { - lg.Error("RangeStream error", zap.Error(err)) + lg.Error("storeTxnRead RangeStream error", zap.Error(err)) } }() diff --git a/mvcc/kvstore_txn.go b/mvcc/kvstore_txn.go index c535ae4a93f..553e7f57f00 100644 --- a/mvcc/kvstore_txn.go +++ b/mvcc/kvstore_txn.go @@ -179,6 +179,18 @@ func (tr *storeTxnRead) rangeKeys(key, end []byte, curRev int64, ro RangeOptions } func (tr *storeTxnRead) rangeStreamKeys(key, end []byte, curRev int64, ro RangeOptions, streamC chan *RangeResult) error { + defer func() { + if err := recover(); err != nil { + switch e := err.(type) { + case error: + tr.s.lg.Error( + "storeTxnRead rangeStreamKeys() panic error", zap.Error(e)) + } + } + }() + + defer close(streamC) + rev := ro.Rev if rev > curRev { streamC <- &RangeResult{KVs: nil, Count: -1, Rev: curRev, Err: ErrFutureRev} From 432fb0b267103d8b82d555fae3b8a76ea3756c8a Mon Sep 17 00:00:00 2001 From: yangxuanjia Date: Mon, 28 Sep 2020 11:24:01 +0800 Subject: [PATCH 07/16] range stream --- mvcc/kvstore_txn.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mvcc/kvstore_txn.go b/mvcc/kvstore_txn.go index 553e7f57f00..f9013cde84c 100644 --- a/mvcc/kvstore_txn.go +++ b/mvcc/kvstore_txn.go @@ -22,7 +22,7 @@ import ( "go.uber.org/zap" ) -const RangeStreamBatch int = 2 +const RangeStreamBatch int = 1000 type storeTxnRead struct { s *store From 544f936f4608ddea743bb4cec84264e20c2431b4 Mon Sep 17 00:00:00 2001 From: yangxuanjia Date: Tue, 29 Sep 2020 15:06:21 +0800 Subject: [PATCH 08/16] range stream --- clientv3/kv.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clientv3/kv.go b/clientv3/kv.go index 3db19759fbf..553b4330442 100644 --- a/clientv3/kv.go +++ b/clientv3/kv.go @@ -242,6 +242,7 @@ func (kv *kv) serveRangeStream(ctx context.Context, rsc pb.KV_RangeStreamClient) errC := make(chan error) mainRSP := &pb.RangeStreamResponse{} + mainRSP.Header = &pb.ResponseHeader{} go kv.handleRangeStream(ctx, rsc, rspC, errC) @@ -255,6 +256,7 @@ Loop: mainRSP.Kvs = append(mainRSP.Kvs, subRsp.Kvs...) mainRSP.TotalCount = subRsp.TotalCount + mainRSP.Header = subRsp.Header case err := <-errC: return nil, err case <-ctx.Done(): From adff7e9ee9f8c42a8b1bfb30e798897780bcf438 Mon Sep 17 00:00:00 2001 From: zhaochen72 Date: Mon, 19 Oct 2020 16:48:28 +0800 Subject: [PATCH 09/16] https://github.com/etcd-io/etcd/pull/11776 --- embed/config.go | 7 ++++--- go.mod | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/embed/config.go b/embed/config.go index 58665bbed9d..a36ee185a31 100644 --- a/embed/config.go +++ b/embed/config.go @@ -37,6 +37,7 @@ import ( "go.etcd.io/etcd/v3/etcdserver/api/v3compactor" bolt "go.etcd.io/bbolt" + "go.uber.org/multierr" "go.uber.org/zap" "go.uber.org/zap/zapcore" "golang.org/x/crypto/bcrypt" @@ -614,7 +615,7 @@ func (cfg *Config) PeerURLsMapAndToken(which string) (urlsmap types.URLsMap, tok case cfg.DNSCluster != "": clusterStrs, cerr := cfg.GetDNSClusterNames() lg := cfg.logger - if cerr != nil { + if len(clusterStrs) == 0 && cerr != nil { lg.Warn("failed to resolve during SRV discovery", zap.Error(cerr)) return nil, "", cerr } @@ -672,7 +673,7 @@ func (cfg *Config) GetDNSClusterNames() ([]string, error) { ) defaultHTTPClusterStrs, httpCerr := srv.GetCluster("http", "etcd-server"+serviceNameSuffix, cfg.Name, cfg.DNSCluster, cfg.APUrls) - if httpCerr != nil { + if httpCerr == nil { clusterStrs = append(clusterStrs, defaultHTTPClusterStrs...) } lg.Info( @@ -686,7 +687,7 @@ func (cfg *Config) GetDNSClusterNames() ([]string, error) { zap.Error(httpCerr), ) - return clusterStrs, cerr + return clusterStrs, multierr.Combine(cerr, httpCerr) } func (cfg Config) InitialClusterFromName(name string) (ret string) { diff --git a/go.mod b/go.mod index 07ab0075a72..158ba1f0a47 100644 --- a/go.mod +++ b/go.mod @@ -41,6 +41,7 @@ require ( go.etcd.io/etcd/api/v3 v3.0.0-20201012212543-0b95e8cef14a go.etcd.io/etcd/client/v2 v2.0.0-00010101000000-000000000000 go.etcd.io/etcd/pkg/v3 v3.0.0-00010101000000-000000000000 + go.uber.org/multierr v1.6.0 go.uber.org/zap v1.16.0 golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect From 229d202d517ed2334000055f9b9068c2f8956632 Mon Sep 17 00:00:00 2001 From: yangxuanjia Date: Mon, 19 Oct 2020 18:16:27 +0800 Subject: [PATCH 10/16] range stream --- clientv3/leasing/kv.go | 2 +- clientv3/ordering/kv.go | 25 +++++++++++++++++++++++-- proxy/grpcproxy/kv.go | 2 +- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/clientv3/leasing/kv.go b/clientv3/leasing/kv.go index 785b836df61..36bd440375c 100644 --- a/clientv3/leasing/kv.go +++ b/clientv3/leasing/kv.go @@ -88,7 +88,7 @@ func (lkv *leasingKV) Get(ctx context.Context, key string, opts ...v3.OpOption) // TODO yxj func (lkv *leasingKV) GetStream(ctx context.Context, key string, opts ...v3.OpOption) (*v3.GetStreamResponse, error) { - panic("unsupported") + panic("not support") } func (lkv *leasingKV) Put(ctx context.Context, key, val string, opts ...v3.OpOption) (*v3.PutResponse, error) { diff --git a/clientv3/ordering/kv.go b/clientv3/ordering/kv.go index b24f7977b21..84de337476d 100644 --- a/clientv3/ordering/kv.go +++ b/clientv3/ordering/kv.go @@ -75,9 +75,30 @@ func (kv *kvOrdering) Get(ctx context.Context, key string, opts ...clientv3.OpOp } } -// TODO yxj func (kv *kvOrdering) GetStream(ctx context.Context, key string, opts ...clientv3.OpOption) (*clientv3.GetStreamResponse, error) { - panic("unsupported") + // prevRev is stored in a local variable in order to record the prevRev + // at the beginning of the Get operation, because concurrent + // access to kvOrdering could change the prevRev field in the + // middle of the Get operation. + prevRev := kv.getPrevRev() + op := clientv3.OpGetStream(key, opts...) + for { + r, err := kv.KV.Do(ctx, op) + if err != nil { + return nil, err + } + resp := r.GetStream() + if resp.Header.Revision == prevRev { + return resp, nil + } else if resp.Header.Revision > prevRev { + kv.setPrevRev(resp.Header.Revision) + return resp, nil + } + err = kv.orderViolationFunc(op, r, prevRev) + if err != nil { + return nil, err + } + } } func (kv *kvOrdering) Txn(ctx context.Context) clientv3.Txn { diff --git a/proxy/grpcproxy/kv.go b/proxy/grpcproxy/kv.go index 5a77e3dff87..0e933c36a6a 100644 --- a/proxy/grpcproxy/kv.go +++ b/proxy/grpcproxy/kv.go @@ -69,7 +69,7 @@ func (p *kvProxy) Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeRespo // TODO yxj func (p *kvProxy) RangeStream(*pb.RangeStreamRequest, pb.KV_RangeStreamServer) error { - panic("implement me") + panic("not support") } func (p *kvProxy) Put(ctx context.Context, r *pb.PutRequest) (*pb.PutResponse, error) { From 65f0c847021d99738f1a19918b453a819207e6b7 Mon Sep 17 00:00:00 2001 From: yangxuanjia Date: Tue, 20 Oct 2020 14:44:59 +0800 Subject: [PATCH 11/16] range stream --- etcdserver/etcdserverpb/rpc.proto | 46 ++----------------------------- proxy/grpcproxy/kv.go | 2 +- 2 files changed, 4 insertions(+), 44 deletions(-) diff --git a/etcdserver/etcdserverpb/rpc.proto b/etcdserver/etcdserverpb/rpc.proto index 20ab3160366..4842d7e0a34 100644 --- a/etcdserver/etcdserverpb/rpc.proto +++ b/etcdserver/etcdserverpb/rpc.proto @@ -21,7 +21,7 @@ service KV { } // RangeStream gets the keys in the range stream from the key-value store. - rpc RangeStream(RangeStreamRequest) returns (stream RangeStreamResponse) { + rpc RangeStream(RangeRequest) returns (stream RangeResponse) { option (google.api.http) = { post: "/v3/kv/rangestream" body: "*" @@ -474,35 +474,6 @@ message RangeRequest { int64 max_create_revision = 13; } -message RangeStreamRequest { - // key is the first key for the range. If range_end is not given, the request only looks up key. - bytes key = 1; - // range_end is the upper bound on the requested range [key, range_end). - // If range_end is '\0', the range is all keys >= key. - // If range_end is key plus one (e.g., "aa"+1 == "ab", "a\xff"+1 == "b"), - // then the range request gets all keys prefixed with key. - // If both key and range_end are '\0', then the range request returns all keys. - bytes range_end = 2; - // limit is a limit on the number of keys returned for the request. When limit is set to 0, - // it is treated as no limit. - int64 limit = 3; - // revision is the point-in-time of the key-value store to use for the range. - // If revision is less or equal to zero, the range is over the newest key-value store. - // If the revision has been compacted, ErrCompacted is returned as a response. - int64 revision = 4; - - // serializable sets the range request to use serializable member-local reads. - // Range requests are linearizable by default; linearizable requests have higher - // latency and lower throughput than serializable requests but reflect the current - // consensus of the cluster. For better performance, in exchange for possible stale reads, - // a serializable range request is served locally without needing to reach consensus - // with other nodes in the cluster. - bool serializable = 7; - - // keys_only when set returns only the keys and not the values. - bool keys_only = 8; -} - message RangeResponse { ResponseHeader header = 1; // kvs is the list of key-value pairs matched by the range request. @@ -512,19 +483,10 @@ message RangeResponse { bool more = 3; // count is set to the number of keys within the range when requested. int64 count = 4; -} - -message RangeStreamResponse { - ResponseHeader header = 1; - // kvs is the list of key-value pairs matched by the range request. - // kvs is empty when count is requested. - repeated mvccpb.KeyValue kvs = 2; - // count is set to the number of keys within the range when requested. - int64 count = 4; - int64 totalCount = 5; + int64 sub_count = 101; - int64 totalSize = 6; + int64 total_size = 102; } message PutRequest { @@ -585,7 +547,6 @@ message RequestOp { PutRequest request_put = 2; DeleteRangeRequest request_delete_range = 3; TxnRequest request_txn = 4; - RangeStreamRequest request_range_stream = 5; } } @@ -596,7 +557,6 @@ message ResponseOp { PutResponse response_put = 2; DeleteRangeResponse response_delete_range = 3; TxnResponse response_txn = 4; - RangeStreamResponse response_range_stream = 5; } } diff --git a/proxy/grpcproxy/kv.go b/proxy/grpcproxy/kv.go index 0e933c36a6a..e9afc098f3d 100644 --- a/proxy/grpcproxy/kv.go +++ b/proxy/grpcproxy/kv.go @@ -68,7 +68,7 @@ func (p *kvProxy) Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeRespo } // TODO yxj -func (p *kvProxy) RangeStream(*pb.RangeStreamRequest, pb.KV_RangeStreamServer) error { +func (p *kvProxy) RangeStream(r *pb.RangeStreamRequest, rss pb.KV_RangeStreamServer) error { panic("not support") } From 98b04b4524682b50bf57ac50288a215932b05adc Mon Sep 17 00:00:00 2001 From: yangxuanjia Date: Tue, 20 Oct 2020 16:22:42 +0800 Subject: [PATCH 12/16] Merge branch 'jdmaster' into range_stream # Conflicts: # Documentation/dev-guide/api_reference_v3.md # api/etcdserverpb/etcdserver.pb.go # api/etcdserverpb/rpc.pb.go # etcdserver/etcdserverpb/gw/rpc.pb.gw.go --- api/etcdserverpb/rpc.proto | 46 +++++++++++++++++++++++++++++++++++--- clientv3/kv.go | 1 - 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/api/etcdserverpb/rpc.proto b/api/etcdserverpb/rpc.proto index d6944e17d11..6185e031e75 100644 --- a/api/etcdserverpb/rpc.proto +++ b/api/etcdserverpb/rpc.proto @@ -21,7 +21,7 @@ service KV { } // RangeStream gets the keys in the range stream from the key-value store. - rpc RangeStream(RangeRequest) returns (stream RangeResponse) { + rpc RangeStream(RangeStreamRequest) returns (stream RangeStreamResponse) { option (google.api.http) = { post: "/v3/kv/rangestream" body: "*" @@ -474,6 +474,35 @@ message RangeRequest { int64 max_create_revision = 13; } +message RangeStreamRequest { + // key is the first key for the range. If range_end is not given, the request only looks up key. + bytes key = 1; + // range_end is the upper bound on the requested range [key, range_end). + // If range_end is '\0', the range is all keys >= key. + // If range_end is key plus one (e.g., "aa"+1 == "ab", "a\xff"+1 == "b"), + // then the range request gets all keys prefixed with key. + // If both key and range_end are '\0', then the range request returns all keys. + bytes range_end = 2; + // limit is a limit on the number of keys returned for the request. When limit is set to 0, + // it is treated as no limit. + int64 limit = 3; + // revision is the point-in-time of the key-value store to use for the range. + // If revision is less or equal to zero, the range is over the newest key-value store. + // If the revision has been compacted, ErrCompacted is returned as a response. + int64 revision = 4; + + // serializable sets the range request to use serializable member-local reads. + // Range requests are linearizable by default; linearizable requests have higher + // latency and lower throughput than serializable requests but reflect the current + // consensus of the cluster. For better performance, in exchange for possible stale reads, + // a serializable range request is served locally without needing to reach consensus + // with other nodes in the cluster. + bool serializable = 7; + + // keys_only when set returns only the keys and not the values. + bool keys_only = 8; +} + message RangeResponse { ResponseHeader header = 1; // kvs is the list of key-value pairs matched by the range request. @@ -483,10 +512,19 @@ message RangeResponse { bool more = 3; // count is set to the number of keys within the range when requested. int64 count = 4; +} + +message RangeStreamResponse { + ResponseHeader header = 1; + // kvs is the list of key-value pairs matched by the range request. + // kvs is empty when count is requested. + repeated mvccpb.KeyValue kvs = 2; + // count is set to the number of keys within the range when requested. + int64 count = 4; - int64 sub_count = 101; + int64 totalCount = 5; - int64 total_size = 102; + int64 totalSize = 6; } message PutRequest { @@ -547,6 +585,7 @@ message RequestOp { PutRequest request_put = 2; DeleteRangeRequest request_delete_range = 3; TxnRequest request_txn = 4; + RangeStreamRequest request_range_stream = 5; } } @@ -557,6 +596,7 @@ message ResponseOp { PutResponse response_put = 2; DeleteRangeResponse response_delete_range = 3; TxnResponse response_txn = 4; + RangeStreamResponse response_range_stream = 5; } } diff --git a/clientv3/kv.go b/clientv3/kv.go index be2a51cedd0..52df211e7c1 100644 --- a/clientv3/kv.go +++ b/clientv3/kv.go @@ -16,7 +16,6 @@ package clientv3 import ( "context" - v3rpc "go.etcd.io/etcd/v3/etcdserver/api/v3rpc/rpctypes" "go.uber.org/zap" "io" "time" From 98ac42835c704f0d21011949844f248eb8b41689 Mon Sep 17 00:00:00 2001 From: yangxuanjia Date: Tue, 20 Oct 2020 17:19:28 +0800 Subject: [PATCH 13/16] new --- Documentation/dev-guide/api_reference_v3.md | 3 + .../apispec/swagger/rpc.swagger.json | 226 +++--- .../apispec/swagger/v3election.swagger.json | 10 +- .../apispec/swagger/v3lock.swagger.json | 4 +- api/etcdserverpb/etcdserver.pb.go | 140 ++-- api/etcdserverpb/gw/rpc.pb.gw.go | 56 ++ api/etcdserverpb/rpc.pb.go | 662 +++++++++++------- api/etcdserverpb/rpc.proto | 46 +- client/mock/mockserver/mockserver.go | 2 +- clientv3/kv.go | 17 +- clientv3/op.go | 6 +- clientv3/retry.go | 2 +- etcdctl/ctlv3/command/printer.go | 2 +- etcdctl/ctlv3/command/printer_fields.go | 2 +- etcdserver/api/v3rpc/key.go | 13 +- etcdserver/apply.go | 15 +- etcdserver/apply_auth.go | 2 +- etcdserver/corrupt.go | 2 +- etcdserver/util.go | 6 +- etcdserver/v3_server.go | 8 +- proxy/grpcproxy/adapter/kv_client_adapter.go | 14 +- proxy/grpcproxy/kv.go | 2 +- 22 files changed, 664 insertions(+), 576 deletions(-) diff --git a/Documentation/dev-guide/api_reference_v3.md b/Documentation/dev-guide/api_reference_v3.md index e2725850625..eecd5a3ce15 100644 --- a/Documentation/dev-guide/api_reference_v3.md +++ b/Documentation/dev-guide/api_reference_v3.md @@ -45,6 +45,7 @@ This is a generated documentation. Please read the proto files for more. | Method | Request Type | Response Type | Description | | ------ | ------------ | ------------- | ----------- | | Range | RangeRequest | RangeResponse | Range gets the keys in the range from the key-value store. | +| RangeStream | RangeRequest | RangeResponse | RangeStream gets the keys in the range stream from the key-value store. | | Put | PutRequest | PutResponse | Put puts the given key into the key-value store. A put request increments the revision of the key-value store and generates one event in the event history. | | DeleteRange | DeleteRangeRequest | DeleteRangeResponse | DeleteRange deletes the given range from the key-value store. A delete request increments the revision of the key-value store and generates a delete event in the event history for every deleted key. | | Txn | TxnRequest | TxnResponse | Txn processes multiple requests in a single transaction. A txn request increments the revision of the key-value store and generates events with the same revision for every completed request. It is not allowed to modify the same key several times within one txn. | @@ -805,6 +806,8 @@ Empty field. | kvs | kvs is the list of key-value pairs matched by the range request. kvs is empty when count is requested. | (slice of) mvccpb.KeyValue | | more | more indicates if there are more keys to return in the requested range. | bool | | count | count is set to the number of keys within the range when requested. | int64 | +| sub_count | | int64 | +| total_size | | int64 | diff --git a/Documentation/dev-guide/apispec/swagger/rpc.swagger.json b/Documentation/dev-guide/apispec/swagger/rpc.swagger.json index 2dc8fa784ca..bc739bbbcf6 100644 --- a/Documentation/dev-guide/apispec/swagger/rpc.swagger.json +++ b/Documentation/dev-guide/apispec/swagger/rpc.swagger.json @@ -36,7 +36,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -69,7 +69,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -102,7 +102,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -135,7 +135,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -168,7 +168,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -201,7 +201,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -234,7 +234,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -267,7 +267,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -300,7 +300,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -333,7 +333,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -366,7 +366,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -399,7 +399,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -432,7 +432,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -465,7 +465,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -498,7 +498,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -531,7 +531,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -564,7 +564,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -597,7 +597,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -630,7 +630,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -663,7 +663,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -696,7 +696,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -729,7 +729,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -762,7 +762,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -795,7 +795,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -828,7 +828,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -861,7 +861,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -894,7 +894,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -927,7 +927,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -960,7 +960,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -981,7 +981,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/etcdserverpbRangeStreamRequest" + "$ref": "#/definitions/etcdserverpbRangeRequest" } } ], @@ -990,19 +990,19 @@ "description": "A successful response.(streaming responses)", "schema": { "type": "object", - "title": "Stream result of etcdserverpbRangeStreamResponse", + "title": "Stream result of etcdserverpbRangeResponse", "properties": { "error": { "$ref": "#/definitions/runtimeStreamError" }, "result": { - "$ref": "#/definitions/etcdserverpbRangeStreamResponse" + "$ref": "#/definitions/etcdserverpbRangeResponse" } } } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1035,7 +1035,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1068,7 +1068,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1111,7 +1111,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1144,7 +1144,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1177,7 +1177,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1210,7 +1210,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1243,7 +1243,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1276,7 +1276,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1309,7 +1309,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1342,7 +1342,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1384,7 +1384,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1417,7 +1417,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1450,7 +1450,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1493,7 +1493,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -1609,7 +1609,8 @@ "type": "object", "properties": { "no_password": { - "type": "boolean" + "type": "boolean", + "format": "boolean" } } }, @@ -1820,7 +1821,8 @@ "title": "authRevision is the current revision of auth store" }, "enabled": { - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "header": { "$ref": "#/definitions/etcdserverpbResponseHeader" @@ -2002,7 +2004,8 @@ "properties": { "physical": { "description": "physical is set so the RPC will wait until the compaction is physically\napplied to the local database such that compacted entries are totally\nremoved from the backend database.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "revision": { "description": "revision is the key-value store revision for the compaction operation.", @@ -2088,7 +2091,8 @@ }, "prev_kv": { "description": "If prev_kv is set, etcd gets the previous key-value pairs before deleting it.\nThe previous key-value pairs will be returned in the delete response.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "range_end": { "description": "range_end is the key following the last key to delete for the range [key, range_end).\nIf range_end is not given, the range is defined to contain only the key argument.\nIf range_end is one bit larger than the given key, then the range is all the keys\nwith the prefix (the given key).\nIf range_end is '\\0', the range is all keys greater than or equal to the key argument.", @@ -2304,7 +2308,8 @@ }, "keys": { "description": "keys is true to query all the keys attached to this lease.", - "type": "boolean" + "type": "boolean", + "format": "boolean" } } }, @@ -2356,7 +2361,8 @@ }, "isLearner": { "description": "isLearner indicates if the member is raft learner.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "name": { "description": "name is the human-readable name of the member. If the member is not started, the name will be an empty string.", @@ -2376,7 +2382,8 @@ "properties": { "isLearner": { "description": "isLearner indicates if the added member is raft learner.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "peerURLs": { "description": "peerURLs is the list of URLs the added member will use to communicate with the cluster.", @@ -2410,7 +2417,8 @@ "type": "object", "properties": { "linearizable": { - "type": "boolean" + "type": "boolean", + "format": "boolean" } } }, @@ -2534,11 +2542,13 @@ "properties": { "ignore_lease": { "description": "If ignore_lease is set, etcd updates the key using its current lease.\nReturns an error if the key does not exist.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "ignore_value": { "description": "If ignore_value is set, etcd updates the key using its current value.\nReturns an error if the key does not exist.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "key": { "description": "key is the key, in bytes, to put into the key-value store.", @@ -2552,7 +2562,8 @@ }, "prev_kv": { "description": "If prev_kv is set, etcd gets the previous key-value pair before changing it.\nThe previous key-value pair will be returned in the put response.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "value": { "description": "value is the value, in bytes, to associate with the key in the key-value store.", @@ -2578,7 +2589,8 @@ "properties": { "count_only": { "description": "count_only when set returns only the count of the keys in the range.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "key": { "description": "key is the first key for the range. If range_end is not given, the request only looks up key.", @@ -2587,7 +2599,8 @@ }, "keys_only": { "description": "keys_only when set returns only the keys and not the values.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "limit": { "description": "limit is a limit on the number of keys returned for the request. When limit is set to 0,\nit is treated as no limit.", @@ -2626,7 +2639,8 @@ }, "serializable": { "description": "serializable sets the range request to use serializable member-local reads.\nRange requests are linearizable by default; linearizable requests have higher\nlatency and lower throughput than serializable requests but reflect the current\nconsensus of the cluster. For better performance, in exchange for possible stale reads,\na serializable range request is served locally without needing to reach consensus\nwith other nodes in the cluster.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "sort_order": { "description": "sort_order is the order for returned sorted results.", @@ -2658,66 +2672,14 @@ }, "more": { "description": "more indicates if there are more keys to return in the requested range.", - "type": "boolean" - } - } - }, - "etcdserverpbRangeStreamRequest": { - "type": "object", - "properties": { - "key": { - "description": "key is the first key for the range. If range_end is not given, the request only looks up key.", - "type": "string", - "format": "byte" - }, - "keys_only": { - "description": "keys_only when set returns only the keys and not the values.", - "type": "boolean" - }, - "limit": { - "description": "limit is a limit on the number of keys returned for the request. When limit is set to 0,\nit is treated as no limit.", - "type": "string", - "format": "int64" - }, - "range_end": { - "description": "range_end is the upper bound on the requested range [key, range_end).\nIf range_end is '\\0', the range is all keys \u003e= key.\nIf range_end is key plus one (e.g., \"aa\"+1 == \"ab\", \"a\\xff\"+1 == \"b\"),\nthen the range request gets all keys prefixed with key.\nIf both key and range_end are '\\0', then the range request returns all keys.", - "type": "string", - "format": "byte" - }, - "revision": { - "description": "revision is the point-in-time of the key-value store to use for the range.\nIf revision is less or equal to zero, the range is over the newest key-value store.\nIf the revision has been compacted, ErrCompacted is returned as a response.", - "type": "string", - "format": "int64" - }, - "serializable": { - "description": "serializable sets the range request to use serializable member-local reads.\nRange requests are linearizable by default; linearizable requests have higher\nlatency and lower throughput than serializable requests but reflect the current\nconsensus of the cluster. For better performance, in exchange for possible stale reads,\na serializable range request is served locally without needing to reach consensus\nwith other nodes in the cluster.", - "type": "boolean" - } - } - }, - "etcdserverpbRangeStreamResponse": { - "type": "object", - "properties": { - "count": { - "description": "count is set to the number of keys within the range when requested.", - "type": "string", - "format": "int64" - }, - "header": { - "$ref": "#/definitions/etcdserverpbResponseHeader" + "type": "boolean", + "format": "boolean" }, - "kvs": { - "description": "kvs is the list of key-value pairs matched by the range request.\nkvs is empty when count is requested.", - "type": "array", - "items": { - "$ref": "#/definitions/mvccpbKeyValue" - } - }, - "totalCount": { + "sub_count": { "type": "string", "format": "int64" }, - "totalSize": { + "total_size": { "type": "string", "format": "int64" } @@ -2735,9 +2697,6 @@ "request_range": { "$ref": "#/definitions/etcdserverpbRangeRequest" }, - "request_range_stream": { - "$ref": "#/definitions/etcdserverpbRangeStreamRequest" - }, "request_txn": { "$ref": "#/definitions/etcdserverpbTxnRequest" } @@ -2780,9 +2739,6 @@ "response_range": { "$ref": "#/definitions/etcdserverpbRangeResponse" }, - "response_range_stream": { - "$ref": "#/definitions/etcdserverpbRangeStreamResponse" - }, "response_txn": { "$ref": "#/definitions/etcdserverpbTxnResponse" } @@ -2838,7 +2794,8 @@ }, "isLearner": { "description": "isLearner indicates if the member is raft learner.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "leader": { "description": "leader is the member ID which the responding member believes is the current leader.", @@ -2908,7 +2865,8 @@ }, "succeeded": { "description": "succeeded is set to true if the compare evaluated to true or false otherwise.", - "type": "boolean" + "type": "boolean", + "format": "boolean" } } }, @@ -2934,7 +2892,8 @@ }, "fragment": { "description": "fragment enables splitting large revisions into multiple watch responses.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "key": { "description": "key is the key to register for watching.", @@ -2943,11 +2902,13 @@ }, "prev_kv": { "description": "If prev_kv is set, created watcher gets the previous KV before the event happens.\nIf the previous KV is already compacted, nothing will be returned.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "progress_notify": { "description": "progress_notify is set so that the etcd server will periodically send a WatchResponse with\nno events to the new watcher if there are no recent events. It is useful when clients\nwish to recover a disconnected watcher starting from a recent known revision.\nThe etcd server may decide how often it will send notifications based on current load.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "range_end": { "description": "range_end is the end of the range [key, range_end) to watch. If range_end is not given,\nonly the key argument is watched. If range_end is equal to '\\0', all keys greater than\nor equal to the key argument are watched.\nIf the range_end is one bit larger than the given key,\nthen all keys with the prefix (the given key) will be watched.", @@ -2993,7 +2954,8 @@ }, "canceled": { "description": "canceled is set to true if the response is for a cancel watch request.\nNo further events will be sent to the canceled watcher.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "compact_revision": { "description": "compact_revision is set to the minimum index if a watcher tries to watch\nat a compacted index.\n\nThis happens when creating a watcher at a compacted revision or the watcher cannot\ncatch up with the progress of the key-value store.\n\nThe client should treat the watcher as canceled and should not try to create any\nwatcher with the same start_revision again.", @@ -3002,7 +2964,8 @@ }, "created": { "description": "created is set to true if the response is for a create watch request.\nThe client should record the watch_id and expect to receive events for\nthe created watcher from the same stream.\nAll events sent to the created watcher will attach with the same watch_id.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "events": { "type": "array", @@ -3012,7 +2975,8 @@ }, "fragment": { "description": "framgment is true if large watch response was split over multiple responses.", - "type": "boolean" + "type": "boolean", + "format": "boolean" }, "header": { "$ref": "#/definitions/etcdserverpbResponseHeader" diff --git a/Documentation/dev-guide/apispec/swagger/v3election.swagger.json b/Documentation/dev-guide/apispec/swagger/v3election.swagger.json index 7df6582f3a9..efd647ae6a4 100644 --- a/Documentation/dev-guide/apispec/swagger/v3election.swagger.json +++ b/Documentation/dev-guide/apispec/swagger/v3election.swagger.json @@ -23,7 +23,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -56,7 +56,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -98,7 +98,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -131,7 +131,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -164,7 +164,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } diff --git a/Documentation/dev-guide/apispec/swagger/v3lock.swagger.json b/Documentation/dev-guide/apispec/swagger/v3lock.swagger.json index 3418dc55d2d..b3692fd68f7 100644 --- a/Documentation/dev-guide/apispec/swagger/v3lock.swagger.json +++ b/Documentation/dev-guide/apispec/swagger/v3lock.swagger.json @@ -23,7 +23,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } @@ -56,7 +56,7 @@ } }, "default": { - "description": "An unexpected error response.", + "description": "An unexpected error response", "schema": { "$ref": "#/definitions/runtimeError" } diff --git a/api/etcdserverpb/etcdserver.pb.go b/api/etcdserverpb/etcdserver.pb.go index e02a1b74f30..bb9f1f870ce 100644 --- a/api/etcdserverpb/etcdserver.pb.go +++ b/api/etcdserverpb/etcdserver.pb.go @@ -453,7 +453,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -463,6 +463,9 @@ func (m *Request) Unmarshal(dAtA []byte) error { return ErrInvalidLengthEtcdserver } postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEtcdserver + } if postIndex > l { return io.ErrUnexpectedEOF } @@ -482,7 +485,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -492,6 +495,9 @@ func (m *Request) Unmarshal(dAtA []byte) error { return ErrInvalidLengthEtcdserver } postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEtcdserver + } if postIndex > l { return io.ErrUnexpectedEOF } @@ -511,7 +517,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -521,6 +527,9 @@ func (m *Request) Unmarshal(dAtA []byte) error { return ErrInvalidLengthEtcdserver } postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEtcdserver + } if postIndex > l { return io.ErrUnexpectedEOF } @@ -540,7 +549,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int(b) & 0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } @@ -560,7 +569,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -570,6 +579,9 @@ func (m *Request) Unmarshal(dAtA []byte) error { return ErrInvalidLengthEtcdserver } postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEtcdserver + } if postIndex > l { return io.ErrUnexpectedEOF } @@ -589,7 +601,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.PrevIndex |= (uint64(b) & 0x7F) << shift + m.PrevIndex |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -608,7 +620,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int(b) & 0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } @@ -629,7 +641,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Expiration |= (int64(b) & 0x7F) << shift + m.Expiration |= int64(b&0x7F) << shift if b < 0x80 { break } @@ -648,7 +660,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int(b) & 0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } @@ -668,7 +680,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Since |= (uint64(b) & 0x7F) << shift + m.Since |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -687,7 +699,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int(b) & 0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } @@ -707,7 +719,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int(b) & 0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } @@ -727,7 +739,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int(b) & 0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } @@ -747,7 +759,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Time |= (int64(b) & 0x7F) << shift + m.Time |= int64(b&0x7F) << shift if b < 0x80 { break } @@ -766,7 +778,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int(b) & 0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } @@ -786,7 +798,7 @@ func (m *Request) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int(b) & 0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } @@ -802,6 +814,9 @@ func (m *Request) Unmarshal(dAtA []byte) error { if skippy < 0 { return ErrInvalidLengthEtcdserver } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthEtcdserver + } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } @@ -830,7 +845,7 @@ func (m *Metadata) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - wire |= (uint64(b) & 0x7F) << shift + wire |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -858,7 +873,7 @@ func (m *Metadata) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.NodeID |= (uint64(b) & 0x7F) << shift + m.NodeID |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -877,7 +892,7 @@ func (m *Metadata) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.ClusterID |= (uint64(b) & 0x7F) << shift + m.ClusterID |= uint64(b&0x7F) << shift if b < 0x80 { break } @@ -891,6 +906,9 @@ func (m *Metadata) Unmarshal(dAtA []byte) error { if skippy < 0 { return ErrInvalidLengthEtcdserver } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthEtcdserver + } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } @@ -907,6 +925,7 @@ func (m *Metadata) Unmarshal(dAtA []byte) error { func skipEtcdserver(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 + depth := 0 for iNdEx < l { var wire uint64 for shift := uint(0); ; shift += 7 { @@ -938,10 +957,8 @@ func skipEtcdserver(dAtA []byte) (n int, err error) { break } } - return iNdEx, nil case 1: iNdEx += 8 - return iNdEx, nil case 2: var length int for shift := uint(0); ; shift += 7 { @@ -958,83 +975,34 @@ func skipEtcdserver(dAtA []byte) (n int, err error) { break } } - iNdEx += length if length < 0 { return 0, ErrInvalidLengthEtcdserver } - return iNdEx, nil + iNdEx += length case 3: - for { - var innerWire uint64 - var start int = iNdEx - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEtcdserver - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - innerWire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - innerWireType := int(innerWire & 0x7) - if innerWireType == 4 { - break - } - next, err := skipEtcdserver(dAtA[start:]) - if err != nil { - return 0, err - } - iNdEx = start + next - } - return iNdEx, nil + depth++ case 4: - return iNdEx, nil + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupEtcdserver + } + depth-- case 5: iNdEx += 4 - return iNdEx, nil default: return 0, fmt.Errorf("proto: illegal wireType %d", wireType) } + if iNdEx < 0 { + return 0, ErrInvalidLengthEtcdserver + } + if depth == 0 { + return iNdEx, nil + } } - panic("unreachable") + return 0, io.ErrUnexpectedEOF } var ( - ErrInvalidLengthEtcdserver = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowEtcdserver = fmt.Errorf("proto: integer overflow") + ErrInvalidLengthEtcdserver = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowEtcdserver = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupEtcdserver = fmt.Errorf("proto: unexpected end of group") ) - -func init() { proto.RegisterFile("etcdserver.proto", fileDescriptorEtcdserver) } - -var fileDescriptorEtcdserver = []byte{ - // 380 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x5c, 0xd2, 0xdd, 0x6e, 0xda, 0x30, - 0x14, 0x07, 0x70, 0x0c, 0xe1, 0xcb, 0x63, 0x1b, 0xb3, 0xd0, 0x74, 0x84, 0xa6, 0x2c, 0x42, 0xbb, - 0xc8, 0xd5, 0xf6, 0x0e, 0x2c, 0x5c, 0x44, 0x2a, 0x15, 0x0d, 0x15, 0xbd, 0x76, 0xc9, 0x29, 0x58, - 0x02, 0x4c, 0x1d, 0x07, 0xf1, 0x06, 0x7d, 0x85, 0x3e, 0x12, 0x97, 0x7d, 0x82, 0xaa, 0xa5, 0x2f, - 0x52, 0x39, 0x24, 0xc4, 0xed, 0x5d, 0xf4, 0xfb, 0x9f, 0x1c, 0x1f, 0x7f, 0xd0, 0x2e, 0xea, 0x79, - 0x9c, 0xa0, 0xda, 0xa1, 0xfa, 0xbb, 0x55, 0x52, 0x4b, 0xd6, 0x29, 0x65, 0x7b, 0xdb, 0xef, 0x2d, - 0xe4, 0x42, 0x66, 0xc1, 0x3f, 0xf3, 0x75, 0xaa, 0x19, 0x3c, 0x38, 0xb4, 0x19, 0xe1, 0x7d, 0x8a, - 0x89, 0x66, 0x3d, 0x5a, 0x0d, 0x03, 0x20, 0x1e, 0xf1, 0x9d, 0xa1, 0x73, 0x78, 0xfe, 0x5d, 0x89, - 0xaa, 0x61, 0xc0, 0x7e, 0xd1, 0xc6, 0x18, 0xf5, 0x52, 0xc6, 0x50, 0xf5, 0x88, 0xdf, 0xce, 0x93, - 0xdc, 0x18, 0x50, 0x67, 0xc2, 0xf5, 0x12, 0x6a, 0x56, 0x96, 0x09, 0xfb, 0x49, 0x6b, 0x33, 0xbe, - 0x02, 0xc7, 0x0a, 0x0c, 0x18, 0x0f, 0x84, 0x82, 0xba, 0x47, 0xfc, 0x56, 0xe1, 0x81, 0x50, 0x6c, - 0x40, 0xdb, 0x13, 0x85, 0xbb, 0x19, 0x5f, 0xa5, 0x08, 0x0d, 0xeb, 0xaf, 0x92, 0x8b, 0x9a, 0x70, - 0x13, 0xe3, 0x1e, 0x9a, 0xd6, 0xa0, 0x25, 0x17, 0x35, 0xa3, 0xbd, 0x48, 0x34, 0xb4, 0xce, 0xab, - 0x90, 0xa8, 0x64, 0xf6, 0x87, 0xd2, 0xd1, 0x7e, 0x2b, 0x14, 0xd7, 0x42, 0x6e, 0xa0, 0xed, 0x11, - 0xbf, 0x96, 0x37, 0xb2, 0xdc, 0xec, 0xed, 0x86, 0x0b, 0x0d, 0xd4, 0x1a, 0x35, 0x13, 0xd6, 0xa7, - 0xf5, 0xa9, 0xd8, 0xcc, 0x11, 0xbe, 0x58, 0x33, 0x9c, 0xc8, 0xac, 0x1f, 0xe1, 0x3c, 0x55, 0x89, - 0xd8, 0x21, 0x74, 0xac, 0x5f, 0x4b, 0x36, 0x67, 0x3a, 0x95, 0x4a, 0x63, 0x0c, 0x5f, 0xad, 0x82, - 0xdc, 0x4c, 0x7a, 0x95, 0x4a, 0x95, 0xae, 0xe1, 0x9b, 0x9d, 0x9e, 0xcc, 0x4c, 0x75, 0x2d, 0xd6, - 0x08, 0xdf, 0xad, 0xa9, 0x33, 0xc9, 0xba, 0x6a, 0x85, 0x7c, 0x0d, 0xdd, 0x0f, 0x5d, 0x33, 0x63, - 0xae, 0xb9, 0xe8, 0x3b, 0x85, 0xc9, 0x12, 0x7e, 0x58, 0xa7, 0x52, 0xe0, 0xe0, 0x82, 0xb6, 0xc6, - 0xa8, 0x79, 0xcc, 0x35, 0x37, 0x9d, 0x2e, 0x65, 0x8c, 0x9f, 0x5e, 0x43, 0x6e, 0x66, 0x87, 0xff, - 0x57, 0x69, 0xa2, 0x51, 0x85, 0x41, 0xf6, 0x28, 0xce, 0xb7, 0x70, 0xe6, 0x61, 0xef, 0xf0, 0xea, - 0x56, 0x0e, 0x47, 0x97, 0x3c, 0x1d, 0x5d, 0xf2, 0x72, 0x74, 0xc9, 0xe3, 0x9b, 0x5b, 0x79, 0x0f, - 0x00, 0x00, 0xff, 0xff, 0xee, 0x40, 0xba, 0xd6, 0xa4, 0x02, 0x00, 0x00, -} diff --git a/api/etcdserverpb/gw/rpc.pb.gw.go b/api/etcdserverpb/gw/rpc.pb.gw.go index 2fca126af85..ff01bbab244 100644 --- a/api/etcdserverpb/gw/rpc.pb.gw.go +++ b/api/etcdserverpb/gw/rpc.pb.gw.go @@ -66,6 +66,31 @@ func local_request_KV_Range_0(ctx context.Context, marshaler runtime.Marshaler, } +func request_KV_RangeStream_0(ctx context.Context, marshaler runtime.Marshaler, client etcdserverpb.KVClient, req *http.Request, pathParams map[string]string) (etcdserverpb.KV_RangeStreamClient, runtime.ServerMetadata, error) { + var protoReq etcdserverpb.RangeRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.RangeStream(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + func request_KV_Put_0(ctx context.Context, marshaler runtime.Marshaler, client etcdserverpb.KVClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq etcdserverpb.PutRequest var metadata runtime.ServerMetadata @@ -1580,6 +1605,13 @@ func RegisterKVHandlerServer(ctx context.Context, mux *runtime.ServeMux, server }) + mux.Handle("POST", pattern_KV_RangeStream_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + mux.Handle("POST", pattern_KV_Put_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -2502,6 +2534,26 @@ func RegisterKVHandlerClient(ctx context.Context, mux *runtime.ServeMux, client }) + mux.Handle("POST", pattern_KV_RangeStream_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_KV_RangeStream_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_KV_RangeStream_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_KV_Put_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -2588,6 +2640,8 @@ func RegisterKVHandlerClient(ctx context.Context, mux *runtime.ServeMux, client var ( pattern_KV_Range_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "range"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_KV_RangeStream_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "rangestream"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_KV_Put_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "put"}, "", runtime.AssumeColonVerbOpt(true))) pattern_KV_DeleteRange_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3", "kv", "deleterange"}, "", runtime.AssumeColonVerbOpt(true))) @@ -2600,6 +2654,8 @@ var ( var ( forward_KV_Range_0 = runtime.ForwardResponseMessage + forward_KV_RangeStream_0 = runtime.ForwardResponseStream + forward_KV_Put_0 = runtime.ForwardResponseMessage forward_KV_DeleteRange_0 = runtime.ForwardResponseMessage diff --git a/api/etcdserverpb/rpc.pb.go b/api/etcdserverpb/rpc.pb.go index f0942040a09..a94262417a2 100644 --- a/api/etcdserverpb/rpc.pb.go +++ b/api/etcdserverpb/rpc.pb.go @@ -528,6 +528,8 @@ type RangeResponse struct { More bool `protobuf:"varint,3,opt,name=more,proto3" json:"more,omitempty"` // count is set to the number of keys within the range when requested. Count int64 `protobuf:"varint,4,opt,name=count,proto3" json:"count,omitempty"` + SubCount int64 `protobuf:"varint,101,opt,name=sub_count,json=subCount,proto3" json:"sub_count,omitempty"` + TotalSize int64 `protobuf:"varint,102,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -594,6 +596,20 @@ func (m *RangeResponse) GetCount() int64 { return 0 } +func (m *RangeResponse) GetSubCount() int64 { + if m != nil { + return m.SubCount + } + return 0 +} + +func (m *RangeResponse) GetTotalSize() int64 { + if m != nil { + return m.TotalSize + } + return 0 +} + type PutRequest struct { // key is the key, in bytes, to put into the key-value store. Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` @@ -6154,264 +6170,268 @@ func init() { func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 4107 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0x5b, 0x73, 0x1b, 0xc9, - 0x75, 0xe6, 0x00, 0xc4, 0xed, 0xe0, 0x42, 0xb0, 0x79, 0x11, 0x84, 0x95, 0x28, 0x6e, 0x6b, 0xa5, - 0xe5, 0x4a, 0xbb, 0xc4, 0x9a, 0xb6, 0xb3, 0x55, 0x4a, 0xe2, 0x18, 0x22, 0xb1, 0x12, 0x97, 0x14, - 0xc9, 0x1d, 0x42, 0xda, 0x4b, 0xb9, 0xc2, 0x1a, 0x02, 0x2d, 0x72, 0x42, 0x60, 0x06, 0x9e, 0x19, - 0x40, 0xe4, 0xe6, 0xe2, 0x94, 0xcb, 0x71, 0x25, 0xaf, 0x76, 0x55, 0x2a, 0x79, 0x48, 0x5e, 0x52, - 0x29, 0x97, 0x1f, 0xfc, 0x9c, 0xbf, 0x90, 0xa7, 0x5c, 0x2a, 0x7f, 0x20, 0xb5, 0xf1, 0x4b, 0xf2, - 0x23, 0x52, 0xae, 0xbe, 0xcd, 0xf4, 0xdc, 0x40, 0xd9, 0xd8, 0xdd, 0x17, 0x11, 0x7d, 0xfa, 0xf4, - 0xf9, 0x4e, 0x9f, 0xee, 0x3e, 0xe7, 0xf4, 0xe9, 0x11, 0x94, 0x9c, 0x51, 0x6f, 0x73, 0xe4, 0xd8, - 0x9e, 0x8d, 0x2a, 0xc4, 0xeb, 0xf5, 0x5d, 0xe2, 0x4c, 0x88, 0x33, 0x3a, 0x6d, 0x2e, 0x9f, 0xd9, - 0x67, 0x36, 0xeb, 0x68, 0xd1, 0x5f, 0x9c, 0xa7, 0xd9, 0xa0, 0x3c, 0x2d, 0x63, 0x64, 0xb6, 0x86, - 0x93, 0x5e, 0x6f, 0x74, 0xda, 0xba, 0x98, 0x88, 0x9e, 0xa6, 0xdf, 0x63, 0x8c, 0xbd, 0xf3, 0xd1, - 0x29, 0xfb, 0x23, 0xfa, 0x6e, 0x9d, 0xd9, 0xf6, 0xd9, 0x80, 0xf0, 0x5e, 0xcb, 0xb2, 0x3d, 0xc3, - 0x33, 0x6d, 0xcb, 0xe5, 0xbd, 0xf8, 0xaf, 0x34, 0xa8, 0xe9, 0xc4, 0x1d, 0xd9, 0x96, 0x4b, 0x9e, - 0x12, 0xa3, 0x4f, 0x1c, 0x74, 0x1b, 0xa0, 0x37, 0x18, 0xbb, 0x1e, 0x71, 0x4e, 0xcc, 0x7e, 0x43, - 0x5b, 0xd7, 0x36, 0xe6, 0xf5, 0x92, 0xa0, 0xec, 0xf6, 0xd1, 0x1b, 0x50, 0x1a, 0x92, 0xe1, 0x29, - 0xef, 0xcd, 0xb0, 0xde, 0x22, 0x27, 0xec, 0xf6, 0x51, 0x13, 0x8a, 0x0e, 0x99, 0x98, 0xae, 0x69, - 0x5b, 0x8d, 0xec, 0xba, 0xb6, 0x91, 0xd5, 0xfd, 0x36, 0x1d, 0xe8, 0x18, 0x2f, 0xbd, 0x13, 0x8f, - 0x38, 0xc3, 0xc6, 0x3c, 0x1f, 0x48, 0x09, 0x5d, 0xe2, 0x0c, 0xf1, 0x4f, 0x72, 0x50, 0xd1, 0x0d, - 0xeb, 0x8c, 0xe8, 0xe4, 0x87, 0x63, 0xe2, 0x7a, 0xa8, 0x0e, 0xd9, 0x0b, 0x72, 0xc5, 0xe0, 0x2b, - 0x3a, 0xfd, 0xc9, 0xc7, 0x5b, 0x67, 0xe4, 0x84, 0x58, 0x1c, 0xb8, 0x42, 0xc7, 0x5b, 0x67, 0xa4, - 0x63, 0xf5, 0xd1, 0x32, 0xe4, 0x06, 0xe6, 0xd0, 0xf4, 0x04, 0x2a, 0x6f, 0x84, 0xd4, 0x99, 0x8f, - 0xa8, 0xb3, 0x0d, 0xe0, 0xda, 0x8e, 0x77, 0x62, 0x3b, 0x7d, 0xe2, 0x34, 0x72, 0xeb, 0xda, 0x46, - 0x6d, 0xeb, 0xad, 0x4d, 0x75, 0x19, 0x36, 0x55, 0x85, 0x36, 0x8f, 0x6d, 0xc7, 0x3b, 0xa4, 0xbc, - 0x7a, 0xc9, 0x95, 0x3f, 0xd1, 0x87, 0x50, 0x66, 0x42, 0x3c, 0xc3, 0x39, 0x23, 0x5e, 0x23, 0xcf, - 0xa4, 0xdc, 0xbb, 0x46, 0x4a, 0x97, 0x31, 0xeb, 0x0c, 0x9e, 0xff, 0x46, 0x18, 0x2a, 0x2e, 0x71, - 0x4c, 0x63, 0x60, 0x7e, 0x61, 0x9c, 0x0e, 0x48, 0xa3, 0xb0, 0xae, 0x6d, 0x14, 0xf5, 0x10, 0x8d, - 0xce, 0xff, 0x82, 0x5c, 0xb9, 0x27, 0xb6, 0x35, 0xb8, 0x6a, 0x14, 0x19, 0x43, 0x91, 0x12, 0x0e, - 0xad, 0xc1, 0x15, 0x5b, 0x34, 0x7b, 0x6c, 0x79, 0xbc, 0xb7, 0xc4, 0x7a, 0x4b, 0x8c, 0xc2, 0xba, - 0x37, 0xa0, 0x3e, 0x34, 0xad, 0x93, 0xa1, 0xdd, 0x3f, 0xf1, 0x0d, 0x02, 0xcc, 0x20, 0xb5, 0xa1, - 0x69, 0x3d, 0xb3, 0xfb, 0xba, 0x34, 0x0b, 0xe5, 0x34, 0x2e, 0xc3, 0x9c, 0x65, 0xc1, 0x69, 0x5c, - 0xaa, 0x9c, 0x9b, 0xb0, 0x44, 0x65, 0xf6, 0x1c, 0x62, 0x78, 0x24, 0x60, 0xae, 0x30, 0xe6, 0xc5, - 0xa1, 0x69, 0x6d, 0xb3, 0x9e, 0x10, 0xbf, 0x71, 0x19, 0xe3, 0xaf, 0x0a, 0x7e, 0xe3, 0x32, 0xcc, - 0x8f, 0x37, 0xa1, 0xe4, 0xdb, 0x1c, 0x15, 0x61, 0xfe, 0xe0, 0xf0, 0xa0, 0x53, 0x9f, 0x43, 0x00, - 0xf9, 0xf6, 0xf1, 0x76, 0xe7, 0x60, 0xa7, 0xae, 0xa1, 0x32, 0x14, 0x76, 0x3a, 0xbc, 0x91, 0xc1, - 0x8f, 0x01, 0x02, 0xeb, 0xa2, 0x02, 0x64, 0xf7, 0x3a, 0x9f, 0xd5, 0xe7, 0x28, 0xcf, 0x8b, 0x8e, - 0x7e, 0xbc, 0x7b, 0x78, 0x50, 0xd7, 0xe8, 0xe0, 0x6d, 0xbd, 0xd3, 0xee, 0x76, 0xea, 0x19, 0xca, - 0xf1, 0xec, 0x70, 0xa7, 0x9e, 0x45, 0x25, 0xc8, 0xbd, 0x68, 0xef, 0x3f, 0xef, 0xd4, 0xe7, 0xf1, - 0xcf, 0x35, 0xa8, 0x8a, 0xf5, 0xe2, 0x67, 0x02, 0x7d, 0x07, 0xf2, 0xe7, 0xec, 0x5c, 0xb0, 0xad, - 0x58, 0xde, 0xba, 0x15, 0x59, 0xdc, 0xd0, 0xd9, 0xd1, 0x05, 0x2f, 0xc2, 0x90, 0xbd, 0x98, 0xb8, - 0x8d, 0xcc, 0x7a, 0x76, 0xa3, 0xbc, 0x55, 0xdf, 0xe4, 0xe7, 0x75, 0x73, 0x8f, 0x5c, 0xbd, 0x30, - 0x06, 0x63, 0xa2, 0xd3, 0x4e, 0x84, 0x60, 0x7e, 0x68, 0x3b, 0x84, 0xed, 0xd8, 0xa2, 0xce, 0x7e, - 0xd3, 0x6d, 0xcc, 0x16, 0x4d, 0xec, 0x56, 0xde, 0xc0, 0xbf, 0xd4, 0x00, 0x8e, 0xc6, 0x5e, 0xfa, - 0xd1, 0x58, 0x86, 0xdc, 0x84, 0x0a, 0x16, 0xc7, 0x82, 0x37, 0xd8, 0x99, 0x20, 0x86, 0x4b, 0xfc, - 0x33, 0x41, 0x1b, 0xe8, 0x06, 0x14, 0x46, 0x0e, 0x99, 0x9c, 0x5c, 0x4c, 0x18, 0x48, 0x51, 0xcf, - 0xd3, 0xe6, 0xde, 0x04, 0xbd, 0x09, 0x15, 0xf3, 0xcc, 0xb2, 0x1d, 0x72, 0xc2, 0x65, 0xe5, 0x58, - 0x6f, 0x99, 0xd3, 0x98, 0xde, 0x0a, 0x0b, 0x17, 0x9c, 0x57, 0x59, 0xf6, 0x29, 0x09, 0x5b, 0x50, - 0x66, 0xaa, 0xce, 0x64, 0xbe, 0x77, 0x02, 0x1d, 0x33, 0x6c, 0x58, 0xdc, 0x84, 0x42, 0x6b, 0xfc, - 0x03, 0x40, 0x3b, 0x64, 0x40, 0x3c, 0x32, 0x8b, 0xf7, 0x50, 0x6c, 0x92, 0x55, 0x6d, 0x82, 0x7f, - 0xa6, 0xc1, 0x52, 0x48, 0xfc, 0x4c, 0xd3, 0x6a, 0x40, 0xa1, 0xcf, 0x84, 0x71, 0x0d, 0xb2, 0xba, - 0x6c, 0xa2, 0x87, 0x50, 0x14, 0x0a, 0xb8, 0x8d, 0x6c, 0xca, 0xa6, 0x29, 0x70, 0x9d, 0x5c, 0xfc, - 0xcb, 0x0c, 0x94, 0xc4, 0x44, 0x0f, 0x47, 0xa8, 0x0d, 0x55, 0x87, 0x37, 0x4e, 0xd8, 0x7c, 0x84, - 0x46, 0xcd, 0x74, 0x27, 0xf4, 0x74, 0x4e, 0xaf, 0x88, 0x21, 0x8c, 0x8c, 0x7e, 0x1f, 0xca, 0x52, - 0xc4, 0x68, 0xec, 0x09, 0x93, 0x37, 0xc2, 0x02, 0x82, 0xfd, 0xf7, 0x74, 0x4e, 0x07, 0xc1, 0x7e, - 0x34, 0xf6, 0x50, 0x17, 0x96, 0xe5, 0x60, 0x3e, 0x1b, 0xa1, 0x46, 0x96, 0x49, 0x59, 0x0f, 0x4b, - 0x89, 0x2f, 0xd5, 0xd3, 0x39, 0x1d, 0x89, 0xf1, 0x4a, 0xa7, 0xaa, 0x92, 0x77, 0xc9, 0x9d, 0x77, - 0x4c, 0xa5, 0xee, 0xa5, 0x15, 0x57, 0xa9, 0x7b, 0x69, 0x3d, 0x2e, 0x41, 0x41, 0xb4, 0xf0, 0xbf, - 0x64, 0x00, 0xe4, 0x6a, 0x1c, 0x8e, 0xd0, 0x0e, 0xd4, 0x1c, 0xd1, 0x0a, 0x59, 0xeb, 0x8d, 0x44, - 0x6b, 0x89, 0x45, 0x9c, 0xd3, 0xab, 0x72, 0x10, 0x57, 0xee, 0x7b, 0x50, 0xf1, 0xa5, 0x04, 0x06, - 0xbb, 0x99, 0x60, 0x30, 0x5f, 0x42, 0x59, 0x0e, 0xa0, 0x26, 0xfb, 0x04, 0x56, 0xfc, 0xf1, 0x09, - 0x36, 0x7b, 0x73, 0x8a, 0xcd, 0x7c, 0x81, 0x4b, 0x52, 0x82, 0x6a, 0x35, 0x55, 0xb1, 0xc0, 0x6c, - 0x37, 0x13, 0xcc, 0x16, 0x57, 0x8c, 0x1a, 0x0e, 0x68, 0xbc, 0xe4, 0x4d, 0xfc, 0xbf, 0x59, 0x28, - 0x6c, 0xdb, 0xc3, 0x91, 0xe1, 0xd0, 0xd5, 0xc8, 0x3b, 0xc4, 0x1d, 0x0f, 0x3c, 0x66, 0xae, 0xda, - 0xd6, 0xdd, 0xb0, 0x44, 0xc1, 0x26, 0xff, 0xea, 0x8c, 0x55, 0x17, 0x43, 0xe8, 0x60, 0x11, 0x1e, - 0x33, 0xaf, 0x31, 0x58, 0x04, 0x47, 0x31, 0x44, 0x1e, 0xe4, 0x6c, 0x70, 0x90, 0x9b, 0x50, 0x98, - 0x10, 0x27, 0x08, 0xe9, 0x4f, 0xe7, 0x74, 0x49, 0x40, 0xef, 0xc0, 0x42, 0x34, 0xbc, 0xe4, 0x04, - 0x4f, 0xad, 0x17, 0x8e, 0x46, 0x77, 0xa1, 0x12, 0x8a, 0x71, 0x79, 0xc1, 0x57, 0x1e, 0x2a, 0x21, - 0x6e, 0x55, 0xfa, 0x55, 0x1a, 0x8f, 0x2b, 0x4f, 0xe7, 0xa4, 0x67, 0x5d, 0x95, 0x9e, 0xb5, 0x28, - 0x46, 0x09, 0xdf, 0x1a, 0x72, 0x32, 0xdf, 0x0f, 0x3b, 0x19, 0xfc, 0x7d, 0xa8, 0x86, 0x0c, 0x44, - 0xe3, 0x4e, 0xe7, 0xe3, 0xe7, 0xed, 0x7d, 0x1e, 0xa4, 0x9e, 0xb0, 0xb8, 0xa4, 0xd7, 0x35, 0x1a, - 0xeb, 0xf6, 0x3b, 0xc7, 0xc7, 0xf5, 0x0c, 0xaa, 0x42, 0xe9, 0xe0, 0xb0, 0x7b, 0xc2, 0xb9, 0xb2, - 0xf8, 0x89, 0x2f, 0x41, 0x04, 0x39, 0x25, 0xb6, 0xcd, 0x29, 0xb1, 0x4d, 0x93, 0xb1, 0x2d, 0x13, - 0xc4, 0x36, 0x16, 0xe6, 0xf6, 0x3b, 0xed, 0xe3, 0x4e, 0x7d, 0xfe, 0x71, 0x0d, 0x2a, 0xdc, 0xbe, - 0x27, 0x63, 0x8b, 0x86, 0xda, 0x7f, 0xd2, 0x00, 0x82, 0xd3, 0x84, 0x5a, 0x50, 0xe8, 0x71, 0x9c, - 0x86, 0xc6, 0x9c, 0xd1, 0x4a, 0xe2, 0x92, 0xe9, 0x92, 0x0b, 0x7d, 0x0b, 0x0a, 0xee, 0xb8, 0xd7, - 0x23, 0xae, 0x0c, 0x79, 0x37, 0xa2, 0xfe, 0x50, 0x78, 0x2b, 0x5d, 0xf2, 0xd1, 0x21, 0x2f, 0x0d, - 0x73, 0x30, 0x66, 0x01, 0x70, 0xfa, 0x10, 0xc1, 0x87, 0xff, 0x5e, 0x83, 0xb2, 0xb2, 0x79, 0x7f, - 0x47, 0x27, 0x7c, 0x0b, 0x4a, 0x4c, 0x07, 0xd2, 0x17, 0x6e, 0xb8, 0xa8, 0x07, 0x04, 0xf4, 0x7b, - 0x50, 0x92, 0x27, 0x40, 0x7a, 0xe2, 0x46, 0xb2, 0xd8, 0xc3, 0x91, 0x1e, 0xb0, 0xe2, 0x3d, 0x58, - 0x64, 0x56, 0xe9, 0xd1, 0xe4, 0x5a, 0xda, 0x51, 0x4d, 0x3f, 0xb5, 0x48, 0xfa, 0xd9, 0x84, 0xe2, - 0xe8, 0xfc, 0xca, 0x35, 0x7b, 0xc6, 0x40, 0x68, 0xe1, 0xb7, 0xf1, 0x47, 0x80, 0x54, 0x61, 0xb3, - 0x4c, 0x17, 0x57, 0xa1, 0xfc, 0xd4, 0x70, 0xcf, 0x85, 0x4a, 0xf8, 0x21, 0x54, 0x69, 0x73, 0xef, - 0xc5, 0x6b, 0xe8, 0xc8, 0x2e, 0x07, 0x92, 0x7b, 0x26, 0x9b, 0x23, 0x98, 0x3f, 0x37, 0xdc, 0x73, - 0x36, 0xd1, 0xaa, 0xce, 0x7e, 0xa3, 0x77, 0xa0, 0xde, 0xe3, 0x93, 0x3c, 0x89, 0x5c, 0x19, 0x16, - 0x04, 0xdd, 0xcf, 0x04, 0x3f, 0x85, 0x0a, 0x9f, 0xc3, 0x57, 0xad, 0x04, 0x5e, 0x84, 0x85, 0x63, - 0xcb, 0x18, 0xb9, 0xe7, 0xb6, 0x8c, 0x6e, 0x74, 0xd2, 0xf5, 0x80, 0x36, 0x13, 0xe2, 0xdb, 0xb0, - 0xe0, 0x90, 0xa1, 0x61, 0x5a, 0xa6, 0x75, 0x76, 0x72, 0x7a, 0xe5, 0x11, 0x57, 0x5c, 0x98, 0x6a, - 0x3e, 0xf9, 0x31, 0xa5, 0x52, 0xd5, 0x4e, 0x07, 0xf6, 0xa9, 0x70, 0x73, 0xec, 0x37, 0xfe, 0x69, - 0x06, 0x2a, 0x9f, 0x18, 0x5e, 0x4f, 0x2e, 0x1d, 0xda, 0x85, 0x9a, 0xef, 0xdc, 0x18, 0x45, 0xe8, - 0x12, 0x09, 0xb1, 0x6c, 0x8c, 0x4c, 0xa5, 0x65, 0x74, 0xac, 0xf6, 0x54, 0x02, 0x13, 0x65, 0x58, - 0x3d, 0x32, 0xf0, 0x45, 0x65, 0xd2, 0x45, 0x31, 0x46, 0x55, 0x94, 0x4a, 0x40, 0x87, 0x50, 0x1f, - 0x39, 0xf6, 0x99, 0x43, 0x5c, 0xd7, 0x17, 0xc6, 0xc3, 0x18, 0x4e, 0x10, 0x76, 0x24, 0x58, 0x03, - 0x71, 0x0b, 0xa3, 0x30, 0xe9, 0xf1, 0x42, 0x90, 0xcf, 0x70, 0xe7, 0xf4, 0x9f, 0x19, 0x40, 0xf1, - 0x49, 0xfd, 0xb6, 0x29, 0xde, 0x3d, 0xa8, 0xb9, 0x9e, 0xe1, 0xc4, 0x36, 0x5b, 0x95, 0x51, 0x7d, - 0x8f, 0xff, 0x36, 0xf8, 0x0a, 0x9d, 0x58, 0xb6, 0x67, 0xbe, 0xbc, 0x12, 0x59, 0x72, 0x4d, 0x92, - 0x0f, 0x18, 0x15, 0x75, 0xa0, 0xf0, 0xd2, 0x1c, 0x78, 0xc4, 0x71, 0x1b, 0xb9, 0xf5, 0xec, 0x46, - 0x6d, 0xeb, 0xe1, 0x75, 0xcb, 0xb0, 0xf9, 0x21, 0xe3, 0xef, 0x5e, 0x8d, 0x88, 0x2e, 0xc7, 0xaa, - 0x99, 0x67, 0x3e, 0x94, 0x8d, 0xdf, 0x84, 0xe2, 0x2b, 0x2a, 0x82, 0xde, 0xb2, 0x0b, 0x3c, 0x59, - 0x64, 0x6d, 0x7e, 0xc9, 0x7e, 0xe9, 0x18, 0x67, 0x43, 0x62, 0x79, 0xf2, 0x1e, 0x28, 0xdb, 0xf8, - 0x1e, 0x40, 0x00, 0x43, 0x5d, 0xfe, 0xc1, 0xe1, 0xd1, 0xf3, 0x6e, 0x7d, 0x0e, 0x55, 0xa0, 0x78, - 0x70, 0xb8, 0xd3, 0xd9, 0xef, 0xd0, 0xf8, 0x80, 0x5b, 0xd2, 0xa4, 0xa1, 0xb5, 0x54, 0x31, 0xb5, - 0x10, 0x26, 0x5e, 0x85, 0xe5, 0xa4, 0x05, 0xa4, 0xb9, 0x68, 0x55, 0xec, 0xd2, 0x99, 0x8e, 0x8a, - 0x0a, 0x9d, 0x09, 0x4f, 0xb7, 0x01, 0x05, 0xbe, 0x7b, 0xfb, 0x22, 0x39, 0x97, 0x4d, 0x6a, 0x08, - 0xbe, 0x19, 0x49, 0x5f, 0xac, 0x92, 0xdf, 0x4e, 0x74, 0x2f, 0xb9, 0x44, 0xf7, 0x82, 0xee, 0x42, - 0xd5, 0x3f, 0x0d, 0x86, 0x2b, 0x72, 0x81, 0x92, 0x5e, 0x91, 0x1b, 0x9d, 0xd2, 0x42, 0x46, 0x2f, - 0x84, 0x8d, 0x8e, 0xee, 0x41, 0x9e, 0x4c, 0x88, 0xe5, 0xb9, 0x8d, 0x32, 0x8b, 0x18, 0x55, 0x99, - 0xbb, 0x77, 0x28, 0x55, 0x17, 0x9d, 0xf8, 0xbb, 0xb0, 0xc8, 0xee, 0x48, 0x4f, 0x1c, 0xc3, 0x52, - 0x2f, 0x73, 0xdd, 0xee, 0xbe, 0x30, 0x37, 0xfd, 0x89, 0x6a, 0x90, 0xd9, 0xdd, 0x11, 0x46, 0xc8, - 0xec, 0xee, 0xe0, 0x1f, 0x6b, 0x80, 0xd4, 0x71, 0x33, 0xd9, 0x39, 0x22, 0x5c, 0xc2, 0x67, 0x03, - 0xf8, 0x65, 0xc8, 0x11, 0xc7, 0xb1, 0x1d, 0x66, 0xd1, 0x92, 0xce, 0x1b, 0xf8, 0x2d, 0xa1, 0x83, - 0x4e, 0x26, 0xf6, 0x85, 0x7f, 0x06, 0xb9, 0x34, 0xcd, 0x57, 0x75, 0x0f, 0x96, 0x42, 0x5c, 0x33, - 0x45, 0xae, 0x0f, 0x61, 0x81, 0x09, 0xdb, 0x3e, 0x27, 0xbd, 0x8b, 0x91, 0x6d, 0x5a, 0x31, 0x3c, - 0xba, 0x72, 0x81, 0x83, 0xa5, 0xf3, 0xe0, 0x13, 0xab, 0xf8, 0xc4, 0x6e, 0x77, 0x1f, 0x7f, 0x06, - 0xab, 0x11, 0x39, 0x52, 0xfd, 0x3f, 0x82, 0x72, 0xcf, 0x27, 0xba, 0x22, 0xd7, 0xb9, 0x1d, 0x56, - 0x2e, 0x3a, 0x54, 0x1d, 0x81, 0x0f, 0xe1, 0x46, 0x4c, 0xf4, 0x4c, 0x73, 0x7e, 0x1b, 0x56, 0x98, - 0xc0, 0x3d, 0x42, 0x46, 0xed, 0x81, 0x39, 0x49, 0xb5, 0xf4, 0x48, 0x4c, 0x4a, 0x61, 0xfc, 0x7a, - 0xf7, 0x05, 0xfe, 0x03, 0x81, 0xd8, 0x35, 0x87, 0xa4, 0x6b, 0xef, 0xa7, 0xeb, 0x46, 0xa3, 0xd9, - 0x05, 0xb9, 0x72, 0x45, 0x5a, 0xc3, 0x7e, 0xe3, 0x7f, 0xd6, 0x84, 0xa9, 0xd4, 0xe1, 0x5f, 0xf3, - 0x4e, 0x5e, 0x03, 0x38, 0xa3, 0x47, 0x86, 0xf4, 0x69, 0x07, 0xaf, 0xa8, 0x28, 0x14, 0x5f, 0x4f, - 0xea, 0xbf, 0x2b, 0x42, 0xcf, 0x65, 0xb1, 0xcf, 0xd9, 0x3f, 0xbe, 0x97, 0xbb, 0x0d, 0x65, 0x46, - 0x38, 0xf6, 0x0c, 0x6f, 0xec, 0xc6, 0x16, 0xe3, 0x2f, 0xc4, 0xb6, 0x97, 0x83, 0x66, 0x9a, 0xd7, - 0xb7, 0x20, 0xcf, 0x2e, 0x13, 0x32, 0x95, 0xbe, 0x99, 0xb0, 0x1f, 0xb9, 0x1e, 0xba, 0x60, 0xc4, - 0x3f, 0xd5, 0x20, 0xff, 0x8c, 0x95, 0x60, 0x15, 0xd5, 0xe6, 0xe5, 0x5a, 0x58, 0xc6, 0x90, 0x17, - 0x86, 0x4a, 0x3a, 0xfb, 0xcd, 0x52, 0x4f, 0x42, 0x9c, 0xe7, 0xfa, 0x3e, 0x4f, 0x71, 0x4b, 0xba, - 0xdf, 0xa6, 0x36, 0xeb, 0x0d, 0x4c, 0x62, 0x79, 0xac, 0x77, 0x9e, 0xf5, 0x2a, 0x14, 0x9a, 0x3d, - 0x9b, 0xee, 0x3e, 0x31, 0x1c, 0x4b, 0x14, 0x4d, 0x8b, 0x7a, 0x40, 0xc0, 0xfb, 0x50, 0xe7, 0x7a, - 0xb4, 0xfb, 0x7d, 0x25, 0xc1, 0xf4, 0xd1, 0xb4, 0x08, 0x5a, 0x48, 0x5a, 0x26, 0x2a, 0xed, 0x17, - 0x1a, 0x2c, 0x2a, 0xe2, 0x66, 0xb2, 0xea, 0xbb, 0x90, 0xe7, 0x45, 0x6a, 0x91, 0xe9, 0x2c, 0x87, - 0x47, 0x71, 0x18, 0x5d, 0xf0, 0xa0, 0x4d, 0x28, 0xf0, 0x5f, 0xf2, 0x0e, 0x90, 0xcc, 0x2e, 0x99, - 0xf0, 0x3d, 0x58, 0x12, 0x24, 0x32, 0xb4, 0x93, 0x0e, 0x06, 0x5b, 0x0c, 0xfc, 0x67, 0xb0, 0x1c, - 0x66, 0x9b, 0x69, 0x4a, 0x8a, 0x92, 0x99, 0xd7, 0x51, 0xb2, 0x2d, 0x95, 0x7c, 0x3e, 0xea, 0x2b, - 0x79, 0x54, 0x74, 0xc7, 0xa8, 0xeb, 0x95, 0x09, 0xaf, 0x57, 0x30, 0x01, 0x29, 0xe2, 0x1b, 0x9d, - 0xc0, 0x07, 0x72, 0x3b, 0xec, 0x9b, 0xae, 0xef, 0xc3, 0x31, 0x54, 0x06, 0xa6, 0x45, 0x0c, 0x47, - 0x54, 0xce, 0x35, 0x5e, 0x39, 0x57, 0x69, 0xf8, 0x0b, 0x40, 0xea, 0xc0, 0x6f, 0x54, 0xe9, 0xfb, - 0xd2, 0x64, 0x47, 0x8e, 0x3d, 0xb4, 0x53, 0xcd, 0x8e, 0xff, 0x1c, 0x56, 0x22, 0x7c, 0xdf, 0xa8, - 0x9a, 0x4b, 0xb0, 0xb8, 0x43, 0x64, 0x42, 0x23, 0xdd, 0xde, 0x47, 0x80, 0x54, 0xe2, 0x4c, 0x91, - 0xad, 0x05, 0x8b, 0xcf, 0xec, 0x09, 0x75, 0x91, 0x94, 0x1a, 0xf8, 0x06, 0x5e, 0x87, 0xf0, 0x4d, - 0xe1, 0xb7, 0x29, 0xb8, 0x3a, 0x60, 0x26, 0xf0, 0x7f, 0xd7, 0xa0, 0xd2, 0x1e, 0x18, 0xce, 0x50, - 0x02, 0x7f, 0x0f, 0xf2, 0xfc, 0x76, 0x2d, 0x0a, 0x5a, 0xf7, 0xc3, 0x62, 0x54, 0x5e, 0xde, 0x68, - 0xf3, 0xbb, 0xb8, 0x18, 0x45, 0x15, 0x17, 0x6f, 0x5e, 0x3b, 0x91, 0x37, 0xb0, 0x1d, 0xf4, 0x1e, - 0xe4, 0x0c, 0x3a, 0x84, 0x85, 0xa2, 0x5a, 0xb4, 0xae, 0xc1, 0xa4, 0xb1, 0x3b, 0x00, 0xe7, 0xc2, - 0xdf, 0x81, 0xb2, 0x82, 0x80, 0x0a, 0x90, 0x7d, 0xd2, 0x11, 0x09, 0x7b, 0x7b, 0xbb, 0xbb, 0xfb, - 0x82, 0x17, 0x74, 0x6a, 0x00, 0x3b, 0x1d, 0xbf, 0x9d, 0xc1, 0x9f, 0x8a, 0x51, 0xc2, 0xed, 0xab, - 0xfa, 0x68, 0x69, 0xfa, 0x64, 0x5e, 0x4b, 0x9f, 0x4b, 0xa8, 0x8a, 0xe9, 0xcf, 0x1a, 0xc6, 0x98, - 0xbc, 0x94, 0x30, 0xa6, 0x28, 0xaf, 0x0b, 0x46, 0xfc, 0x2b, 0x0d, 0xea, 0x3b, 0xf6, 0x2b, 0xeb, - 0xcc, 0x31, 0xfa, 0xfe, 0x39, 0xf9, 0x30, 0xb2, 0x52, 0x9b, 0x91, 0xe2, 0x68, 0x84, 0x3f, 0x20, - 0x44, 0x56, 0xac, 0x11, 0x94, 0x0d, 0x79, 0x2c, 0x94, 0x4d, 0xfc, 0x01, 0x2c, 0x44, 0x06, 0x51, - 0xdb, 0xbf, 0x68, 0xef, 0xef, 0xee, 0x50, 0x5b, 0xb3, 0xc2, 0x5a, 0xe7, 0xa0, 0xfd, 0x78, 0xbf, - 0x23, 0x1e, 0x90, 0xda, 0x07, 0xdb, 0x9d, 0xfd, 0x7a, 0x06, 0xf7, 0x60, 0x51, 0x81, 0x9f, 0xf5, - 0x65, 0x20, 0x45, 0xbb, 0x05, 0xa8, 0x8a, 0x68, 0x2f, 0x0e, 0xe5, 0xbf, 0x65, 0xa0, 0x26, 0x29, - 0x5f, 0x0f, 0x26, 0x5a, 0x85, 0x7c, 0xff, 0xf4, 0xd8, 0xfc, 0x42, 0xbe, 0x1c, 0x89, 0x16, 0xa5, - 0x0f, 0x38, 0x0e, 0x7f, 0xbe, 0x15, 0x2d, 0x1a, 0xc6, 0x1d, 0xe3, 0xa5, 0xb7, 0x6b, 0xf5, 0xc9, - 0x25, 0x4b, 0x0a, 0xe6, 0xf5, 0x80, 0xc0, 0x2a, 0x4c, 0xe2, 0x99, 0x97, 0xdd, 0xac, 0x94, 0x67, - 0x5f, 0xf4, 0x00, 0xea, 0xf4, 0x77, 0x7b, 0x34, 0x1a, 0x98, 0xa4, 0xcf, 0x05, 0x14, 0x18, 0x4f, - 0x8c, 0x4e, 0xd1, 0xd9, 0x5d, 0xc4, 0x6d, 0x14, 0x59, 0x58, 0x12, 0x2d, 0xb4, 0x0e, 0x65, 0xae, - 0xdf, 0xae, 0xf5, 0xdc, 0x25, 0xec, 0xed, 0x33, 0xab, 0xab, 0xa4, 0x70, 0x9a, 0x01, 0xd1, 0x34, - 0x63, 0x09, 0x16, 0xdb, 0x63, 0xef, 0xbc, 0x63, 0xd1, 0x58, 0x21, 0xad, 0xbc, 0x0c, 0x88, 0x12, - 0x77, 0x4c, 0x57, 0xa5, 0x0a, 0xd6, 0xf0, 0x82, 0x74, 0x60, 0x89, 0x12, 0x89, 0xe5, 0x99, 0x3d, - 0x25, 0xae, 0xca, 0xcc, 0x4b, 0x8b, 0x64, 0x5e, 0x86, 0xeb, 0xbe, 0xb2, 0x9d, 0xbe, 0xb0, 0xb9, - 0xdf, 0xc6, 0xff, 0xa8, 0x71, 0xc8, 0xe7, 0x6e, 0x28, 0x7d, 0xfa, 0x2d, 0xc5, 0xa0, 0xf7, 0xa1, - 0x60, 0x8f, 0xd8, 0x0b, 0xbf, 0x28, 0xc3, 0xac, 0x6e, 0xf2, 0x6f, 0x02, 0x36, 0x85, 0xe0, 0x43, - 0xde, 0xab, 0x4b, 0x36, 0x74, 0x1f, 0x6a, 0xe7, 0x86, 0x7b, 0x4e, 0xfa, 0x47, 0x52, 0x26, 0xbf, - 0xf9, 0x45, 0xa8, 0x78, 0x23, 0xd0, 0xef, 0x09, 0xf1, 0xa6, 0xe8, 0x87, 0x1f, 0xc2, 0x8a, 0xe4, - 0x14, 0xaf, 0x13, 0x53, 0x98, 0x5f, 0xc1, 0x6d, 0xc9, 0xbc, 0x7d, 0x6e, 0x58, 0x67, 0x44, 0x02, - 0xfe, 0xae, 0x16, 0x88, 0xcf, 0x27, 0x9b, 0x38, 0x9f, 0xc7, 0xd0, 0xf0, 0xe7, 0xc3, 0x6e, 0xd6, - 0xf6, 0x40, 0x55, 0x74, 0xec, 0x8a, 0xf3, 0x54, 0xd2, 0xd9, 0x6f, 0x4a, 0x73, 0xec, 0x81, 0x9f, - 0x4a, 0xd3, 0xdf, 0x78, 0x1b, 0x6e, 0x4a, 0x19, 0xe2, 0xce, 0x1b, 0x16, 0x12, 0x53, 0x3c, 0x49, - 0x88, 0x30, 0x2c, 0x1d, 0x3a, 0x7d, 0xe1, 0x55, 0xce, 0xf0, 0x12, 0x30, 0x99, 0x9a, 0x22, 0x73, - 0x85, 0x6f, 0x4a, 0xaa, 0x98, 0x92, 0x2d, 0x49, 0x32, 0x15, 0xa0, 0x92, 0xc5, 0x82, 0x51, 0x72, - 0x6c, 0xc1, 0x62, 0xa2, 0x7f, 0x00, 0x6b, 0xbe, 0x12, 0xd4, 0x6e, 0x47, 0xc4, 0x19, 0x9a, 0xae, - 0xab, 0xd4, 0xbd, 0x93, 0x26, 0x7e, 0x1f, 0xe6, 0x47, 0x44, 0x04, 0xa1, 0xf2, 0x16, 0x92, 0x9b, - 0x52, 0x19, 0xcc, 0xfa, 0x71, 0x1f, 0xee, 0x48, 0xe9, 0xdc, 0xa2, 0x89, 0xe2, 0xa3, 0x4a, 0xc9, - 0x6a, 0x60, 0x26, 0xa5, 0x1a, 0x98, 0x8d, 0xbc, 0xc5, 0x7c, 0xc4, 0x0d, 0x29, 0xcf, 0xfc, 0x4c, - 0xc9, 0xc5, 0x1e, 0xb7, 0xa9, 0xef, 0x2a, 0x66, 0x12, 0xf6, 0xd7, 0xc2, 0x0b, 0x7c, 0x55, 0x1e, - 0x9e, 0xb0, 0x19, 0xca, 0x87, 0x0e, 0xd9, 0xa4, 0x59, 0x33, 0x5d, 0x00, 0x5d, 0xad, 0x85, 0xce, - 0xeb, 0x21, 0x1a, 0x3e, 0x85, 0xe5, 0xb0, 0x5f, 0x9b, 0x49, 0x97, 0x65, 0xc8, 0x79, 0xf6, 0x05, - 0x91, 0xb1, 0x86, 0x37, 0xa4, 0xed, 0x7c, 0x9f, 0x37, 0x93, 0xed, 0x8c, 0x40, 0x18, 0x3b, 0x1d, - 0xb3, 0xea, 0x4b, 0x37, 0x96, 0xbc, 0x03, 0xf1, 0x06, 0x3e, 0x80, 0xd5, 0xa8, 0x67, 0x9b, 0x49, - 0xe5, 0x17, 0xfc, 0x2c, 0x25, 0x39, 0xbf, 0x99, 0xe4, 0x7e, 0x1c, 0xf8, 0x25, 0xc5, 0xb7, 0xcd, - 0x24, 0x52, 0x87, 0x66, 0x92, 0xab, 0xfb, 0x2a, 0x8e, 0x8e, 0xef, 0xf9, 0x66, 0x12, 0xe6, 0x06, - 0xc2, 0x66, 0x5f, 0xfe, 0xc0, 0x5d, 0x65, 0xa7, 0xba, 0x2b, 0x71, 0x48, 0x02, 0x87, 0xfa, 0x35, - 0x6c, 0x3a, 0x81, 0x11, 0xf8, 0xf2, 0x59, 0x31, 0x68, 0x38, 0xf3, 0x31, 0x58, 0x43, 0x6e, 0x6c, - 0x35, 0x02, 0xcc, 0xb4, 0x18, 0x9f, 0x04, 0x6e, 0x3c, 0x16, 0x24, 0x66, 0x12, 0xfc, 0x29, 0xac, - 0xa7, 0xc7, 0x87, 0x59, 0x24, 0x3f, 0x68, 0x41, 0xc9, 0xbf, 0x0c, 0x29, 0xdf, 0x9b, 0x95, 0xa1, - 0x70, 0x70, 0x78, 0x7c, 0xd4, 0xde, 0xee, 0xf0, 0x0f, 0xce, 0xb6, 0x0f, 0x75, 0xfd, 0xf9, 0x51, - 0xb7, 0x9e, 0xd9, 0xfa, 0x75, 0x16, 0x32, 0x7b, 0x2f, 0xd0, 0x67, 0x90, 0xe3, 0x5f, 0x5f, 0x4c, - 0xf9, 0xe4, 0xa6, 0x39, 0xed, 0x03, 0x13, 0x7c, 0xe3, 0xc7, 0xff, 0xf5, 0xeb, 0x9f, 0x67, 0x16, - 0x71, 0xa5, 0x35, 0xf9, 0x76, 0xeb, 0x62, 0xd2, 0x62, 0x61, 0xea, 0x91, 0xf6, 0x00, 0x7d, 0x0c, - 0xd9, 0xa3, 0xb1, 0x87, 0x52, 0x3f, 0xc5, 0x69, 0xa6, 0x7f, 0x73, 0x82, 0x57, 0x98, 0xd0, 0x05, - 0x0c, 0x42, 0xe8, 0x68, 0xec, 0x51, 0x91, 0x3f, 0x84, 0xb2, 0xfa, 0xc5, 0xc8, 0xb5, 0xdf, 0xe7, - 0x34, 0xaf, 0xff, 0x1a, 0x05, 0xdf, 0x66, 0x50, 0x37, 0x30, 0x12, 0x50, 0xfc, 0x9b, 0x16, 0x75, - 0x16, 0xdd, 0x4b, 0x0b, 0xa5, 0x7e, 0xbd, 0xd3, 0x4c, 0xff, 0x40, 0x25, 0x36, 0x0b, 0xef, 0xd2, - 0xa2, 0x22, 0xff, 0x44, 0x7c, 0x9b, 0xd2, 0xf3, 0xd0, 0x9d, 0x84, 0x6f, 0x13, 0xd4, 0x57, 0xf8, - 0xe6, 0x7a, 0x3a, 0x83, 0x00, 0xb9, 0xc5, 0x40, 0x56, 0xf1, 0xa2, 0x00, 0xe9, 0xf9, 0x2c, 0x8f, - 0xb4, 0x07, 0x5b, 0x3d, 0xc8, 0xb1, 0x17, 0x2e, 0xf4, 0xb9, 0xfc, 0xd1, 0x4c, 0x78, 0xea, 0x4b, - 0x59, 0xe8, 0xd0, 0xdb, 0x18, 0x5e, 0x66, 0x40, 0x35, 0x5c, 0xa2, 0x40, 0xec, 0x7d, 0xeb, 0x91, - 0xf6, 0x60, 0x43, 0x7b, 0x5f, 0xdb, 0xfa, 0x55, 0x0e, 0x72, 0xac, 0xb4, 0x8b, 0x2e, 0x00, 0x82, - 0xd7, 0x9e, 0xe8, 0xec, 0x62, 0xef, 0x47, 0xd1, 0xd9, 0xc5, 0x1f, 0x8a, 0x70, 0x93, 0x81, 0x2e, - 0xe3, 0x05, 0x0a, 0xca, 0x2a, 0xc6, 0x2d, 0x56, 0x04, 0xa7, 0x76, 0xfc, 0x1b, 0x4d, 0x54, 0xb6, - 0xf9, 0x59, 0x42, 0x49, 0xd2, 0x42, 0x4f, 0x3e, 0xd1, 0xed, 0x90, 0xf0, 0xdc, 0x83, 0xbf, 0xcb, - 0x00, 0x5b, 0xb8, 0x1e, 0x00, 0x3a, 0x8c, 0xe3, 0x91, 0xf6, 0xe0, 0xf3, 0x06, 0x5e, 0x12, 0x56, - 0x8e, 0xf4, 0xa0, 0x1f, 0x41, 0x2d, 0xfc, 0xa4, 0x81, 0xee, 0x26, 0x60, 0x45, 0x5f, 0x46, 0x9a, - 0x6f, 0x4d, 0x67, 0x12, 0x3a, 0xad, 0x31, 0x9d, 0x04, 0x38, 0x47, 0xbe, 0x20, 0x64, 0x64, 0x50, - 0x26, 0xb1, 0x06, 0xe8, 0x1f, 0x34, 0xf1, 0xe2, 0x14, 0xbc, 0x51, 0xa0, 0x24, 0xe9, 0xb1, 0x17, - 0x90, 0xe6, 0xbd, 0x6b, 0xb8, 0x84, 0x12, 0x7f, 0xc8, 0x94, 0xf8, 0x00, 0x2f, 0x07, 0x4a, 0x78, - 0xe6, 0x90, 0x78, 0xb6, 0xd0, 0xe2, 0xf3, 0x5b, 0xf8, 0x46, 0xc8, 0x38, 0xa1, 0xde, 0x60, 0xb1, - 0xf8, 0x3b, 0x43, 0xe2, 0x62, 0x85, 0xde, 0x2d, 0x12, 0x17, 0x2b, 0xfc, 0x48, 0x91, 0xb4, 0x58, - 0xfc, 0x55, 0x21, 0x69, 0xb1, 0xfc, 0x9e, 0xad, 0xff, 0x9b, 0x87, 0xc2, 0x36, 0xff, 0x26, 0x1c, - 0xd9, 0x50, 0xf2, 0xcb, 0xf4, 0x68, 0x2d, 0xa9, 0xce, 0x18, 0x5c, 0x6b, 0x9a, 0x77, 0x52, 0xfb, - 0x85, 0x42, 0x6f, 0x32, 0x85, 0xde, 0xc0, 0xab, 0x14, 0x59, 0x7c, 0x76, 0xde, 0xe2, 0xc5, 0xac, - 0x96, 0xd1, 0xef, 0x53, 0x43, 0xfc, 0x29, 0x54, 0xd4, 0x3a, 0x3a, 0x7a, 0x33, 0xb1, 0xb6, 0xa9, - 0x96, 0xe2, 0x9b, 0x78, 0x1a, 0x8b, 0x40, 0x7e, 0x8b, 0x21, 0xaf, 0xe1, 0x9b, 0x09, 0xc8, 0x0e, - 0x63, 0x0d, 0x81, 0xf3, 0x1a, 0x78, 0x32, 0x78, 0xa8, 0xc4, 0x9e, 0x0c, 0x1e, 0x2e, 0xa1, 0x4f, - 0x05, 0x1f, 0x33, 0x56, 0x0a, 0xee, 0x02, 0x04, 0x95, 0x6c, 0x94, 0x68, 0x4b, 0xe5, 0x5e, 0x17, - 0x75, 0x0e, 0xf1, 0x22, 0x38, 0xc6, 0x0c, 0x56, 0xec, 0xbb, 0x08, 0xec, 0xc0, 0x74, 0x3d, 0x7e, - 0x30, 0xab, 0xa1, 0xd2, 0x34, 0x4a, 0x9c, 0x4f, 0xb8, 0xbe, 0xdd, 0xbc, 0x3b, 0x95, 0x47, 0xa0, - 0xdf, 0x63, 0xe8, 0x77, 0x70, 0x33, 0x01, 0x7d, 0xc4, 0x79, 0xe9, 0x66, 0xfb, 0xff, 0x3c, 0x94, - 0x9f, 0x19, 0xa6, 0xe5, 0x11, 0xcb, 0xb0, 0x7a, 0x04, 0x9d, 0x42, 0x8e, 0x45, 0xea, 0xa8, 0x23, - 0x56, 0xcb, 0xb6, 0x51, 0x47, 0x1c, 0xaa, 0x69, 0xe2, 0x75, 0x06, 0xdc, 0xc4, 0x2b, 0x14, 0x78, - 0x18, 0x88, 0x6e, 0xb1, 0x52, 0x24, 0x9d, 0xf4, 0x4b, 0xc8, 0x8b, 0xd7, 0xbe, 0x88, 0xa0, 0x50, - 0xf1, 0xa7, 0x79, 0x2b, 0xb9, 0x33, 0x69, 0x2f, 0xab, 0x30, 0x2e, 0xe3, 0xa3, 0x38, 0x13, 0x80, - 0xa0, 0xc6, 0x1e, 0x5d, 0xd1, 0x58, 0x49, 0xbe, 0xb9, 0x9e, 0xce, 0x90, 0x64, 0x53, 0x15, 0xb3, - 0xef, 0xf3, 0x52, 0xdc, 0x3f, 0x86, 0xf9, 0xa7, 0x86, 0x7b, 0x8e, 0x22, 0xb1, 0x57, 0xf9, 0x56, - 0xac, 0xd9, 0x4c, 0xea, 0x12, 0x28, 0x77, 0x18, 0xca, 0x4d, 0xee, 0xca, 0x54, 0x94, 0x73, 0xc3, - 0xa5, 0x41, 0x0d, 0xf5, 0x21, 0xcf, 0x3f, 0x1d, 0x8b, 0xda, 0x2f, 0xf4, 0xf9, 0x59, 0xd4, 0x7e, - 0xe1, 0xaf, 0xcd, 0xae, 0x47, 0x19, 0x41, 0x51, 0x7e, 0xab, 0x85, 0x22, 0x0f, 0xf7, 0x91, 0xef, - 0xba, 0x9a, 0x6b, 0x69, 0xdd, 0x02, 0xeb, 0x2e, 0xc3, 0xba, 0x8d, 0x1b, 0xb1, 0xb5, 0x12, 0x9c, - 0x8f, 0xb4, 0x07, 0xef, 0x6b, 0xe8, 0x47, 0x00, 0xc1, 0xb3, 0x44, 0xec, 0x04, 0x46, 0x5f, 0x38, - 0x62, 0x27, 0x30, 0xf6, 0xa2, 0x81, 0x37, 0x19, 0xee, 0x06, 0xbe, 0x1b, 0xc5, 0xf5, 0x1c, 0xc3, - 0x72, 0x5f, 0x12, 0xe7, 0x3d, 0x5e, 0x65, 0x75, 0xcf, 0xcd, 0x11, 0x9d, 0xb2, 0x03, 0x25, 0xbf, - 0xea, 0x1c, 0xf5, 0xb6, 0xd1, 0x6a, 0x78, 0xd4, 0xdb, 0xc6, 0xca, 0xd5, 0x61, 0xb7, 0x13, 0xda, - 0x2d, 0x92, 0x95, 0x1e, 0xc0, 0x5f, 0xd4, 0x61, 0x9e, 0x66, 0xdd, 0x34, 0x39, 0x09, 0xea, 0x26, - 0xd1, 0xd9, 0xc7, 0xaa, 0xa8, 0xd1, 0xd9, 0xc7, 0x4b, 0x2e, 0xe1, 0xe4, 0x84, 0x5e, 0xb2, 0x5a, - 0xbc, 0x44, 0x41, 0x67, 0x6a, 0x43, 0x59, 0x29, 0xac, 0xa0, 0x04, 0x61, 0xe1, 0xf2, 0x6c, 0x34, - 0xdc, 0x25, 0x54, 0x65, 0xf0, 0x1b, 0x0c, 0x6f, 0x85, 0x87, 0x3b, 0x86, 0xd7, 0xe7, 0x1c, 0x14, - 0x50, 0xcc, 0x4e, 0x9c, 0xfb, 0x84, 0xd9, 0x85, 0xcf, 0xfe, 0x7a, 0x3a, 0x43, 0xea, 0xec, 0x82, - 0x83, 0xff, 0x0a, 0x2a, 0x6a, 0x79, 0x05, 0x25, 0x28, 0x1f, 0x29, 0x29, 0x47, 0xe3, 0x48, 0x52, - 0x75, 0x26, 0xec, 0xd9, 0x18, 0xa4, 0xa1, 0xb0, 0x51, 0xe0, 0x01, 0x14, 0x44, 0xbd, 0x25, 0xc9, - 0xa4, 0xe1, 0xf2, 0x73, 0x92, 0x49, 0x23, 0xc5, 0x9a, 0x70, 0xf6, 0xcc, 0x10, 0xe9, 0x95, 0x52, - 0xc6, 0x6a, 0x81, 0xf6, 0x84, 0x78, 0x69, 0x68, 0x41, 0x25, 0x33, 0x0d, 0x4d, 0xb9, 0xce, 0xa7, - 0xa1, 0x9d, 0x11, 0x4f, 0xf8, 0x03, 0x79, 0x4d, 0x46, 0x29, 0xc2, 0xd4, 0xf8, 0x88, 0xa7, 0xb1, - 0x24, 0x5d, 0x6e, 0x02, 0x40, 0x19, 0x1c, 0x2f, 0x01, 0x82, 0x6a, 0x50, 0x34, 0x63, 0x4d, 0xac, - 0x82, 0x47, 0x33, 0xd6, 0xe4, 0x82, 0x52, 0xd8, 0xf7, 0x05, 0xb8, 0xfc, 0x6e, 0x45, 0x91, 0x7f, - 0xa6, 0x01, 0x8a, 0x17, 0x8e, 0xd0, 0xc3, 0x64, 0xe9, 0x89, 0xb5, 0xf5, 0xe6, 0xbb, 0xaf, 0xc7, - 0x9c, 0x14, 0xce, 0x02, 0x95, 0x7a, 0x8c, 0x7b, 0xf4, 0x8a, 0x2a, 0xf5, 0x97, 0x1a, 0x54, 0x43, - 0x55, 0x27, 0x74, 0x3f, 0x65, 0x4d, 0x23, 0x25, 0xf7, 0xe6, 0xdb, 0xd7, 0xf2, 0x25, 0xa5, 0xf2, - 0xca, 0x0e, 0x90, 0x77, 0x9a, 0x9f, 0x68, 0x50, 0x0b, 0x57, 0xa9, 0x50, 0x8a, 0xec, 0x58, 0xc9, - 0xbe, 0xb9, 0x71, 0x3d, 0xe3, 0xf4, 0xe5, 0x09, 0xae, 0x33, 0x03, 0x28, 0x88, 0xba, 0x56, 0xd2, - 0xc6, 0x0f, 0x17, 0xfb, 0x93, 0x36, 0x7e, 0xa4, 0x28, 0x96, 0xb0, 0xf1, 0x1d, 0x7b, 0x40, 0x94, - 0x63, 0x26, 0x0a, 0x5f, 0x69, 0x68, 0xd3, 0x8f, 0x59, 0xa4, 0x6a, 0x96, 0x86, 0x16, 0x1c, 0x33, - 0x59, 0xf1, 0x42, 0x29, 0xc2, 0xae, 0x39, 0x66, 0xd1, 0x82, 0x59, 0xc2, 0x31, 0x63, 0x80, 0xca, - 0x31, 0x0b, 0x6a, 0x53, 0x49, 0xc7, 0x2c, 0xf6, 0x76, 0x91, 0x74, 0xcc, 0xe2, 0xe5, 0xad, 0x84, - 0x75, 0x64, 0xb8, 0xa1, 0x63, 0xb6, 0x94, 0x50, 0xc6, 0x42, 0xef, 0xa6, 0x18, 0x31, 0xf1, 0x49, - 0xa4, 0xf9, 0xde, 0x6b, 0x72, 0xa7, 0xee, 0x71, 0x6e, 0x7e, 0xb9, 0xc7, 0xff, 0x56, 0x83, 0xe5, - 0xa4, 0x12, 0x18, 0x4a, 0xc1, 0x49, 0x79, 0x4a, 0x69, 0x6e, 0xbe, 0x2e, 0xfb, 0x74, 0x6b, 0xf9, - 0xbb, 0xfe, 0x71, 0xfd, 0x5f, 0xbf, 0x5c, 0xd3, 0xfe, 0xe3, 0xcb, 0x35, 0xed, 0xbf, 0xbf, 0x5c, - 0xd3, 0xfe, 0xee, 0x7f, 0xd6, 0xe6, 0x4e, 0xf3, 0xec, 0x3f, 0x1a, 0x7f, 0xfb, 0x37, 0x01, 0x00, - 0x00, 0xff, 0xff, 0xee, 0x4f, 0x63, 0x90, 0xed, 0x3c, 0x00, 0x00, + // 4167 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0xdd, 0x73, 0x1b, 0x47, + 0x72, 0xe7, 0x02, 0x24, 0x40, 0x34, 0x3e, 0x08, 0x0e, 0x3f, 0x04, 0xc1, 0x12, 0x45, 0x8f, 0x2c, + 0x99, 0x96, 0x6c, 0xc2, 0xc7, 0xbb, 0x8b, 0xab, 0x94, 0xe4, 0x72, 0x10, 0x09, 0x4b, 0x34, 0x29, + 0x92, 0x5e, 0x42, 0xf2, 0x47, 0x5d, 0x05, 0xb5, 0x04, 0x86, 0xe0, 0x86, 0xc0, 0x2e, 0x6e, 0x77, + 0x01, 0x91, 0xca, 0xc7, 0xa5, 0xae, 0x2e, 0x57, 0xc9, 0xeb, 0xa5, 0x2a, 0x95, 0x3c, 0x24, 0x2f, + 0xa9, 0xd4, 0xd5, 0x3d, 0xdc, 0x73, 0xfe, 0x85, 0xbc, 0x24, 0x97, 0x54, 0xfe, 0x81, 0x94, 0x93, + 0x97, 0xe4, 0x8f, 0x48, 0x5d, 0xcd, 0xd7, 0xee, 0xec, 0x17, 0x29, 0x1b, 0xb6, 0x5f, 0x44, 0x4c, + 0x4f, 0x4f, 0xff, 0x7a, 0x7a, 0x66, 0xba, 0x7b, 0x7a, 0x56, 0x50, 0x70, 0x46, 0xdd, 0xcd, 0x91, + 0x63, 0x7b, 0x36, 0x2a, 0x11, 0xaf, 0xdb, 0x73, 0x89, 0x33, 0x21, 0xce, 0xe8, 0xa4, 0xbe, 0xdc, + 0xb7, 0xfb, 0x36, 0xeb, 0x68, 0xd0, 0x5f, 0x9c, 0xa7, 0x5e, 0xa3, 0x3c, 0x0d, 0x63, 0x64, 0x36, + 0x86, 0x93, 0x6e, 0x77, 0x74, 0xd2, 0x38, 0x9f, 0x88, 0x9e, 0xba, 0xdf, 0x63, 0x8c, 0xbd, 0xb3, + 0xd1, 0x09, 0xfb, 0x23, 0xfa, 0x6e, 0xf5, 0x6d, 0xbb, 0x3f, 0x20, 0xbc, 0xd7, 0xb2, 0x6c, 0xcf, + 0xf0, 0x4c, 0xdb, 0x72, 0x79, 0x2f, 0xfe, 0x0b, 0x0d, 0x2a, 0x3a, 0x71, 0x47, 0xb6, 0xe5, 0x92, + 0xa7, 0xc4, 0xe8, 0x11, 0x07, 0xdd, 0x06, 0xe8, 0x0e, 0xc6, 0xae, 0x47, 0x9c, 0x8e, 0xd9, 0xab, + 0x69, 0xeb, 0xda, 0xc6, 0xac, 0x5e, 0x10, 0x94, 0xdd, 0x1e, 0x7a, 0x03, 0x0a, 0x43, 0x32, 0x3c, + 0xe1, 0xbd, 0x19, 0xd6, 0x3b, 0xcf, 0x09, 0xbb, 0x3d, 0x54, 0x87, 0x79, 0x87, 0x4c, 0x4c, 0xd7, + 0xb4, 0xad, 0x5a, 0x76, 0x5d, 0xdb, 0xc8, 0xea, 0x7e, 0x9b, 0x0e, 0x74, 0x8c, 0x53, 0xaf, 0xe3, + 0x11, 0x67, 0x58, 0x9b, 0xe5, 0x03, 0x29, 0xa1, 0x4d, 0x9c, 0x21, 0xfe, 0xd9, 0x1c, 0x94, 0x74, + 0xc3, 0xea, 0x13, 0x9d, 0xfc, 0x78, 0x4c, 0x5c, 0x0f, 0x55, 0x21, 0x7b, 0x4e, 0x2e, 0x19, 0x7c, + 0x49, 0xa7, 0x3f, 0xf9, 0x78, 0xab, 0x4f, 0x3a, 0xc4, 0xe2, 0xc0, 0x25, 0x3a, 0xde, 0xea, 0x93, + 0x96, 0xd5, 0x43, 0xcb, 0x30, 0x37, 0x30, 0x87, 0xa6, 0x27, 0x50, 0x79, 0x23, 0xa4, 0xce, 0x6c, + 0x44, 0x9d, 0x6d, 0x00, 0xd7, 0x76, 0xbc, 0x8e, 0xed, 0xf4, 0x88, 0x53, 0x9b, 0x5b, 0xd7, 0x36, + 0x2a, 0x5b, 0x6f, 0x6d, 0xaa, 0xcb, 0xb0, 0xa9, 0x2a, 0xb4, 0x79, 0x6c, 0x3b, 0xde, 0x21, 0xe5, + 0xd5, 0x0b, 0xae, 0xfc, 0x89, 0x3e, 0x84, 0x22, 0x13, 0xe2, 0x19, 0x4e, 0x9f, 0x78, 0xb5, 0x1c, + 0x93, 0x72, 0xef, 0x1a, 0x29, 0x6d, 0xc6, 0xac, 0x33, 0x78, 0xfe, 0x1b, 0x61, 0x28, 0xb9, 0xc4, + 0x31, 0x8d, 0x81, 0xf9, 0xca, 0x38, 0x19, 0x90, 0x5a, 0x7e, 0x5d, 0xdb, 0x98, 0xd7, 0x43, 0x34, + 0x3a, 0xff, 0x73, 0x72, 0xe9, 0x76, 0x6c, 0x6b, 0x70, 0x59, 0x9b, 0x67, 0x0c, 0xf3, 0x94, 0x70, + 0x68, 0x0d, 0x2e, 0xd9, 0xa2, 0xd9, 0x63, 0xcb, 0xe3, 0xbd, 0x05, 0xd6, 0x5b, 0x60, 0x14, 0xd6, + 0xbd, 0x01, 0xd5, 0xa1, 0x69, 0x75, 0x86, 0x76, 0xaf, 0xe3, 0x1b, 0x04, 0x98, 0x41, 0x2a, 0x43, + 0xd3, 0x7a, 0x66, 0xf7, 0x74, 0x69, 0x16, 0xca, 0x69, 0x5c, 0x84, 0x39, 0x8b, 0x82, 0xd3, 0xb8, + 0x50, 0x39, 0x37, 0x61, 0x89, 0xca, 0xec, 0x3a, 0xc4, 0xf0, 0x48, 0xc0, 0x5c, 0x62, 0xcc, 0x8b, + 0x43, 0xd3, 0xda, 0x66, 0x3d, 0x21, 0x7e, 0xe3, 0x22, 0xc6, 0x5f, 0x16, 0xfc, 0xc6, 0x45, 0x98, + 0x1f, 0x6f, 0x42, 0xc1, 0xb7, 0x39, 0x9a, 0x87, 0xd9, 0x83, 0xc3, 0x83, 0x56, 0x75, 0x06, 0x01, + 0xe4, 0x9a, 0xc7, 0xdb, 0xad, 0x83, 0x9d, 0xaa, 0x86, 0x8a, 0x90, 0xdf, 0x69, 0xf1, 0x46, 0x06, + 0x3f, 0x06, 0x08, 0xac, 0x8b, 0xf2, 0x90, 0xdd, 0x6b, 0x7d, 0x56, 0x9d, 0xa1, 0x3c, 0x2f, 0x5a, + 0xfa, 0xf1, 0xee, 0xe1, 0x41, 0x55, 0xa3, 0x83, 0xb7, 0xf5, 0x56, 0xb3, 0xdd, 0xaa, 0x66, 0x28, + 0xc7, 0xb3, 0xc3, 0x9d, 0x6a, 0x16, 0x15, 0x60, 0xee, 0x45, 0x73, 0xff, 0x79, 0xab, 0x3a, 0x8b, + 0x7f, 0xa3, 0x41, 0x59, 0xac, 0x17, 0x3f, 0x13, 0xe8, 0x7b, 0x90, 0x3b, 0x63, 0xe7, 0x82, 0x6d, + 0xc5, 0xe2, 0xd6, 0xad, 0xc8, 0xe2, 0x86, 0xce, 0x8e, 0x2e, 0x78, 0x11, 0x86, 0xec, 0xf9, 0xc4, + 0xad, 0x65, 0xd6, 0xb3, 0x1b, 0xc5, 0xad, 0xea, 0x26, 0x3f, 0xaf, 0x9b, 0x7b, 0xe4, 0xf2, 0x85, + 0x31, 0x18, 0x13, 0x9d, 0x76, 0x22, 0x04, 0xb3, 0x43, 0xdb, 0x21, 0x6c, 0xc7, 0xce, 0xeb, 0xec, + 0x37, 0xdd, 0xc6, 0x6c, 0xd1, 0xc4, 0x6e, 0xe5, 0x0d, 0xba, 0xf2, 0xee, 0xf8, 0xa4, 0xc3, 0x7b, + 0x08, 0xdf, 0xc7, 0xee, 0xf8, 0x64, 0x9b, 0x75, 0xde, 0x06, 0xf0, 0x6c, 0xcf, 0x18, 0x74, 0x5c, + 0xf3, 0x15, 0xa9, 0x9d, 0xb2, 0xde, 0x02, 0xa3, 0x1c, 0x9b, 0xaf, 0x08, 0xfe, 0x95, 0x06, 0x70, + 0x34, 0xf6, 0xd2, 0x8f, 0xd5, 0x32, 0xcc, 0x4d, 0xa8, 0x52, 0xe2, 0x48, 0xf1, 0x06, 0x3b, 0x4f, + 0xc4, 0x70, 0x89, 0x7f, 0x9e, 0x68, 0x03, 0xdd, 0x80, 0xfc, 0xc8, 0x21, 0x93, 0xce, 0xf9, 0x84, + 0x29, 0x38, 0xaf, 0xe7, 0x68, 0x73, 0x6f, 0x82, 0xde, 0x84, 0x92, 0xd9, 0xb7, 0x6c, 0x87, 0x74, + 0xb8, 0xac, 0x39, 0xd6, 0x5b, 0xe4, 0x34, 0x36, 0x67, 0x85, 0x85, 0x0b, 0xce, 0xa9, 0x2c, 0xfb, + 0x94, 0x84, 0x2d, 0x28, 0x32, 0x55, 0xa7, 0x32, 0xfd, 0x3b, 0x81, 0x8e, 0x19, 0x36, 0x2c, 0x6e, + 0x7e, 0xa1, 0x35, 0xfe, 0x11, 0xa0, 0x1d, 0x32, 0x20, 0x1e, 0x99, 0xc6, 0xf3, 0x28, 0x36, 0xc9, + 0xaa, 0x36, 0xc1, 0xbf, 0xd0, 0x60, 0x29, 0x24, 0x7e, 0xaa, 0x69, 0xd5, 0x20, 0xdf, 0x63, 0xc2, + 0xb8, 0x06, 0x59, 0x5d, 0x36, 0xd1, 0x43, 0x98, 0x17, 0x0a, 0xb8, 0xb5, 0x6c, 0xca, 0x86, 0xcb, + 0x73, 0x9d, 0x5c, 0xfc, 0xab, 0x0c, 0x14, 0xc4, 0x44, 0x0f, 0x47, 0xa8, 0x09, 0x65, 0x87, 0x37, + 0x3a, 0x6c, 0x3e, 0x42, 0xa3, 0x7a, 0xba, 0x03, 0x7b, 0x3a, 0xa3, 0x97, 0xc4, 0x10, 0x46, 0x46, + 0xbf, 0x0b, 0x45, 0x29, 0x62, 0x34, 0xf6, 0x84, 0xc9, 0x6b, 0x61, 0x01, 0xc1, 0xfe, 0x7b, 0x3a, + 0xa3, 0x83, 0x60, 0x3f, 0x1a, 0x7b, 0xa8, 0x0d, 0xcb, 0x72, 0x30, 0x9f, 0x8d, 0x50, 0x23, 0xcb, + 0xa4, 0xac, 0x87, 0xa5, 0xc4, 0x97, 0xea, 0xe9, 0x8c, 0x8e, 0xc4, 0x78, 0xa5, 0x53, 0x55, 0xc9, + 0xbb, 0xe0, 0x8e, 0x3f, 0xa6, 0x52, 0xfb, 0xc2, 0x8a, 0xab, 0xd4, 0xbe, 0xb0, 0x1e, 0x17, 0x20, + 0x2f, 0x5a, 0xf8, 0x9f, 0x33, 0x00, 0x72, 0x35, 0x0e, 0x47, 0x68, 0x07, 0x2a, 0x8e, 0x68, 0x85, + 0xac, 0xf5, 0x46, 0xa2, 0xb5, 0xc4, 0x22, 0xce, 0xe8, 0x65, 0x39, 0x88, 0x2b, 0xf7, 0x03, 0x28, + 0xf9, 0x52, 0x02, 0x83, 0xdd, 0x4c, 0x30, 0x98, 0x2f, 0xa1, 0x28, 0x07, 0x50, 0x93, 0x7d, 0x02, + 0x2b, 0xfe, 0xf8, 0x04, 0x9b, 0xbd, 0x79, 0x85, 0xcd, 0x7c, 0x81, 0x4b, 0x52, 0x82, 0x6a, 0x35, + 0x55, 0xb1, 0xc0, 0x6c, 0x37, 0x13, 0xcc, 0x16, 0x57, 0x8c, 0x1a, 0x0e, 0x68, 0xac, 0xe5, 0x4d, + 0xfc, 0xbf, 0x59, 0xc8, 0x6f, 0xdb, 0xc3, 0x91, 0xe1, 0xd0, 0xd5, 0xc8, 0x39, 0xc4, 0x1d, 0x0f, + 0x3c, 0x66, 0xae, 0xca, 0xd6, 0xdd, 0xb0, 0x44, 0xc1, 0x26, 0xff, 0xea, 0x8c, 0x55, 0x17, 0x43, + 0xe8, 0x60, 0x11, 0x5a, 0x33, 0xaf, 0x31, 0x58, 0x04, 0x56, 0x31, 0x44, 0x1e, 0xe4, 0x6c, 0x70, + 0x90, 0xeb, 0x90, 0x9f, 0x10, 0x27, 0x48, 0x07, 0x9e, 0xce, 0xe8, 0x92, 0x80, 0xde, 0x81, 0x85, + 0x68, 0x68, 0x9a, 0x13, 0x3c, 0x95, 0x6e, 0x38, 0x92, 0xdd, 0x85, 0x52, 0x28, 0x3e, 0xe6, 0x04, + 0x5f, 0x71, 0xa8, 0x84, 0xc7, 0x55, 0xe9, 0x57, 0x69, 0x2c, 0x2f, 0x3d, 0x9d, 0x91, 0x9e, 0x75, + 0x55, 0x7a, 0xd6, 0x79, 0x31, 0x4a, 0xf8, 0xd6, 0x90, 0x93, 0xf9, 0x61, 0xd8, 0xc9, 0xe0, 0x1f, + 0x42, 0x39, 0x64, 0x20, 0x1a, 0xb3, 0x5a, 0x1f, 0x3f, 0x6f, 0xee, 0xf3, 0x00, 0xf7, 0x84, 0xc5, + 0x34, 0xbd, 0xaa, 0xd1, 0x38, 0xb9, 0xdf, 0x3a, 0x3e, 0xae, 0x66, 0x50, 0x19, 0x0a, 0x07, 0x87, + 0xed, 0x0e, 0xe7, 0xca, 0xe2, 0x27, 0xbe, 0x04, 0x11, 0x20, 0x95, 0xb8, 0x38, 0xa3, 0xc4, 0x45, + 0x4d, 0xc6, 0xc5, 0x4c, 0x10, 0x17, 0x59, 0x88, 0xdc, 0x6f, 0x35, 0x8f, 0x5b, 0xd5, 0xd9, 0xc7, + 0x15, 0x28, 0x71, 0xfb, 0x76, 0xc6, 0x16, 0x0d, 0xd3, 0xff, 0xa8, 0x01, 0x04, 0xa7, 0x09, 0x35, + 0x20, 0xdf, 0xe5, 0x38, 0x35, 0x8d, 0x39, 0xa3, 0x95, 0xc4, 0x25, 0xd3, 0x25, 0x17, 0xfa, 0x0e, + 0xe4, 0xdd, 0x71, 0xb7, 0x4b, 0x5c, 0x19, 0x2e, 0x6f, 0x44, 0xfd, 0xa1, 0xf0, 0x56, 0xba, 0xe4, + 0xa3, 0x43, 0x4e, 0x0d, 0x73, 0x30, 0x66, 0xc1, 0xf3, 0xea, 0x21, 0x82, 0x0f, 0xff, 0x9d, 0x06, + 0x45, 0x65, 0xf3, 0x7e, 0x45, 0x27, 0x7c, 0x8b, 0x06, 0xe2, 0x6e, 0x97, 0x90, 0x9e, 0x70, 0xc3, + 0xf3, 0x7a, 0x40, 0x40, 0xbf, 0x03, 0x05, 0x79, 0x02, 0xa4, 0x27, 0xae, 0x25, 0x8b, 0x3d, 0x1c, + 0xe9, 0x01, 0x2b, 0xde, 0x83, 0x45, 0x66, 0x95, 0x2e, 0x4d, 0xcc, 0xa5, 0x1d, 0xd5, 0xd4, 0x55, + 0x8b, 0xa4, 0xae, 0x75, 0x98, 0x1f, 0x9d, 0x5d, 0xba, 0x66, 0xd7, 0x18, 0x08, 0x2d, 0xfc, 0x36, + 0xfe, 0x08, 0x90, 0x2a, 0x6c, 0x9a, 0xe9, 0xe2, 0x32, 0x14, 0x9f, 0x1a, 0xee, 0x99, 0x50, 0x09, + 0x3f, 0x84, 0x32, 0x6d, 0xee, 0xbd, 0x78, 0x0d, 0x1d, 0xd9, 0xc5, 0x42, 0x72, 0x4f, 0x65, 0x73, + 0x04, 0xb3, 0x67, 0x86, 0x7b, 0xc6, 0x26, 0x5a, 0xd6, 0xd9, 0x6f, 0xf4, 0x0e, 0x54, 0xbb, 0x7c, + 0x92, 0x9d, 0xc8, 0x75, 0x63, 0x41, 0xd0, 0xfd, 0x2c, 0xf2, 0x53, 0x28, 0xf1, 0x39, 0x7c, 0xdd, + 0x4a, 0xe0, 0x45, 0x58, 0x38, 0xb6, 0x8c, 0x91, 0x7b, 0x66, 0xcb, 0xe8, 0x46, 0x27, 0x5d, 0x0d, + 0x68, 0x53, 0x21, 0xbe, 0x0d, 0x0b, 0x0e, 0x19, 0x1a, 0xa6, 0x65, 0x5a, 0xfd, 0xce, 0xc9, 0xa5, + 0x47, 0x5c, 0x71, 0xd9, 0xaa, 0xf8, 0xe4, 0xc7, 0x94, 0x4a, 0x55, 0x3b, 0x19, 0xd8, 0x27, 0xc2, + 0xcd, 0xb1, 0xdf, 0xf8, 0xe7, 0x19, 0x28, 0x7d, 0x62, 0x78, 0x5d, 0xb9, 0x74, 0x68, 0x17, 0x2a, + 0xbe, 0x73, 0x63, 0x14, 0xa1, 0x4b, 0x24, 0xc4, 0xb2, 0x31, 0x32, 0x0d, 0x97, 0xd1, 0xb1, 0xdc, + 0x55, 0x09, 0x4c, 0x94, 0x61, 0x75, 0xc9, 0xc0, 0x17, 0x95, 0x49, 0x17, 0xc5, 0x18, 0x55, 0x51, + 0x2a, 0x01, 0x1d, 0x42, 0x75, 0xe4, 0xd8, 0x7d, 0x87, 0xb8, 0xae, 0x2f, 0x8c, 0x87, 0x31, 0x9c, + 0x20, 0xec, 0x48, 0xb0, 0x06, 0xe2, 0x16, 0x46, 0x61, 0xd2, 0xe3, 0x85, 0x20, 0x9f, 0xe1, 0xce, + 0xe9, 0x3f, 0x32, 0x80, 0xe2, 0x93, 0xfa, 0xb2, 0x29, 0xde, 0x3d, 0xa8, 0xb8, 0x9e, 0xe1, 0xc4, + 0x36, 0x5b, 0x99, 0x51, 0x7d, 0x8f, 0xff, 0x36, 0xf8, 0x0a, 0x75, 0x2c, 0xdb, 0x33, 0x4f, 0x2f, + 0x45, 0x96, 0x5c, 0x91, 0xe4, 0x03, 0x46, 0x45, 0x2d, 0xc8, 0x9f, 0x9a, 0x03, 0x8f, 0x38, 0x6e, + 0x6d, 0x6e, 0x3d, 0xbb, 0x51, 0xd9, 0x7a, 0x78, 0xdd, 0x32, 0x6c, 0x7e, 0xc8, 0xf8, 0xdb, 0x97, + 0x23, 0xa2, 0xcb, 0xb1, 0x6a, 0xe6, 0x99, 0x0b, 0x65, 0xe3, 0x37, 0x61, 0xfe, 0x25, 0x15, 0x41, + 0x6f, 0xe8, 0x79, 0x9e, 0x2c, 0xb2, 0x36, 0xbf, 0xa0, 0x9f, 0x3a, 0x46, 0x7f, 0x48, 0x2c, 0x4f, + 0xde, 0x21, 0x65, 0x1b, 0xdf, 0x03, 0x08, 0x60, 0xa8, 0xcb, 0x3f, 0x38, 0x3c, 0x7a, 0xde, 0xae, + 0xce, 0xa0, 0x12, 0xcc, 0x1f, 0x1c, 0xee, 0xb4, 0xf6, 0x5b, 0x34, 0x3e, 0xe0, 0x86, 0x34, 0x69, + 0x68, 0x2d, 0x55, 0x4c, 0x2d, 0x84, 0x89, 0x57, 0x61, 0x39, 0x69, 0x01, 0x69, 0x2e, 0x5a, 0x16, + 0xbb, 0x74, 0xaa, 0xa3, 0xa2, 0x42, 0x67, 0xc2, 0xd3, 0xad, 0x41, 0x9e, 0xef, 0xde, 0x9e, 0x48, + 0xce, 0x65, 0x93, 0x1a, 0x82, 0x6f, 0x46, 0xd2, 0x13, 0xab, 0xe4, 0xb7, 0x13, 0xdd, 0xcb, 0x5c, + 0xa2, 0x7b, 0x41, 0x77, 0xa1, 0xec, 0x9f, 0x06, 0xc3, 0x15, 0xb9, 0x40, 0x41, 0x2f, 0xc9, 0x8d, + 0x4e, 0x69, 0x21, 0xa3, 0xe7, 0xc3, 0x46, 0x47, 0xf7, 0x20, 0x47, 0x26, 0xc4, 0xf2, 0xdc, 0x5a, + 0x91, 0x45, 0x8c, 0xb2, 0xcc, 0xdd, 0x5b, 0x94, 0xaa, 0x8b, 0x4e, 0xfc, 0x7d, 0x58, 0x64, 0x77, + 0xa4, 0x27, 0x8e, 0x61, 0xa9, 0x97, 0xb9, 0x76, 0x7b, 0x5f, 0x98, 0x9b, 0xfe, 0x44, 0x15, 0xc8, + 0xec, 0xee, 0x08, 0x23, 0x64, 0x76, 0x77, 0xf0, 0x4f, 0x35, 0x40, 0xea, 0xb8, 0xa9, 0xec, 0x1c, + 0x11, 0x2e, 0xe1, 0xb3, 0x01, 0xfc, 0x32, 0xcc, 0x11, 0xc7, 0xb1, 0x1d, 0x66, 0xd1, 0x82, 0xce, + 0x1b, 0xf8, 0x2d, 0xa1, 0x83, 0x4e, 0x26, 0xf6, 0xb9, 0x7f, 0x06, 0xb9, 0x34, 0xcd, 0x57, 0x75, + 0x0f, 0x96, 0x42, 0x5c, 0x53, 0x45, 0xae, 0x0f, 0x61, 0x81, 0x09, 0xdb, 0x3e, 0x23, 0xdd, 0xf3, + 0x91, 0x6d, 0x5a, 0x31, 0x3c, 0xba, 0x72, 0x81, 0x83, 0xa5, 0xf3, 0xe0, 0x13, 0x2b, 0xf9, 0xc4, + 0x76, 0x7b, 0x1f, 0x7f, 0x06, 0xab, 0x11, 0x39, 0x52, 0xfd, 0x3f, 0x80, 0x62, 0xd7, 0x27, 0xba, + 0x22, 0xd7, 0xb9, 0x1d, 0x56, 0x2e, 0x3a, 0x54, 0x1d, 0x81, 0x0f, 0xe1, 0x46, 0x4c, 0xf4, 0x54, + 0x73, 0x7e, 0x1b, 0x56, 0x98, 0xc0, 0x3d, 0x42, 0x46, 0xcd, 0x81, 0x39, 0x49, 0xb5, 0xf4, 0x48, + 0x4c, 0x4a, 0x61, 0xfc, 0x66, 0xf7, 0x05, 0xfe, 0x3d, 0x81, 0xd8, 0x36, 0x87, 0xa4, 0x6d, 0xef, + 0xa7, 0xeb, 0x46, 0xa3, 0xd9, 0x39, 0xb9, 0x74, 0x45, 0x5a, 0xc3, 0x7e, 0xe3, 0x7f, 0xd2, 0x84, + 0xa9, 0xd4, 0xe1, 0xdf, 0xf0, 0x4e, 0x5e, 0x03, 0xe8, 0xd3, 0x23, 0x43, 0x7a, 0xb4, 0x83, 0x57, + 0x63, 0x14, 0x8a, 0xaf, 0x27, 0xf5, 0xdf, 0x25, 0xa1, 0xe7, 0xb2, 0xd8, 0xe7, 0xec, 0x1f, 0xdf, + 0xcb, 0xdd, 0x86, 0x22, 0x23, 0x1c, 0x7b, 0x86, 0x37, 0x76, 0x63, 0x8b, 0xf1, 0x67, 0x62, 0xdb, + 0xcb, 0x41, 0x53, 0xcd, 0xeb, 0x3b, 0x90, 0x63, 0x97, 0x09, 0x99, 0x4a, 0xdf, 0x4c, 0xd8, 0x8f, + 0x5c, 0x0f, 0x5d, 0x30, 0xe2, 0x9f, 0x6b, 0x90, 0x7b, 0xc6, 0xca, 0xb7, 0x8a, 0x6a, 0xb3, 0x72, + 0x2d, 0x2c, 0x63, 0xc8, 0x0b, 0x43, 0x05, 0x9d, 0xfd, 0x66, 0xa9, 0x27, 0x21, 0xce, 0x73, 0x7d, + 0x9f, 0xa7, 0xb8, 0x05, 0xdd, 0x6f, 0x53, 0x9b, 0x75, 0x07, 0x26, 0xb1, 0x3c, 0xd6, 0x3b, 0xcb, + 0x7a, 0x15, 0x0a, 0xcd, 0x9e, 0x4d, 0x77, 0x9f, 0x18, 0x8e, 0x25, 0x0a, 0xae, 0xf3, 0x7a, 0x40, + 0xc0, 0xfb, 0x50, 0xe5, 0x7a, 0x34, 0x7b, 0x3d, 0x25, 0xc1, 0xf4, 0xd1, 0xb4, 0x08, 0x5a, 0x48, + 0x5a, 0x26, 0x2a, 0xed, 0x97, 0x1a, 0x2c, 0x2a, 0xe2, 0xa6, 0xb2, 0xea, 0xbb, 0x90, 0xe3, 0x05, + 0x6e, 0x91, 0xe9, 0x2c, 0x87, 0x47, 0x71, 0x18, 0x5d, 0xf0, 0xa0, 0x4d, 0xc8, 0xf3, 0x5f, 0xf2, + 0x0e, 0x90, 0xcc, 0x2e, 0x99, 0xf0, 0x3d, 0x58, 0x12, 0x24, 0x32, 0xb4, 0x93, 0x0e, 0x06, 0x5b, + 0x0c, 0xfc, 0x27, 0xb0, 0x1c, 0x66, 0x9b, 0x6a, 0x4a, 0x8a, 0x92, 0x99, 0xd7, 0x51, 0xb2, 0x29, + 0x95, 0x7c, 0x3e, 0xea, 0x29, 0x79, 0x54, 0x74, 0xc7, 0xa8, 0xeb, 0x95, 0x09, 0xaf, 0x57, 0x30, + 0x01, 0x29, 0xe2, 0x5b, 0x9d, 0xc0, 0x07, 0x72, 0x3b, 0xec, 0x9b, 0xae, 0xef, 0xc3, 0x31, 0x94, + 0x06, 0xa6, 0x45, 0x0c, 0x47, 0x54, 0xdd, 0x35, 0x5e, 0x75, 0x57, 0x69, 0xf8, 0x15, 0x20, 0x75, + 0xe0, 0xb7, 0xaa, 0xf4, 0x7d, 0x69, 0xb2, 0x23, 0xc7, 0x1e, 0xda, 0xa9, 0x66, 0xc7, 0x7f, 0x0a, + 0x2b, 0x11, 0xbe, 0x6f, 0x55, 0xcd, 0x25, 0x58, 0xdc, 0x21, 0x32, 0xa1, 0x91, 0x6e, 0xef, 0x23, + 0x40, 0x2a, 0x71, 0xaa, 0xc8, 0xd6, 0x80, 0xc5, 0x67, 0xf6, 0x84, 0xba, 0x48, 0x4a, 0x0d, 0x7c, + 0x03, 0xaf, 0x43, 0xf8, 0xa6, 0xf0, 0xdb, 0x14, 0x5c, 0x1d, 0x30, 0x15, 0xf8, 0x6f, 0x34, 0x28, + 0x35, 0x07, 0x86, 0x33, 0x94, 0xc0, 0x3f, 0x80, 0x1c, 0xbf, 0x5d, 0x8b, 0x82, 0xd6, 0xfd, 0xb0, + 0x18, 0x95, 0x97, 0x37, 0x9a, 0xfc, 0x2e, 0x2e, 0x46, 0x51, 0xc5, 0xc5, 0x7b, 0xd9, 0x4e, 0xe4, + 0xfd, 0x6c, 0x07, 0xbd, 0x07, 0x73, 0x06, 0x1d, 0xc2, 0x42, 0x51, 0x25, 0x5a, 0xd7, 0x60, 0xd2, + 0xd8, 0x1d, 0x80, 0x73, 0xe1, 0xef, 0x41, 0x51, 0x41, 0x40, 0x79, 0xc8, 0x3e, 0x69, 0x89, 0x84, + 0xbd, 0xb9, 0xdd, 0xde, 0x7d, 0xc1, 0x0b, 0x3a, 0x15, 0x80, 0x9d, 0x96, 0xdf, 0xce, 0xe0, 0x4f, + 0xc5, 0x28, 0xe1, 0xf6, 0x55, 0x7d, 0xb4, 0x34, 0x7d, 0x32, 0xaf, 0xa5, 0xcf, 0x05, 0x94, 0xc5, + 0xf4, 0xa7, 0x0d, 0x63, 0x4c, 0x5e, 0x4a, 0x18, 0x53, 0x94, 0xd7, 0x05, 0x23, 0xfe, 0xb5, 0x06, + 0xd5, 0x1d, 0xfb, 0xa5, 0xd5, 0x77, 0x8c, 0x9e, 0x7f, 0x4e, 0x3e, 0x8c, 0xac, 0xd4, 0x66, 0xa4, + 0x38, 0x1a, 0xe1, 0x0f, 0x08, 0x91, 0x15, 0xab, 0x05, 0x65, 0x43, 0x1e, 0x0b, 0x65, 0x13, 0x7f, + 0x00, 0x0b, 0x91, 0x41, 0xd4, 0xf6, 0x2f, 0x9a, 0xfb, 0xbb, 0x3b, 0xd4, 0xd6, 0xac, 0xb0, 0xd6, + 0x3a, 0x68, 0x3e, 0xde, 0x6f, 0x89, 0xc7, 0xa7, 0xe6, 0xc1, 0x76, 0x6b, 0xbf, 0x9a, 0xc1, 0x5d, + 0x58, 0x54, 0xe0, 0xa7, 0x7d, 0x19, 0x48, 0xd1, 0x6e, 0x01, 0xca, 0x22, 0xda, 0x8b, 0x43, 0xf9, + 0x6f, 0x19, 0xa8, 0x48, 0xca, 0x37, 0x83, 0x89, 0x56, 0x21, 0xd7, 0x3b, 0x39, 0x36, 0x5f, 0xc9, + 0x97, 0x23, 0xd1, 0xa2, 0xf4, 0x01, 0xc7, 0xe1, 0x4f, 0xbf, 0xa2, 0x45, 0xc3, 0xb8, 0x63, 0x9c, + 0x7a, 0xbb, 0x56, 0x8f, 0x5c, 0xb0, 0xa4, 0x60, 0x56, 0x0f, 0x08, 0xac, 0xc2, 0x24, 0x9e, 0x88, + 0xd9, 0xcd, 0x4a, 0x79, 0x32, 0x46, 0x0f, 0xa0, 0x4a, 0x7f, 0x37, 0x47, 0xa3, 0x81, 0x49, 0x7a, + 0x5c, 0x40, 0x9e, 0xf1, 0xc4, 0xe8, 0x14, 0x9d, 0xdd, 0x45, 0xdc, 0xda, 0x3c, 0x0b, 0x4b, 0xa2, + 0x85, 0xd6, 0xa1, 0xc8, 0xf5, 0xdb, 0xb5, 0x9e, 0xbb, 0x84, 0xbd, 0x9b, 0x66, 0x75, 0x95, 0x14, + 0x4e, 0x33, 0x20, 0x9a, 0x66, 0x2c, 0xc1, 0x62, 0x73, 0xec, 0x9d, 0xb5, 0x2c, 0x1a, 0x2b, 0xa4, + 0x95, 0x97, 0x01, 0x51, 0xe2, 0x8e, 0xe9, 0xaa, 0x54, 0xc1, 0x1a, 0x5e, 0x90, 0x16, 0x2c, 0x51, + 0x22, 0xb1, 0x3c, 0xb3, 0xab, 0xc4, 0x55, 0x99, 0x79, 0x69, 0x91, 0xcc, 0xcb, 0x70, 0xdd, 0x97, + 0xb6, 0xd3, 0x13, 0x36, 0xf7, 0xdb, 0xf8, 0x1f, 0x34, 0x0e, 0xf9, 0xdc, 0x0d, 0xa5, 0x4f, 0x5f, + 0x52, 0x0c, 0x7a, 0x1f, 0xf2, 0xf6, 0x88, 0x7d, 0x1d, 0x20, 0xca, 0x30, 0xab, 0x9b, 0xfc, 0x7b, + 0x82, 0x4d, 0x21, 0xf8, 0x90, 0xf7, 0xea, 0x92, 0x0d, 0xdd, 0x87, 0xca, 0x99, 0xe1, 0x9e, 0x91, + 0xde, 0x91, 0x94, 0xc9, 0x6f, 0x7e, 0x11, 0x2a, 0xde, 0x08, 0xf4, 0x7b, 0x42, 0xbc, 0x2b, 0xf4, + 0xc3, 0x0f, 0x61, 0x45, 0x72, 0x8a, 0xd7, 0x89, 0x2b, 0x98, 0x5f, 0xc2, 0x6d, 0xc9, 0xbc, 0x7d, + 0x66, 0x58, 0x7d, 0x22, 0x01, 0xbf, 0xaa, 0x05, 0xe2, 0xf3, 0xc9, 0x26, 0xce, 0xe7, 0x31, 0xd4, + 0xfc, 0xf9, 0xb0, 0x9b, 0xb5, 0x3d, 0x50, 0x15, 0x1d, 0xbb, 0xe2, 0x3c, 0x15, 0x74, 0xf6, 0x9b, + 0xd2, 0x1c, 0x7b, 0xe0, 0xa7, 0xd2, 0xf4, 0x37, 0xde, 0x86, 0x9b, 0x52, 0x86, 0xb8, 0xf3, 0x86, + 0x85, 0xc4, 0x14, 0x4f, 0x12, 0x22, 0x0c, 0x4b, 0x87, 0x5e, 0xbd, 0xf0, 0x2a, 0x67, 0x78, 0x09, + 0x98, 0x4c, 0x4d, 0x91, 0xb9, 0xc2, 0x37, 0x25, 0x55, 0x4c, 0xc9, 0x96, 0x24, 0x99, 0x0a, 0x50, + 0xc9, 0x62, 0xc1, 0x28, 0x39, 0xb6, 0x60, 0x31, 0xd1, 0x3f, 0x82, 0x35, 0x5f, 0x09, 0x6a, 0xb7, + 0x23, 0xe2, 0x0c, 0x4d, 0xd7, 0x55, 0xea, 0xde, 0x49, 0x13, 0xbf, 0x0f, 0xb3, 0x23, 0x22, 0x82, + 0x50, 0x71, 0x0b, 0xc9, 0x4d, 0xa9, 0x0c, 0x66, 0xfd, 0xb8, 0x07, 0x77, 0xa4, 0x74, 0x6e, 0xd1, + 0x44, 0xf1, 0x51, 0xa5, 0x64, 0x35, 0x30, 0x93, 0x52, 0x0d, 0xcc, 0x46, 0xde, 0x62, 0x3e, 0xe2, + 0x86, 0x94, 0x67, 0x7e, 0xaa, 0xe4, 0x62, 0x8f, 0xdb, 0xd4, 0x77, 0x15, 0x53, 0x09, 0xfb, 0x4b, + 0xe1, 0x05, 0xbe, 0x2e, 0x0f, 0x4f, 0xd8, 0x0c, 0xe5, 0x43, 0x87, 0x6c, 0xd2, 0xac, 0x99, 0x2e, + 0x80, 0xae, 0xd6, 0x42, 0x67, 0xf5, 0x10, 0x0d, 0x9f, 0xc0, 0x72, 0xd8, 0xaf, 0x4d, 0xa5, 0xcb, + 0x32, 0xcc, 0x79, 0xf6, 0x39, 0x91, 0xb1, 0x86, 0x37, 0xa4, 0xed, 0x7c, 0x9f, 0x37, 0x95, 0xed, + 0x8c, 0x40, 0x18, 0x3b, 0x1d, 0xd3, 0xea, 0x4b, 0x37, 0x96, 0xbc, 0x03, 0xf1, 0x06, 0x3e, 0x80, + 0xd5, 0xa8, 0x67, 0x9b, 0x4a, 0xe5, 0x17, 0xfc, 0x2c, 0x25, 0x39, 0xbf, 0xa9, 0xe4, 0x7e, 0x1c, + 0xf8, 0x25, 0xc5, 0xb7, 0x4d, 0x25, 0x52, 0x87, 0x7a, 0x92, 0xab, 0xfb, 0x3a, 0x8e, 0x8e, 0xef, + 0xf9, 0xa6, 0x12, 0xe6, 0x06, 0xc2, 0xa6, 0x5f, 0xfe, 0xc0, 0x5d, 0x65, 0xaf, 0x74, 0x57, 0xe2, + 0x90, 0x04, 0x0e, 0xf5, 0x1b, 0xd8, 0x74, 0x02, 0x23, 0xf0, 0xe5, 0xd3, 0x62, 0xd0, 0x70, 0xe6, + 0x63, 0xb0, 0x86, 0xdc, 0xd8, 0x6a, 0x04, 0x98, 0x6a, 0x31, 0x3e, 0x09, 0xdc, 0x78, 0x2c, 0x48, + 0x4c, 0x25, 0xf8, 0x53, 0x58, 0x4f, 0x8f, 0x0f, 0xd3, 0x48, 0x7e, 0xd0, 0x80, 0x82, 0x7f, 0x19, + 0x52, 0xbe, 0x55, 0x2b, 0x42, 0xfe, 0xe0, 0xf0, 0xf8, 0xa8, 0xb9, 0xdd, 0xe2, 0x1f, 0xab, 0x6d, + 0x1f, 0xea, 0xfa, 0xf3, 0xa3, 0x76, 0x35, 0xb3, 0xf5, 0xaf, 0xb3, 0x90, 0xd9, 0x7b, 0x81, 0x3e, + 0x83, 0x39, 0xfe, 0xf5, 0xc5, 0x15, 0x9f, 0xdc, 0xd4, 0xaf, 0xfa, 0xc0, 0x04, 0xdf, 0xf8, 0xe9, + 0x7f, 0xfe, 0xcf, 0x5f, 0x67, 0x16, 0x71, 0xa9, 0x31, 0xf9, 0x6e, 0xe3, 0x7c, 0xd2, 0x60, 0x61, + 0xea, 0x91, 0xf6, 0x00, 0xf5, 0xa1, 0xc8, 0x38, 0x8f, 0x3d, 0x87, 0x18, 0xc3, 0xaf, 0x0e, 0x70, + 0x9b, 0x01, 0xdc, 0xc0, 0x48, 0x05, 0x70, 0x99, 0xd0, 0x47, 0xda, 0x83, 0xf7, 0x35, 0xf4, 0x31, + 0x64, 0x8f, 0xc6, 0x1e, 0x4a, 0xfd, 0xe6, 0xa7, 0x9e, 0xfe, 0x71, 0x0b, 0x5e, 0x61, 0xc2, 0x17, + 0x30, 0x08, 0xe1, 0xa3, 0xb1, 0x47, 0x75, 0xff, 0x31, 0x14, 0xd5, 0x4f, 0x53, 0xae, 0xfd, 0x10, + 0xa8, 0x7e, 0xfd, 0x67, 0x2f, 0xb1, 0x79, 0xf0, 0x8f, 0x67, 0x7c, 0x73, 0x7d, 0x0c, 0xd9, 0xf6, + 0x85, 0x85, 0x52, 0x3f, 0x13, 0xaa, 0xa7, 0x7f, 0x09, 0x13, 0x9b, 0x85, 0x77, 0x61, 0x51, 0x91, + 0x7f, 0x24, 0x3e, 0x82, 0xe9, 0x7a, 0xe8, 0x4e, 0xc2, 0x47, 0x10, 0xea, 0x73, 0x7f, 0x7d, 0x3d, + 0x9d, 0x41, 0x80, 0xdc, 0x62, 0x20, 0xab, 0x78, 0x51, 0x80, 0x74, 0x7d, 0x96, 0x47, 0xda, 0x83, + 0xad, 0x2e, 0xcc, 0xb1, 0xa7, 0x34, 0xf4, 0xb9, 0xfc, 0x51, 0x4f, 0x78, 0x53, 0x4c, 0x59, 0xf0, + 0xd0, 0x23, 0x1c, 0x5e, 0x66, 0x40, 0x15, 0x5c, 0xa0, 0x40, 0xec, 0x21, 0xed, 0x91, 0xf6, 0x60, + 0x43, 0x7b, 0x5f, 0xdb, 0xfa, 0xf5, 0x1c, 0xcc, 0xb1, 0x1a, 0x32, 0x3a, 0x07, 0x08, 0x9e, 0x95, + 0xa2, 0xb3, 0x8b, 0x3d, 0x54, 0x45, 0x67, 0x17, 0x7f, 0x91, 0xc2, 0x75, 0x06, 0xba, 0x8c, 0x17, + 0x28, 0x28, 0x2b, 0x4d, 0x37, 0x58, 0xb5, 0x9d, 0xda, 0xf1, 0xaf, 0x34, 0x51, 0x42, 0xe7, 0x87, + 0x16, 0x25, 0x49, 0x0b, 0xbd, 0x2d, 0x45, 0xb7, 0x43, 0xc2, 0xbb, 0x12, 0xfe, 0x3e, 0x03, 0x6c, + 0xe0, 0x6a, 0x00, 0xe8, 0x30, 0x8e, 0x47, 0xda, 0x83, 0xcf, 0x6b, 0x78, 0x49, 0x58, 0x39, 0xd2, + 0x83, 0x7e, 0x02, 0x95, 0xf0, 0xdb, 0x09, 0xba, 0x9b, 0x80, 0x15, 0x7d, 0x82, 0xa9, 0xbf, 0x75, + 0x35, 0x93, 0xd0, 0x69, 0x8d, 0xe9, 0x24, 0xc0, 0x39, 0xf2, 0x39, 0x21, 0x23, 0x83, 0x32, 0x89, + 0x35, 0x40, 0x7f, 0xaf, 0x89, 0xa7, 0xad, 0xe0, 0x31, 0x04, 0x25, 0x49, 0x8f, 0x3d, 0xb5, 0xd4, + 0xef, 0x5d, 0xc3, 0x25, 0x94, 0xf8, 0x7d, 0xa6, 0xc4, 0x07, 0x78, 0x39, 0x50, 0xc2, 0x33, 0x87, + 0xc4, 0xb3, 0x85, 0x16, 0x9f, 0xdf, 0xc2, 0x37, 0x42, 0xc6, 0x09, 0xf5, 0x06, 0x8b, 0xc5, 0x1f, + 0x34, 0x12, 0x17, 0x2b, 0xf4, 0x40, 0x92, 0xb8, 0x58, 0xe1, 0xd7, 0x90, 0xa4, 0xc5, 0xe2, 0xcf, + 0x17, 0x49, 0x8b, 0xe5, 0xf7, 0x6c, 0xfd, 0xdf, 0x2c, 0xe4, 0xb7, 0xf9, 0x87, 0xeb, 0xc8, 0x86, + 0x82, 0xff, 0x1e, 0x80, 0xd6, 0x92, 0x0a, 0x9a, 0xc1, 0xfd, 0xa9, 0x7e, 0x27, 0xb5, 0x5f, 0x28, + 0xf4, 0x26, 0x53, 0xe8, 0x0d, 0xbc, 0x4a, 0x91, 0xc5, 0xb7, 0xf1, 0x0d, 0x5e, 0x35, 0x6b, 0x18, + 0xbd, 0x1e, 0x35, 0xc4, 0x1f, 0x43, 0x49, 0x2d, 0xd8, 0xa3, 0x37, 0x13, 0x8b, 0xa8, 0x6a, 0xcd, + 0xbf, 0x8e, 0xaf, 0x62, 0x11, 0xc8, 0x6f, 0x31, 0xe4, 0x35, 0x7c, 0x33, 0x01, 0xd9, 0x61, 0xac, + 0x21, 0x70, 0x5e, 0x6c, 0x4f, 0x06, 0x0f, 0xd5, 0xf2, 0x93, 0xc1, 0xc3, 0xb5, 0xfa, 0x2b, 0xc1, + 0xc7, 0x8c, 0x95, 0x82, 0xbb, 0x00, 0x41, 0xc9, 0x1c, 0x25, 0xda, 0x52, 0xb9, 0x40, 0x46, 0x9d, + 0x43, 0xbc, 0xda, 0x8e, 0x31, 0x83, 0x15, 0xfb, 0x2e, 0x02, 0x3b, 0x30, 0x5d, 0x8f, 0x1f, 0xcc, + 0x72, 0xa8, 0x06, 0x8e, 0x12, 0xe7, 0x13, 0x2e, 0xa4, 0xd7, 0xef, 0x5e, 0xc9, 0x23, 0xd0, 0xef, + 0x31, 0xf4, 0x3b, 0xb8, 0x9e, 0x80, 0x3e, 0xe2, 0xbc, 0x74, 0xb3, 0xfd, 0x7f, 0x0e, 0x8a, 0xcf, + 0x0c, 0xd3, 0xf2, 0x88, 0x65, 0x58, 0x5d, 0x82, 0x4e, 0x60, 0x8e, 0xa5, 0x04, 0x51, 0x47, 0xac, + 0xd6, 0x87, 0xa3, 0x8e, 0x38, 0x54, 0x3c, 0xc5, 0xeb, 0x0c, 0xb8, 0x8e, 0x57, 0x28, 0xf0, 0x30, + 0x10, 0xdd, 0x60, 0x35, 0x4f, 0x3a, 0xe9, 0x53, 0xc8, 0x89, 0x67, 0xc5, 0x88, 0xa0, 0x50, 0x95, + 0xa9, 0x7e, 0x2b, 0xb9, 0x33, 0x69, 0x2f, 0xab, 0x30, 0x2e, 0xe3, 0xa3, 0x38, 0x13, 0x80, 0xa0, + 0x98, 0x1f, 0x5d, 0xd1, 0x58, 0xed, 0xbf, 0xbe, 0x9e, 0xce, 0x90, 0x64, 0x53, 0x15, 0xb3, 0xe7, + 0xf3, 0x52, 0xdc, 0x3f, 0x84, 0xd9, 0xa7, 0x86, 0x7b, 0x86, 0x22, 0xb1, 0x57, 0xf9, 0x28, 0xad, + 0x5e, 0x4f, 0xea, 0x12, 0x28, 0x77, 0x18, 0xca, 0x4d, 0xee, 0xca, 0x54, 0x94, 0x33, 0xc3, 0xa5, + 0x41, 0x0d, 0xf5, 0x20, 0xc7, 0xbf, 0x51, 0x8b, 0xda, 0x2f, 0xf4, 0x9d, 0x5b, 0xd4, 0x7e, 0xe1, + 0xcf, 0xda, 0xae, 0x47, 0x19, 0xc1, 0xbc, 0xfc, 0x28, 0x0c, 0x45, 0xbe, 0x10, 0x88, 0x7c, 0x40, + 0x56, 0x5f, 0x4b, 0xeb, 0x16, 0x58, 0x77, 0x19, 0xd6, 0x6d, 0x5c, 0x8b, 0xad, 0x95, 0xe0, 0xe4, + 0x29, 0xd9, 0x4f, 0x00, 0x82, 0xf7, 0x8f, 0xd8, 0x09, 0x8c, 0x3e, 0xa5, 0xc4, 0x4e, 0x60, 0xec, + 0xe9, 0x04, 0x6f, 0x32, 0xdc, 0x0d, 0x7c, 0x37, 0x8a, 0xeb, 0x39, 0x86, 0xe5, 0x9e, 0x12, 0xe7, + 0x3d, 0x5e, 0xce, 0x75, 0xcf, 0xcc, 0x11, 0x9d, 0xb2, 0x03, 0x05, 0xbf, 0xbc, 0x1d, 0xf5, 0xb6, + 0xd1, 0xb2, 0x7b, 0xd4, 0xdb, 0xc6, 0xea, 0xe2, 0x61, 0xb7, 0x13, 0xda, 0x2d, 0x92, 0x95, 0x1e, + 0xc0, 0x5f, 0x56, 0x61, 0x96, 0xa6, 0xf7, 0x34, 0x39, 0x09, 0x0a, 0x34, 0xd1, 0xd9, 0xc7, 0xca, + 0xb5, 0xd1, 0xd9, 0xc7, 0x6b, 0x3b, 0xe1, 0xe4, 0x84, 0xde, 0xe6, 0x1a, 0xbc, 0x16, 0x42, 0x67, + 0x6a, 0x43, 0x51, 0xa9, 0xe0, 0xa0, 0x04, 0x61, 0xe1, 0x3a, 0x70, 0x34, 0xdc, 0x25, 0x94, 0x7f, + 0xf0, 0x1b, 0x0c, 0x6f, 0x85, 0x87, 0x3b, 0x86, 0xd7, 0xe3, 0x1c, 0x14, 0x50, 0xcc, 0x4e, 0x9c, + 0xfb, 0x84, 0xd9, 0x85, 0xcf, 0xfe, 0x7a, 0x3a, 0x43, 0xea, 0xec, 0x82, 0x83, 0xff, 0x12, 0x4a, + 0x6a, 0x1d, 0x07, 0x25, 0x28, 0x1f, 0xa9, 0x5d, 0x47, 0xe3, 0x48, 0x52, 0x19, 0x28, 0xec, 0xd9, + 0x18, 0xa4, 0xa1, 0xb0, 0x51, 0xe0, 0x01, 0xe4, 0x45, 0x61, 0x27, 0xc9, 0xa4, 0xe1, 0x3a, 0x77, + 0x92, 0x49, 0x23, 0x55, 0xa1, 0x70, 0xf6, 0xcc, 0x10, 0xe9, 0xdd, 0x55, 0xc6, 0x6a, 0x81, 0xf6, + 0x84, 0x78, 0x69, 0x68, 0x41, 0xc9, 0x34, 0x0d, 0x4d, 0xa9, 0x1b, 0xa4, 0xa1, 0xf5, 0x89, 0x27, + 0xfc, 0x81, 0xbc, 0x8f, 0xa3, 0x14, 0x61, 0x6a, 0x7c, 0xc4, 0x57, 0xb1, 0x24, 0x5d, 0x6e, 0x02, + 0x40, 0x19, 0x1c, 0x2f, 0x00, 0x82, 0xb2, 0x53, 0x34, 0x63, 0x4d, 0x2c, 0xb7, 0x47, 0x33, 0xd6, + 0xe4, 0xca, 0x55, 0xd8, 0xf7, 0x05, 0xb8, 0xfc, 0x6e, 0x45, 0x91, 0x7f, 0xa1, 0x01, 0x8a, 0x57, + 0xa8, 0xd0, 0xc3, 0x64, 0xe9, 0x89, 0x45, 0xfc, 0xfa, 0xbb, 0xaf, 0xc7, 0x9c, 0x14, 0xce, 0x02, + 0x95, 0xba, 0x8c, 0x7b, 0xf4, 0x92, 0x2a, 0xf5, 0xe7, 0x1a, 0x94, 0x43, 0xe5, 0x2d, 0x74, 0x3f, + 0x65, 0x4d, 0x23, 0xb5, 0xfd, 0xfa, 0xdb, 0xd7, 0xf2, 0x25, 0xa5, 0xf2, 0xca, 0x0e, 0x90, 0x77, + 0x9a, 0x9f, 0x69, 0x50, 0x09, 0x97, 0xc3, 0x50, 0x8a, 0xec, 0xd8, 0xdb, 0x40, 0x7d, 0xe3, 0x7a, + 0xc6, 0xab, 0x97, 0x27, 0xb8, 0xce, 0x0c, 0x20, 0x2f, 0x0a, 0x68, 0x49, 0x1b, 0x3f, 0xfc, 0xaa, + 0x90, 0xb4, 0xf1, 0x23, 0xd5, 0xb7, 0x84, 0x8d, 0xef, 0xd8, 0x03, 0xa2, 0x1c, 0x33, 0x51, 0x61, + 0x4b, 0x43, 0xbb, 0xfa, 0x98, 0x45, 0xca, 0x73, 0x69, 0x68, 0xc1, 0x31, 0x93, 0xa5, 0x35, 0x94, + 0x22, 0xec, 0x9a, 0x63, 0x16, 0xad, 0xcc, 0x25, 0x1c, 0x33, 0x06, 0xa8, 0x1c, 0xb3, 0xa0, 0x08, + 0x96, 0x74, 0xcc, 0x62, 0x8f, 0x24, 0x49, 0xc7, 0x2c, 0x5e, 0x47, 0x4b, 0x58, 0x47, 0x86, 0x1b, + 0x3a, 0x66, 0x4b, 0x09, 0xf5, 0x32, 0xf4, 0x6e, 0x8a, 0x11, 0x13, 0xdf, 0x5e, 0xea, 0xef, 0xbd, + 0x26, 0x77, 0xea, 0x1e, 0xe7, 0xe6, 0x97, 0x7b, 0xfc, 0x6f, 0x34, 0x58, 0x4e, 0xaa, 0xb5, 0xa1, + 0x14, 0x9c, 0x94, 0x37, 0x9b, 0xfa, 0xe6, 0xeb, 0xb2, 0x5f, 0x6d, 0x2d, 0x7f, 0xd7, 0x3f, 0xae, + 0xfe, 0xcb, 0x17, 0x6b, 0xda, 0xbf, 0x7f, 0xb1, 0xa6, 0xfd, 0xd7, 0x17, 0x6b, 0xda, 0xdf, 0xfe, + 0xf7, 0xda, 0xcc, 0x49, 0x8e, 0xfd, 0x6f, 0xe8, 0xef, 0xfe, 0x36, 0x00, 0x00, 0xff, 0xff, 0x47, + 0x65, 0xfe, 0x91, 0x92, 0x3d, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -6428,6 +6448,8 @@ const _ = grpc.SupportPackageIsVersion4 type KVClient interface { // Range gets the keys in the range from the key-value store. Range(ctx context.Context, in *RangeRequest, opts ...grpc.CallOption) (*RangeResponse, error) + // RangeStream gets the keys in the range stream from the key-value store. + RangeStream(ctx context.Context, in *RangeRequest, opts ...grpc.CallOption) (KV_RangeStreamClient, error) // Put puts the given key into the key-value store. // A put request increments the revision of the key-value store // and generates one event in the event history. @@ -6464,6 +6486,38 @@ func (c *kVClient) Range(ctx context.Context, in *RangeRequest, opts ...grpc.Cal return out, nil } +func (c *kVClient) RangeStream(ctx context.Context, in *RangeRequest, opts ...grpc.CallOption) (KV_RangeStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &_KV_serviceDesc.Streams[0], "/etcdserverpb.KV/RangeStream", opts...) + if err != nil { + return nil, err + } + x := &kVRangeStreamClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type KV_RangeStreamClient interface { + Recv() (*RangeResponse, error) + grpc.ClientStream +} + +type kVRangeStreamClient struct { + grpc.ClientStream +} + +func (x *kVRangeStreamClient) Recv() (*RangeResponse, error) { + m := new(RangeResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func (c *kVClient) Put(ctx context.Context, in *PutRequest, opts ...grpc.CallOption) (*PutResponse, error) { out := new(PutResponse) err := c.cc.Invoke(ctx, "/etcdserverpb.KV/Put", in, out, opts...) @@ -6504,6 +6558,8 @@ func (c *kVClient) Compact(ctx context.Context, in *CompactionRequest, opts ...g type KVServer interface { // Range gets the keys in the range from the key-value store. Range(context.Context, *RangeRequest) (*RangeResponse, error) + // RangeStream gets the keys in the range stream from the key-value store. + RangeStream(*RangeRequest, KV_RangeStreamServer) error // Put puts the given key into the key-value store. // A put request increments the revision of the key-value store // and generates one event in the event history. @@ -6530,6 +6586,9 @@ type UnimplementedKVServer struct { func (*UnimplementedKVServer) Range(ctx context.Context, req *RangeRequest) (*RangeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Range not implemented") } +func (*UnimplementedKVServer) RangeStream(req *RangeRequest, srv KV_RangeStreamServer) error { + return status.Errorf(codes.Unimplemented, "method RangeStream not implemented") +} func (*UnimplementedKVServer) Put(ctx context.Context, req *PutRequest) (*PutResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Put not implemented") } @@ -6565,6 +6624,27 @@ func _KV_Range_Handler(srv interface{}, ctx context.Context, dec func(interface{ return interceptor(ctx, in, info, handler) } +func _KV_RangeStream_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(RangeRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(KVServer).RangeStream(m, &kVRangeStreamServer{stream}) +} + +type KV_RangeStreamServer interface { + Send(*RangeResponse) error + grpc.ServerStream +} + +type kVRangeStreamServer struct { + grpc.ServerStream +} + +func (x *kVRangeStreamServer) Send(m *RangeResponse) error { + return x.ServerStream.SendMsg(m) +} + func _KV_Put_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(PutRequest) if err := dec(in); err != nil { @@ -6662,7 +6742,13 @@ var _KV_serviceDesc = grpc.ServiceDesc{ Handler: _KV_Compact_Handler, }, }, - Streams: []grpc.StreamDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "RangeStream", + Handler: _KV_RangeStream_Handler, + ServerStreams: true, + }, + }, Metadata: "rpc.proto", } @@ -8515,6 +8601,20 @@ func (m *RangeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.TotalSize != 0 { + i = encodeVarintRpc(dAtA, i, uint64(m.TotalSize)) + i-- + dAtA[i] = 0x6 + i-- + dAtA[i] = 0xb0 + } + if m.SubCount != 0 { + i = encodeVarintRpc(dAtA, i, uint64(m.SubCount)) + i-- + dAtA[i] = 0x6 + i-- + dAtA[i] = 0xa8 + } if m.Count != 0 { i = encodeVarintRpc(dAtA, i, uint64(m.Count)) i-- @@ -13014,6 +13114,12 @@ func (m *RangeResponse) Size() (n int) { if m.Count != 0 { n += 1 + sovRpc(uint64(m.Count)) } + if m.SubCount != 0 { + n += 2 + sovRpc(uint64(m.SubCount)) + } + if m.TotalSize != 0 { + n += 2 + sovRpc(uint64(m.TotalSize)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -15601,6 +15707,44 @@ func (m *RangeResponse) Unmarshal(dAtA []byte) error { break } } + case 101: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SubCount", wireType) + } + m.SubCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SubCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 102: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalSize", wireType) + } + m.TotalSize = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TotalSize |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipRpc(dAtA[iNdEx:]) diff --git a/api/etcdserverpb/rpc.proto b/api/etcdserverpb/rpc.proto index 6185e031e75..d6944e17d11 100644 --- a/api/etcdserverpb/rpc.proto +++ b/api/etcdserverpb/rpc.proto @@ -21,7 +21,7 @@ service KV { } // RangeStream gets the keys in the range stream from the key-value store. - rpc RangeStream(RangeStreamRequest) returns (stream RangeStreamResponse) { + rpc RangeStream(RangeRequest) returns (stream RangeResponse) { option (google.api.http) = { post: "/v3/kv/rangestream" body: "*" @@ -474,35 +474,6 @@ message RangeRequest { int64 max_create_revision = 13; } -message RangeStreamRequest { - // key is the first key for the range. If range_end is not given, the request only looks up key. - bytes key = 1; - // range_end is the upper bound on the requested range [key, range_end). - // If range_end is '\0', the range is all keys >= key. - // If range_end is key plus one (e.g., "aa"+1 == "ab", "a\xff"+1 == "b"), - // then the range request gets all keys prefixed with key. - // If both key and range_end are '\0', then the range request returns all keys. - bytes range_end = 2; - // limit is a limit on the number of keys returned for the request. When limit is set to 0, - // it is treated as no limit. - int64 limit = 3; - // revision is the point-in-time of the key-value store to use for the range. - // If revision is less or equal to zero, the range is over the newest key-value store. - // If the revision has been compacted, ErrCompacted is returned as a response. - int64 revision = 4; - - // serializable sets the range request to use serializable member-local reads. - // Range requests are linearizable by default; linearizable requests have higher - // latency and lower throughput than serializable requests but reflect the current - // consensus of the cluster. For better performance, in exchange for possible stale reads, - // a serializable range request is served locally without needing to reach consensus - // with other nodes in the cluster. - bool serializable = 7; - - // keys_only when set returns only the keys and not the values. - bool keys_only = 8; -} - message RangeResponse { ResponseHeader header = 1; // kvs is the list of key-value pairs matched by the range request. @@ -512,19 +483,10 @@ message RangeResponse { bool more = 3; // count is set to the number of keys within the range when requested. int64 count = 4; -} - -message RangeStreamResponse { - ResponseHeader header = 1; - // kvs is the list of key-value pairs matched by the range request. - // kvs is empty when count is requested. - repeated mvccpb.KeyValue kvs = 2; - // count is set to the number of keys within the range when requested. - int64 count = 4; - int64 totalCount = 5; + int64 sub_count = 101; - int64 totalSize = 6; + int64 total_size = 102; } message PutRequest { @@ -585,7 +547,6 @@ message RequestOp { PutRequest request_put = 2; DeleteRangeRequest request_delete_range = 3; TxnRequest request_txn = 4; - RangeStreamRequest request_range_stream = 5; } } @@ -596,7 +557,6 @@ message ResponseOp { PutResponse response_put = 2; DeleteRangeResponse response_delete_range = 3; TxnResponse response_txn = 4; - RangeStreamResponse response_range_stream = 5; } } diff --git a/client/mock/mockserver/mockserver.go b/client/mock/mockserver/mockserver.go index ed7bce459f3..80135291296 100644 --- a/client/mock/mockserver/mockserver.go +++ b/client/mock/mockserver/mockserver.go @@ -171,7 +171,7 @@ func (m *mockKVServer) Range(context.Context, *pb.RangeRequest) (*pb.RangeRespon return &pb.RangeResponse{}, nil } -func (m *mockKVServer) RangeStream(r *pb.RangeStreamRequest, rss pb.KV_RangeStreamServer) error { +func (m *mockKVServer) RangeStream(r *pb.RangeRequest, rss pb.KV_RangeStreamServer) error { return nil } diff --git a/clientv3/kv.go b/clientv3/kv.go index 52df211e7c1..b6a3691775f 100644 --- a/clientv3/kv.go +++ b/clientv3/kv.go @@ -21,6 +21,7 @@ import ( "time" pb "go.etcd.io/etcd/api/v3/etcdserverpb" + v3rpc "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" "google.golang.org/grpc" ) @@ -29,7 +30,7 @@ type ( CompactResponse pb.CompactionResponse PutResponse pb.PutResponse GetResponse pb.RangeResponse - GetStreamResponse pb.RangeStreamResponse + GetStreamResponse pb.RangeResponse DeleteResponse pb.DeleteRangeResponse TxnResponse pb.TxnResponse ) @@ -169,7 +170,7 @@ func (kv *kv) Do(ctx context.Context, op Op) (OpResponse, error) { } case tRangeStream: var rangeStreamClient pb.KV_RangeStreamClient - var resp *pb.RangeStreamResponse + var resp *pb.RangeResponse rangeStreamClient, err = kv.openRangeStreamClient(ctx, op.toRangeStreamRequest(), kv.callOpts...) resp, err = kv.serveRangeStream(ctx, rangeStreamClient) if err == nil { @@ -204,7 +205,7 @@ func (kv *kv) Do(ctx context.Context, op Op) (OpResponse, error) { // openRangeStreamClient retries opening a rangeStream client until success or halt. // manually retry in case "rsc==nil && err==nil" // TODO: remove FailFast=false -func (kv *kv) openRangeStreamClient(ctx context.Context, in *pb.RangeStreamRequest, opts ...grpc.CallOption) (rsc pb.KV_RangeStreamClient, err error) { +func (kv *kv) openRangeStreamClient(ctx context.Context, in *pb.RangeRequest, opts ...grpc.CallOption) (rsc pb.KV_RangeStreamClient, err error) { backoff := time.Millisecond for { select { @@ -236,11 +237,11 @@ func (kv *kv) openRangeStreamClient(ctx context.Context, in *pb.RangeStreamReque return rsc, nil } -func (kv *kv) serveRangeStream(ctx context.Context, rsc pb.KV_RangeStreamClient) (*pb.RangeStreamResponse, error) { - rspC := make(chan *pb.RangeStreamResponse) +func (kv *kv) serveRangeStream(ctx context.Context, rsc pb.KV_RangeStreamClient) (*pb.RangeResponse, error) { + rspC := make(chan *pb.RangeResponse) errC := make(chan error) - mainRSP := &pb.RangeStreamResponse{} + mainRSP := &pb.RangeResponse{} mainRSP.Header = &pb.ResponseHeader{} go kv.handleRangeStream(ctx, rsc, rspC, errC) @@ -254,7 +255,7 @@ Loop: } mainRSP.Kvs = append(mainRSP.Kvs, subRsp.Kvs...) - mainRSP.TotalCount = subRsp.TotalCount + mainRSP.Count = subRsp.Count mainRSP.Header = subRsp.Header case err := <-errC: return nil, err @@ -266,7 +267,7 @@ Loop: return mainRSP, nil } -func (kv *kv) handleRangeStream(ctx context.Context, rsc pb.KV_RangeStreamClient, rspC chan *pb.RangeStreamResponse, errC chan error) { +func (kv *kv) handleRangeStream(ctx context.Context, rsc pb.KV_RangeStreamClient, rspC chan *pb.RangeResponse, errC chan error) { defer func() { if err := recover(); err != nil { switch e := err.(type) { diff --git a/clientv3/op.go b/clientv3/op.go index 0fda2d48a76..e5a5a0baeed 100644 --- a/clientv3/op.go +++ b/clientv3/op.go @@ -167,11 +167,11 @@ func (op Op) toRangeRequest() *pb.RangeRequest { return r } -func (op Op) toRangeStreamRequest() *pb.RangeStreamRequest { +func (op Op) toRangeStreamRequest() *pb.RangeRequest { if op.t != tRangeStream { panic("op.t != tRangeStream") } - r := &pb.RangeStreamRequest{ + r := &pb.RangeRequest{ Key: op.key, RangeEnd: op.end, Limit: op.limit, @@ -245,7 +245,7 @@ func OpGet(key string, opts ...OpOption) Op { func OpGetStream(key string, opts ...OpOption) Op { // WithPrefix and WithFromKey are not supported together - if isWithPrefix(opts) && isWithFromKey(opts) { + if IsOptsWithPrefix(opts) && IsOptsWithFromKey(opts) { panic("`WithPrefix` and `WithFromKey` cannot be set at the same time, choose one") } ret := Op{t: tRangeStream, key: []byte(key)} diff --git a/clientv3/retry.go b/clientv3/retry.go index 2f51753d20e..98272795272 100644 --- a/clientv3/retry.go +++ b/clientv3/retry.go @@ -105,7 +105,7 @@ func (rkv *retryKVClient) Range(ctx context.Context, in *pb.RangeRequest, opts . return rkv.kc.Range(ctx, in, append(opts, withRetryPolicy(repeatable))...) } -func (rkv *retryKVClient) RangeStream(ctx context.Context, in *pb.RangeStreamRequest, opts ...grpc.CallOption) (pb.KV_RangeStreamClient, error) { +func (rkv *retryKVClient) RangeStream(ctx context.Context, in *pb.RangeRequest, opts ...grpc.CallOption) (pb.KV_RangeStreamClient, error) { return rkv.kc.RangeStream(ctx, in, append(opts, withRetryPolicy(repeatable))...) } diff --git a/etcdctl/ctlv3/command/printer.go b/etcdctl/ctlv3/command/printer.go index efb5f32b517..ec72c14ee78 100644 --- a/etcdctl/ctlv3/command/printer.go +++ b/etcdctl/ctlv3/command/printer.go @@ -95,7 +95,7 @@ type printerRPC struct { func (p *printerRPC) Del(r v3.DeleteResponse) { p.p((*pb.DeleteRangeResponse)(&r)) } func (p *printerRPC) Get(r v3.GetResponse) { p.p((*pb.RangeResponse)(&r)) } -func (p *printerRPC) GetStream(r v3.GetStreamResponse) { p.p((*pb.RangeStreamResponse)(&r)) } +func (p *printerRPC) GetStream(r v3.GetStreamResponse) { p.p((*pb.RangeResponse)(&r)) } func (p *printerRPC) Put(r v3.PutResponse) { p.p((*pb.PutResponse)(&r)) } func (p *printerRPC) Txn(r v3.TxnResponse) { p.p((*pb.TxnResponse)(&r)) } func (p *printerRPC) Watch(r v3.WatchResponse) { p.p(&r) } diff --git a/etcdctl/ctlv3/command/printer_fields.go b/etcdctl/ctlv3/command/printer_fields.go index abf9f18c3b7..7b07be127f1 100644 --- a/etcdctl/ctlv3/command/printer_fields.go +++ b/etcdctl/ctlv3/command/printer_fields.go @@ -63,7 +63,7 @@ func (p *fieldsPrinter) GetStream(r v3.GetStreamResponse) { for _, kv := range r.Kvs { p.kv("", kv) } - fmt.Println(`"Count" :`, r.TotalCount) + fmt.Println(`"Count" :`, r.Count) } func (p *fieldsPrinter) Put(r v3.PutResponse) { diff --git a/etcdserver/api/v3rpc/key.go b/etcdserver/api/v3rpc/key.go index abfddb4be3c..f5bae312607 100644 --- a/etcdserver/api/v3rpc/key.go +++ b/etcdserver/api/v3rpc/key.go @@ -55,7 +55,7 @@ func (s *kvServer) Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeResp return resp, nil } -func (s *kvServer) RangeStream(r *pb.RangeStreamRequest, rss pb.KV_RangeStreamServer) error { +func (s *kvServer) RangeStream(r *pb.RangeRequest, rss pb.KV_RangeStreamServer) error { defer func() { if err := recover(); err != nil { switch e := err.(type) { @@ -66,11 +66,11 @@ func (s *kvServer) RangeStream(r *pb.RangeStreamRequest, rss pb.KV_RangeStreamSe } }() - if err := checkRangeStreamRequest(r); err != nil { + if err := checkRangeRequest(r); err != nil { return err } - respC := make(chan *pb.RangeStreamResponse) + respC := make(chan *pb.RangeResponse) errC := make(chan error) go func() { @@ -179,13 +179,6 @@ func checkRangeRequest(r *pb.RangeRequest) error { return nil } -func checkRangeStreamRequest(r *pb.RangeStreamRequest) error { - if len(r.Key) == 0 { - return rpctypes.ErrGRPCEmptyKey - } - return nil -} - func checkPutRequest(r *pb.PutRequest) error { if len(r.Key) == 0 { return rpctypes.ErrGRPCEmptyKey diff --git a/etcdserver/apply.go b/etcdserver/apply.go index d8051478c58..526739b1d09 100644 --- a/etcdserver/apply.go +++ b/etcdserver/apply.go @@ -64,7 +64,7 @@ type applierV3 interface { Put(ctx context.Context, txn mvcc.TxnWrite, p *pb.PutRequest) (*pb.PutResponse, *traceutil.Trace, error) Range(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeRequest) (*pb.RangeResponse, error) - RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse, errC chan error) (*pb.RangeStreamResponse, error) + RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeRequest, rspC chan *pb.RangeResponse, errC chan error) (*pb.RangeResponse, error) DeleteRange(txn mvcc.TxnWrite, dr *pb.DeleteRangeRequest) (*pb.DeleteRangeResponse, error) Txn(ctx context.Context, rt *pb.TxnRequest) (*pb.TxnResponse, *traceutil.Trace, error) Compaction(compaction *pb.CompactionRequest) (*pb.CompactionResponse, <-chan struct{}, *traceutil.Trace, error) @@ -386,7 +386,7 @@ func (a *applierV3backend) Range(ctx context.Context, txn mvcc.TxnRead, r *pb.Ra return resp, nil } -func (a *applierV3backend) RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse, errC chan error) (*pb.RangeStreamResponse, error) { +func (a *applierV3backend) RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeRequest, rspC chan *pb.RangeResponse, errC chan error) (*pb.RangeResponse, error) { defer func() { if err := recover(); err != nil { switch e := err.(type) { @@ -404,7 +404,7 @@ func (a *applierV3backend) RangeStream(ctx context.Context, txn mvcc.TxnRead, r lg := a.s.getLogger() - resp := &pb.RangeStreamResponse{} + resp := &pb.RangeResponse{} resp.Header = &pb.ResponseHeader{} streamC := make(chan *mvcc.RangeResult) @@ -450,15 +450,14 @@ Loop: } } - subResp := &pb.RangeStreamResponse{} + subResp := &pb.RangeResponse{} subResp.Header = &pb.ResponseHeader{} subResp.Header.Revision = rr.Rev - subResp.Count = int64(rr.Count) + subResp.SubCount = int64(rr.Count) - // resp TotalCount just use monitor long time range stream - resp.TotalCount += int64(rr.Count) - subResp.TotalCount = resp.TotalCount + resp.Count += int64(rr.Count) + subResp.Count = resp.Count subResp.Kvs = make([]*mvccpb.KeyValue, len(rr.KVs)) for i := range rr.KVs { if r.KeysOnly { diff --git a/etcdserver/apply_auth.go b/etcdserver/apply_auth.go index 2dc3cb1649c..620c5e98352 100644 --- a/etcdserver/apply_auth.go +++ b/etcdserver/apply_auth.go @@ -92,7 +92,7 @@ func (aa *authApplierV3) Range(ctx context.Context, txn mvcc.TxnRead, r *pb.Rang return aa.applierV3.Range(ctx, txn, r) } -func (aa *authApplierV3) RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse, errC chan error) (*pb.RangeStreamResponse, error) { +func (aa *authApplierV3) RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeRequest, rspC chan *pb.RangeResponse, errC chan error) (*pb.RangeResponse, error) { if err := aa.as.IsRangePermitted(&aa.authInfo, r.Key, r.RangeEnd); err != nil { return nil, err } diff --git a/etcdserver/corrupt.go b/etcdserver/corrupt.go index b601dc5abc3..d84c21a1377 100644 --- a/etcdserver/corrupt.go +++ b/etcdserver/corrupt.go @@ -317,7 +317,7 @@ func (a *applierV3Corrupt) Range(ctx context.Context, txn mvcc.TxnRead, p *pb.Ra return nil, ErrCorrupt } -func (a *applierV3Corrupt) RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse, errC chan error) (*pb.RangeStreamResponse, error) { +func (a *applierV3Corrupt) RangeStream(ctx context.Context, txn mvcc.TxnRead, r *pb.RangeRequest, rspC chan *pb.RangeResponse, errC chan error) (*pb.RangeResponse, error) { return nil, ErrCorrupt } diff --git a/etcdserver/util.go b/etcdserver/util.go index b6c2f967995..ea16675c181 100644 --- a/etcdserver/util.go +++ b/etcdserver/util.go @@ -152,10 +152,10 @@ func warnOfExpensiveReadOnlyRangeRequest(lg *zap.Logger, now time.Time, reqStrin warnOfExpensiveGenericRequest(lg, now, reqStringer, "read-only range ", resp, err) } -func warnOfExpensiveReadOnlyRangeStreamRequest(lg *zap.Logger, now time.Time, reqStringer fmt.Stringer, rangeStreamResponse *pb.RangeStreamResponse, err error) { +func warnOfExpensiveReadOnlyRangeStreamRequest(lg *zap.Logger, now time.Time, reqStringer fmt.Stringer, rangeResponse *pb.RangeResponse, err error) { var resp string - if !isNil(rangeStreamResponse) { - resp = fmt.Sprintf("range_stream_response_total_count:%d, size:%d", rangeStreamResponse.GetTotalCount(), rangeStreamResponse.GetTotalSize()) + if !isNil(rangeResponse) { + resp = fmt.Sprintf("range_stream_response_total_count:%d, size:%d", rangeResponse.GetCount(), rangeResponse.GetTotalSize()) } warnOfExpensiveGenericRequest(lg, now, reqStringer, "read-only rangeStream ", resp, err) } diff --git a/etcdserver/v3_server.go b/etcdserver/v3_server.go index c9d2a2e5281..7e56996ebd9 100644 --- a/etcdserver/v3_server.go +++ b/etcdserver/v3_server.go @@ -48,7 +48,7 @@ const ( type RaftKV interface { Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeResponse, error) - RangeStream(ctx context.Context, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse, errC chan error) error + RangeStream(ctx context.Context, r *pb.RangeRequest, rspC chan *pb.RangeResponse, errC chan error) error Put(ctx context.Context, r *pb.PutRequest) (*pb.PutResponse, error) DeleteRange(ctx context.Context, r *pb.DeleteRangeRequest) (*pb.DeleteRangeResponse, error) Txn(ctx context.Context, r *pb.TxnRequest) (*pb.TxnResponse, error) @@ -132,7 +132,7 @@ func (s *EtcdServer) Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeRe return resp, err } -func (s *EtcdServer) RangeStream(ctx context.Context, r *pb.RangeStreamRequest, rspC chan *pb.RangeStreamResponse, errC chan error) error { +func (s *EtcdServer) RangeStream(ctx context.Context, r *pb.RangeRequest, rspC chan *pb.RangeResponse, errC chan error) error { trace := traceutil.New("rangeStream", s.getLogger(), traceutil.Field{Key: "range_begin", Value: string(r.Key)}, @@ -141,13 +141,13 @@ func (s *EtcdServer) RangeStream(ctx context.Context, r *pb.RangeStreamRequest, ctx = context.WithValue(ctx, traceutil.TraceKey, trace) - var resp *pb.RangeStreamResponse + var resp *pb.RangeResponse var err error defer func(start time.Time) { warnOfExpensiveReadOnlyRangeStreamRequest(s.getLogger(), start, r, resp, err) if resp != nil { trace.AddField( - traceutil.Field{Key: "response_total_count", Value: resp.GetTotalCount}, + traceutil.Field{Key: "response_total_count", Value: resp.GetCount()}, traceutil.Field{Key: "response_revision", Value: resp.Header.Revision}, ) } diff --git a/proxy/grpcproxy/adapter/kv_client_adapter.go b/proxy/grpcproxy/adapter/kv_client_adapter.go index b532e3f8a85..47a35df1307 100644 --- a/proxy/grpcproxy/adapter/kv_client_adapter.go +++ b/proxy/grpcproxy/adapter/kv_client_adapter.go @@ -32,7 +32,7 @@ func (s *kvs2kvc) Range(ctx context.Context, in *pb.RangeRequest, opts ...grpc.C return s.kvs.Range(ctx, in) } -func (s *kvs2kvc) RangeStream(ctx context.Context, in *pb.RangeStreamRequest, opts ...grpc.CallOption) (pb.KV_RangeStreamClient, error) { +func (s *kvs2kvc) RangeStream(ctx context.Context, in *pb.RangeRequest, opts ...grpc.CallOption) (pb.KV_RangeStreamClient, error) { cs := newPipeStream(ctx, func(ss chanServerStream) error { return s.kvs.RangeStream(in, (&rs2rcServerStream{ss})) }) @@ -59,24 +59,24 @@ type rs2rcClientStream struct{ chanClientStream } type rs2rcServerStream struct{ chanServerStream } -func (s *rs2rcClientStream) Send(wr *pb.RangeStreamRequest) error { +func (s *rs2rcClientStream) Send(wr *pb.RangeRequest) error { return s.SendMsg(wr) } -func (s *rs2rcClientStream) Recv() (*pb.RangeStreamResponse, error) { +func (s *rs2rcClientStream) Recv() (*pb.RangeResponse, error) { var v interface{} if err := s.RecvMsg(&v); err != nil { return nil, err } - return v.(*pb.RangeStreamResponse), nil + return v.(*pb.RangeResponse), nil } -func (s *rs2rcServerStream) Send(wr *pb.RangeStreamResponse) error { +func (s *rs2rcServerStream) Send(wr *pb.RangeResponse) error { return s.SendMsg(wr) } -func (s *rs2rcServerStream) Recv() (*pb.RangeStreamRequest, error) { +func (s *rs2rcServerStream) Recv() (*pb.RangeRequest, error) { var v interface{} if err := s.RecvMsg(&v); err != nil { return nil, err } - return v.(*pb.RangeStreamRequest), nil + return v.(*pb.RangeRequest), nil } diff --git a/proxy/grpcproxy/kv.go b/proxy/grpcproxy/kv.go index 3b17efea28e..84ba0922003 100644 --- a/proxy/grpcproxy/kv.go +++ b/proxy/grpcproxy/kv.go @@ -68,7 +68,7 @@ func (p *kvProxy) Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeRespo } // TODO yxj -func (p *kvProxy) RangeStream(r *pb.RangeStreamRequest, rss pb.KV_RangeStreamServer) error { +func (p *kvProxy) RangeStream(r *pb.RangeRequest, rss pb.KV_RangeStreamServer) error { panic("not support") } From d395b4c441aea1828613a4b7215d8f48dbea9d0d Mon Sep 17 00:00:00 2001 From: yangxuanjia Date: Wed, 21 Oct 2020 10:08:21 +0800 Subject: [PATCH 14/16] new --- proxy/grpcproxy/kv.go | 93 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 2 deletions(-) diff --git a/proxy/grpcproxy/kv.go b/proxy/grpcproxy/kv.go index 84ba0922003..0f342470420 100644 --- a/proxy/grpcproxy/kv.go +++ b/proxy/grpcproxy/kv.go @@ -22,6 +22,8 @@ import ( "go.etcd.io/etcd/v3/proxy/grpcproxy/cache" ) +const RangeStreamBatch int = 1000 + type kvProxy struct { kv clientv3.KV cache cache.Cache @@ -67,9 +69,79 @@ func (p *kvProxy) Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeRespo return gresp, nil } -// TODO yxj func (p *kvProxy) RangeStream(r *pb.RangeRequest, rss pb.KV_RangeStreamServer) error { - panic("not support") + + sendFunc := func(resp *pb.RangeResponse) (err error) { + subRSP := &pb.RangeResponse{} + subRSP.Header = &pb.ResponseHeader{} + + if resp.Kvs == nil || len(resp.Kvs) == 0 { + err = rss.Send(subRSP) + if err != nil { + return err + } + return nil + } + + start := int64(0) + end := int64(RangeStreamBatch) + for { + if end > resp.Count { + end = resp.Count + } + subRSP.Kvs = resp.Kvs[start:end] + subRSP.Count = subRSP.Count + subRSP.Header = subRSP.Header + err = rss.Send(subRSP) + if err != nil { + return err + } + if resp.Count <= end { + break + } + + start = end + end += int64(RangeStreamBatch) + } + return nil + } + + if r.Serializable { + resp, err := p.cache.Get(r) + switch err { + case nil: + cacheHits.Inc() + err := sendFunc(resp) + if err != nil { + return err + } + return nil + case cache.ErrCompacted: + cacheHits.Inc() + return err + } + + cachedMisses.Inc() + } + + resp, err := p.kv.Do(rss.Context(), RangeStreamRequestToOp(r)) + if err != nil { + return err + } + + // cache linearizable as serializable + req := *r + req.Serializable = true + gresp := (*pb.RangeResponse)(resp.GetStream()) + err = sendFunc(gresp) + if err != nil { + return err + } + + p.cache.Add(&req, gresp) + cacheKeys.Set(float64(p.cache.Size())) + + return nil } func (p *kvProxy) Put(ctx context.Context, r *pb.PutRequest) (*pb.PutResponse, error) { @@ -194,6 +266,23 @@ func RangeRequestToOp(r *pb.RangeRequest) clientv3.Op { return clientv3.OpGet(string(r.Key), opts...) } +func RangeStreamRequestToOp(r *pb.RangeRequest) clientv3.Op { + opts := []clientv3.OpOption{} + if len(r.RangeEnd) != 0 { + opts = append(opts, clientv3.WithRange(string(r.RangeEnd))) + } + opts = append(opts, clientv3.WithRev(r.Revision)) + opts = append(opts, clientv3.WithLimit(r.Limit)) + if r.KeysOnly { + opts = append(opts, clientv3.WithKeysOnly()) + } + if r.Serializable { + opts = append(opts, clientv3.WithSerializable()) + } + + return clientv3.OpGetStream(string(r.Key), opts...) +} + func PutRequestToOp(r *pb.PutRequest) clientv3.Op { opts := []clientv3.OpOption{} opts = append(opts, clientv3.WithLease(clientv3.LeaseID(r.Lease))) From f6557518a4cd0de6fbb404fee5596e0d0f6458bd Mon Sep 17 00:00:00 2001 From: yangxuanjia Date: Wed, 21 Oct 2020 14:45:43 +0800 Subject: [PATCH 15/16] new --- clientv3/kv.go | 2 +- clientv3/leasing/cache.go | 54 ++++++++++++++++++++++++++ clientv3/leasing/kv.go | 80 ++++++++++++++++++++++++++++++++++++++- clientv3/namespace/kv.go | 2 + clientv3/op.go | 6 ++- 5 files changed, 140 insertions(+), 4 deletions(-) diff --git a/clientv3/kv.go b/clientv3/kv.go index b6a3691775f..e5f0da50bf0 100644 --- a/clientv3/kv.go +++ b/clientv3/kv.go @@ -91,7 +91,7 @@ func (resp *PutResponse) OpResponse() OpResponse { func (resp *GetResponse) OpResponse() OpResponse { return OpResponse{get: resp} } -func (resp *GetStreamResponse) OpStreamResponse() OpResponse { +func (resp *GetStreamResponse) OpResponse() OpResponse { return OpResponse{getStream: resp} } func (resp *DeleteResponse) OpResponse() OpResponse { diff --git a/clientv3/leasing/cache.go b/clientv3/leasing/cache.go index d2683a54900..dd776da9bb3 100644 --- a/clientv3/leasing/cache.go +++ b/clientv3/leasing/cache.go @@ -136,6 +136,18 @@ func (lc *leaseCache) Add(key string, resp *v3.GetResponse, op v3.Op) *v3.GetRes return ret } +func (lc *leaseCache) AddStream(key string, resp *v3.GetStreamResponse, op v3.Op) *v3.GetStreamResponse { + lk := &leaseKey{(*v3.GetResponse)(resp), resp.Header.Revision, closedCh} + lc.mu.Lock() + if lc.header == nil || lc.header.Revision < resp.Header.Revision { + lc.header = resp.Header + } + lc.entries[key] = lk + ret := lk.getStream(op) + lc.mu.Unlock() + return ret +} + func (lc *leaseCache) Update(key, val []byte, respHeader *v3pb.ResponseHeader) { li := lc.entries[string(key)] if li == nil { @@ -216,6 +228,27 @@ func (lc *leaseCache) Get(ctx context.Context, op v3.Op) (*v3.GetResponse, bool) return ret, true } +func (lc *leaseCache) GetStream(ctx context.Context, op v3.Op) (*v3.GetStreamResponse, bool) { + if isBadOp(op) { + return nil, false + } + key := string(op.KeyBytes()) + li, wc := lc.notify(key) + if li == nil { + return nil, true + } + select { + case <-wc: + case <-ctx.Done(): + return nil, true + } + lc.mu.RLock() + lk := *li + ret := lk.getStream(op) + lc.mu.RUnlock() + return ret, true +} + func (lk *leaseKey) get(op v3.Op) *v3.GetResponse { ret := *lk.response ret.Header = copyHeader(ret.Header) @@ -239,6 +272,27 @@ func (lk *leaseKey) get(op v3.Op) *v3.GetResponse { return &ret } +func (lk *leaseKey) getStream(op v3.Op) *v3.GetStreamResponse { + ret := *lk.response + ret.Header = copyHeader(ret.Header) + empty := len(ret.Kvs) == 0 + if empty { + ret.Kvs = nil + } else { + kv := *ret.Kvs[0] + kv.Key = make([]byte, len(kv.Key)) + copy(kv.Key, ret.Kvs[0].Key) + if !op.IsKeysOnly() { + kv.Value = make([]byte, len(kv.Value)) + copy(kv.Value, ret.Kvs[0].Value) + } + ret.Kvs = []*mvccpb.KeyValue{&kv} + } + + retNew := (v3.GetStreamResponse)(ret) + return &retNew +} + func (lc *leaseCache) notify(key string) (*leaseKey, <-chan struct{}) { lc.mu.RLock() defer lc.mu.RUnlock() diff --git a/clientv3/leasing/kv.go b/clientv3/leasing/kv.go index fdbfded4db5..e2c2d089277 100644 --- a/clientv3/leasing/kv.go +++ b/clientv3/leasing/kv.go @@ -86,9 +86,8 @@ func (lkv *leasingKV) Get(ctx context.Context, key string, opts ...v3.OpOption) return lkv.get(ctx, v3.OpGet(key, opts...)) } -// TODO yxj func (lkv *leasingKV) GetStream(ctx context.Context, key string, opts ...v3.OpOption) (*v3.GetStreamResponse, error) { - panic("not support") + return lkv.getStream(ctx, v3.OpGetStream(key, opts...)) } func (lkv *leasingKV) Put(ctx context.Context, key, val string, opts ...v3.OpOption) (*v3.PutResponse, error) { @@ -104,6 +103,9 @@ func (lkv *leasingKV) Do(ctx context.Context, op v3.Op) (v3.OpResponse, error) { case op.IsGet(): resp, err := lkv.get(ctx, op) return resp.OpResponse(), err + case op.IsGetStream(): + resp, err := lkv.getStream(ctx, op) + return resp.OpResponse(), err case op.IsPut(): resp, err := lkv.put(ctx, op) return resp.OpResponse(), err @@ -297,6 +299,41 @@ func (lkv *leasingKV) acquire(ctx context.Context, key string, op v3.Op) (*v3.Tx return nil, ctx.Err() } +func (lkv *leasingKV) acquireStream(ctx context.Context, key string, op v3.Op) (*v3.TxnResponse, error) { + for ctx.Err() == nil { + if err := lkv.waitSession(ctx); err != nil { + return nil, err + } + lcmp := v3.Cmp{Key: []byte(key), Target: pb.Compare_LEASE} + resp, err := lkv.kv.Txn(ctx).If( + v3.Compare(v3.CreateRevision(lkv.pfx+key), "=", 0), + v3.Compare(lcmp, "=", 0)). + Then( + op, + v3.OpPut(lkv.pfx+key, "", v3.WithLease(lkv.leaseID()))). + Else( + op, + v3.OpGetStream(lkv.pfx+key), + ).Commit() + if err == nil { + if !resp.Succeeded { + kvs := resp.Responses[1].GetResponseRange().Kvs + // if txn failed since already owner, lease is acquired + resp.Succeeded = len(kvs) > 0 && v3.LeaseID(kvs[0].Lease) == lkv.leaseID() + } + return resp, nil + } + // retry if transient error + if _, ok := err.(rpctypes.EtcdError); ok { + return nil, err + } + if ev, ok := status.FromError(err); ok && ev.Code() != codes.Unavailable { + return nil, err + } + } + return nil, ctx.Err() +} + func (lkv *leasingKV) get(ctx context.Context, op v3.Op) (*v3.GetResponse, error) { do := func() (*v3.GetResponse, error) { r, err := lkv.kv.Do(ctx, op) @@ -336,6 +373,45 @@ func (lkv *leasingKV) get(ctx context.Context, op v3.Op) (*v3.GetResponse, error return getResp, nil } +func (lkv *leasingKV) getStream(ctx context.Context, op v3.Op) (*v3.GetStreamResponse, error) { + do := func() (*v3.GetStreamResponse, error) { + r, err := lkv.kv.Do(ctx, op) + return r.GetStream(), err + } + if !lkv.readySession() { + return do() + } + + if resp, ok := lkv.leases.GetStream(ctx, op); resp != nil { + return resp, nil + } else if !ok || op.IsSerializable() { + // must be handled by server or can skip linearization + return do() + } + + key := string(op.KeyBytes()) + if !lkv.leases.MayAcquire(key) { + resp, err := lkv.kv.Do(ctx, op) + return resp.GetStream(), err + } + + resp, err := lkv.acquireStream(ctx, key, v3.OpGetStream(key)) + if err != nil { + return nil, err + } + getResp := (*v3.GetStreamResponse)(resp.Responses[0].GetResponseRange()) + getResp.Header = resp.Header + if resp.Succeeded { + getResp = lkv.leases.AddStream(key, getResp, op) + lkv.wg.Add(1) + go func() { + defer lkv.wg.Done() + lkv.monitorLease(ctx, key, resp.Header.Revision) + }() + } + return getResp, nil +} + func (lkv *leasingKV) deleteRangeRPC(ctx context.Context, maxLeaseRev int64, key, end string) (*v3.DeleteResponse, error) { lkey, lend := lkv.pfx+key, lkv.pfx+end resp, err := lkv.kv.Txn(ctx).If( diff --git a/clientv3/namespace/kv.go b/clientv3/namespace/kv.go index 4257e343ff7..ac4fd385c97 100644 --- a/clientv3/namespace/kv.go +++ b/clientv3/namespace/kv.go @@ -97,6 +97,8 @@ func (kv *kvPrefix) Do(ctx context.Context, op clientv3.Op) (clientv3.OpResponse switch { case r.Get() != nil: kv.unprefixGetResponse(r.Get()) + case r.GetStream() != nil: + kv.unprefixGetStreamResponse(r.GetStream()) case r.Put() != nil: kv.unprefixPutResponse(r.Put()) case r.Del() != nil: diff --git a/clientv3/op.go b/clientv3/op.go index e5a5a0baeed..042b3630d77 100644 --- a/clientv3/op.go +++ b/clientv3/op.go @@ -110,6 +110,8 @@ func (op Op) IsPut() bool { return op.t == tPut } // IsGet returns true iff the operation is a Get. func (op Op) IsGet() bool { return op.t == tRange } +func (op Op) IsGetStream() bool { return op.t == tRangeStream } + // IsDelete returns true iff the operation is a Delete. func (op Op) IsDelete() bool { return op.t == tDeleteRange } @@ -202,6 +204,8 @@ func (op Op) toRequestOp() *pb.RequestOp { switch op.t { case tRange: return &pb.RequestOp{Request: &pb.RequestOp_RequestRange{RequestRange: op.toRangeRequest()}} + case tRangeStream: + return &pb.RequestOp{Request: &pb.RequestOp_RequestRange{RequestRange: op.toRangeStreamRequest()}} case tPut: r := &pb.PutRequest{Key: op.key, Value: op.val, Lease: int64(op.leaseID), PrevKv: op.prevKV, IgnoreValue: op.ignoreValue, IgnoreLease: op.ignoreLease} return &pb.RequestOp{Request: &pb.RequestOp_RequestPut{RequestPut: r}} @@ -229,7 +233,7 @@ func (op Op) isWrite() bool { } return false } - return op.t != tRange + return op.t != tRange || op.t != tRangeStream } // OpGet returns "get" operation based on given key and operation options. From 76dd18bb6779047d2735586aaf59b33289652586 Mon Sep 17 00:00:00 2001 From: yangxuanjia Date: Wed, 21 Oct 2020 16:39:28 +0800 Subject: [PATCH 16/16] new --- clientv3/kv.go | 6 +++++- clientv3/op.go | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/clientv3/kv.go b/clientv3/kv.go index e5f0da50bf0..4ce72d495e2 100644 --- a/clientv3/kv.go +++ b/clientv3/kv.go @@ -116,7 +116,11 @@ func NewKV(c *Client) KV { } func NewKVFromKVClient(remote pb.KVClient, c *Client) KV { - api := &kv{remote: remote, lg: c.lg} + var lg *zap.Logger + if c != nil { + lg = c.lg + } + api := &kv{remote: remote, lg: lg} if c != nil { api.callOpts = c.callOpts } diff --git a/clientv3/op.go b/clientv3/op.go index 042b3630d77..64f01fadfba 100644 --- a/clientv3/op.go +++ b/clientv3/op.go @@ -233,7 +233,7 @@ func (op Op) isWrite() bool { } return false } - return op.t != tRange || op.t != tRangeStream + return op.t != tRange && op.t != tRangeStream } // OpGet returns "get" operation based on given key and operation options.