SundayT1998/milvus-client/transport does not have a README file

    RpcError

    pub suberror RpcError {
    RpcError(Code, Int, String)
    }

    一次调用失败的全部信息。raw_code 保留线上原值,code 是归类后的结果。

    用 suberror 而不是 struct:调用侧要能 raise 它, 否则「超时错误可被上层识别」就只剩比较返回值一条路。

    RpcError::code

    fn RpcError::code(self : RpcError) -> Code

    失败归类后的 gRPC 码。

    RpcError::is_deadline_exceeded

    fn RpcError::is_deadline_exceeded(self : RpcError) -> Bool

    Issue 验收项「超时错误可被上层识别」落在这里: 上层拿 RpcError 调它,而不是去比对魔法数字 4。

    RpcError::is_retryable

    fn RpcError::is_retryable(self : RpcError) -> Bool

    是否可由调用方重试。读路径上 Unavailable 是典型可重试项; 超时与参数错不盲目重试。

    RpcError::message

    fn RpcError::message(self : RpcError) -> String

    服务端给的 grpc-message。

    RpcError::new

    fn RpcError::new(raw_code : Int, message : String) -> RpcError

    把 gRPC 层的 (status, message) 包成上层能判别的错误。

    RpcError::raw_code

    fn RpcError::raw_code(self : RpcError) -> Int

    线上原始 grpc-status 数值。未知码也不丢。

    RpcError::same_kind

    fn RpcError::same_kind(self : RpcError, other : RpcError) -> Bool

    多个失败是否「同一类」。重试判断用得到:同一码、同一条消息即视为同类。

    RpcError::to_string

    fn RpcError::to_string(self : RpcError) -> String

    调用方看的一句话描述。

    Code

    pub(all) enum Code {
    Ok
    Cancelled
    Unknown
    InvalidArgument
    DeadlineExceeded
    NotFound
    AlreadyExists
    PermissionDenied
    ResourceExhausted
    FailedPrecondition
    Aborted
    OutOfRange
    Unimplemented
    Internal
    Unavailable
    DataLoss
    Unauthenticated
    }

    gRPC 状态码。

    Code::debug_repr

    fn Code::debug_repr(self : Code) -> String

    Code 的调试形态。assert_eq 的失败 diff 会用它, 这里也开出来,便于别处打日志时拿到和断言一致的表示。

    Code::from_int

    fn Code::from_int(n : Int) -> Code

    规范数值还原成枚举。未知数值归 Unknown; 原始数值不丢,RpcError::raw_code 留着。

    Code::name

    fn Code::name(self : Code) -> String

    Code::to_int

    fn Code::to_int(self : Code) -> Int

    Config

    pub(all) struct Config {
    address : String
    token : String?
    db_name : String?
    timeout_millis : Int
    enable_gzip : Bool
    }

    Milvus 连接参数。对应上游 client.Config 里与本 Issue 相关的那几个字段。

    • address 形如 host:port
    • token 走 Authorization: Bearer <token>
    • db_name 走 dbName metadata
    • timeout_millis 既是默认调用超时,也用于建连

    Config::new

    fn Config::new(address : String) -> Config

    只给地址的最小配置。

    Config::with_db_name

    fn Config::with_db_name(self : Config, db_name : String) -> Config

    Config::with_gzip

    fn Config::with_gzip(self : Config, enable? : Bool) -> Config

    打开 gzip。注意当前 moonrpc 会把调用方给的 grpc-encoding 当成保留头吞掉(只在响应侧读它),所以这里为真时得换一条路: 见 request_metadata 的注释。

    Config::with_timeout_millis

    fn Config::with_timeout_millis(self : Config, timeout_millis : Int) -> Config

    Config::with_token

    fn Config::with_token(self : Config, token : String) -> Config

    auth_header

    fn auth_header(token : String) ->
    Header

    由 token 生成 Authorization 头。空 token 当作没配。

    authorization_header

    let authorization_header : Bytes

    gRPC 的 metadata 键必须小写(HTTP/2 要求头名小写,HPACK 编码器不做大小写折叠)。

    db_name_header

    let db_name_header : Bytes

    Milvus 约定的默认库名键。上游 Go 客户端写的是 dbName, 规范化为小写后是 dbname。

    db_name_header_field

    fn db_name_header_field(db_name : String) ->
    Header

    由 db_name 生成 dbName 头。空串当作没配。

    default_port

    let default_port : Int

    Milvus 默认端口。上游 client 用的也是它。

    default_timeout_millis

    let default_timeout_millis : Int

    默认调用超时:Milvus 上游 Go 客户端默认不限,这里取 30s 作为有界默认。

    grpc_accept_encoding_header

    let grpc_accept_encoding_header : Bytes

    grpc-accept-encoding 告知服务端本端能解哪些编码。

    grpc_accept_encoding_value

    let grpc_accept_encoding_value : String

    本端能解的编码列表。moonrpc 的响应侧只会解 gzip, 所以这里只声明 gzip,避免服务端选一个我们解不开的。

    grpc_encoding_header

    let grpc_encoding_header : Bytes

    grpc-encoding 用来协商压缩。

    metadata_get

    fn metadata_get(headers : Array[
    Header
    ], name : String) -> String?

    读回一个 metadata 头(测试与调试用)。键比对不区分大小写。

    request_metadata

    fn request_metadata(config : Config) -> Array[
    Header
    ]

    组装一次调用要带的 metadata。

    注意 grpc-encoding 的处境:moonrpc 在构造请求头时会把 metadata 原样 追加进去(client.mbt 的 metadata_value_to_wire 那条循环), 但它预留的 is_reserved_header 只用于响应侧过滤,请求侧不过滤。 也就是说请求方向自定义 header 是能带出去的 —— 这点已用真实 server 实测过。 但 moonrpc 的请求侧没有 gzip 压缩请求体的实现(encode_message 只有 compressed 的响应侧解压路径),所以声明 grpc-encoding: gzip 会让 服务端按 gzip 解一个没压缩的 body,反而出错。

    因此 enable_gzip 只声明 grpc-accept-encoding(让服务端可以压响应), 不声明 grpc-encoding(不声称自己压了请求)。