[INFO] cloning repository https://github.com/scikie/mini-redis
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/scikie/mini-redis" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fscikie%2Fmini-redis", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fscikie%2Fmini-redis'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] 8e788be96d3afc10d07abc1697d7a491703d500b
[INFO] documenting scikie/mini-redis against da3f5c31e5535b3dc210067de660a45784ae1e9c for pr-162169
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fscikie%2Fmini-redis" "/workspace/builds/worker-3-tc2/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-3-tc2/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/scikie/mini-redis
[INFO] finished tweaking git repo https://github.com/scikie/mini-redis
[INFO] tweaked toml for git repo https://github.com/scikie/mini-redis written to /workspace/builds/worker-3-tc2/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/scikie/mini-redis on toolchain da3f5c31e5535b3dc210067de660a45784ae1e9c
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+da3f5c31e5535b3dc210067de660a45784ae1e9c" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/scikie/mini-redis already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+da3f5c31e5535b3dc210067de660a45784ae1e9c" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:8683fc1fc2eb5c9ac98e0d076ab094b2ffac7f99da555d2b6a2e27f346de2ec7" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] f89167364e48aee210c81a08cb9778e8b23e268e9624ae4a4e82e54af44e9223
[INFO] running `Command { std: "docker" "start" "f89167364e48aee210c81a08cb9778e8b23e268e9624ae4a4e82e54af44e9223", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "f89167364e48aee210c81a08cb9778e8b23e268e9624ae4a4e82e54af44e9223", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "f89167364e48aee210c81a08cb9778e8b23e268e9624ae4a4e82e54af44e9223" "/opt/rustwide/cargo-home/bin/cargo" "+da3f5c31e5535b3dc210067de660a45784ae1e9c" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "f89167364e48aee210c81a08cb9778e8b23e268e9624ae4a4e82e54af44e9223", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-w" "/opt/rustwide/workdir" "--user" "0:0" "f89167364e48aee210c81a08cb9778e8b23e268e9624ae4a4e82e54af44e9223" "/opt/rustwide/cargo-home/bin/cargo" "+da3f5c31e5535b3dc210067de660a45784ae1e9c" "doc" "--frozen" "--no-deps" "--document-private-items" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling proc-macro2 v1.0.66
[INFO] [stderr]    Compiling unicode-ident v1.0.11
[INFO] [stderr]    Compiling autocfg v1.1.0
[INFO] [stderr]    Compiling libc v0.2.153
[INFO] [stderr]     Checking pin-project-lite v0.2.13
[INFO] [stderr]     Checking once_cell v1.18.0
[INFO] [stderr]     Checking smallvec v1.11.0
[INFO] [stderr]    Compiling parking_lot_core v0.9.8
[INFO] [stderr]    Compiling futures-core v0.3.28
[INFO] [stderr]     Checking utf8parse v0.2.1
[INFO] [stderr]     Checking regex-syntax v0.7.5
[INFO] [stderr]     Checking colorchoice v1.0.0
[INFO] [stderr]     Checking anstyle-query v1.0.0
[INFO] [stderr]     Checking anstyle v1.0.2
[INFO] [stderr]     Checking regex-syntax v0.6.29
[INFO] [stderr]     Checking clap_lex v0.5.1
[INFO] [stderr]    Compiling heck v0.4.1
[INFO] [stderr]     Checking bytes v1.5.0
[INFO] [stderr]     Checking log v0.4.20
[INFO] [stderr]     Checking anstyle-parse v0.2.1
[INFO] [stderr]     Checking overload v0.1.1
[INFO] [stderr]     Checking strsim v0.10.0
[INFO] [stderr]     Checking nu-ansi-term v0.46.0
[INFO] [stderr]     Checking sharded-slab v0.1.4
[INFO] [stderr]     Checking anstream v0.5.0
[INFO] [stderr]     Checking tracing-core v0.1.31
[INFO] [stderr]     Checking thread_local v1.1.7
[INFO] [stderr]    Compiling lock_api v0.4.10
[INFO] [stderr]    Compiling num-traits v0.2.16
[INFO] [stderr]     Checking clap_builder v4.4.2
[INFO] [stderr]    Compiling quote v1.0.33
[INFO] [stderr]     Checking tracing-log v0.1.3
[INFO] [stderr]    Compiling syn v2.0.32
[INFO] [stderr]     Checking num_cpus v1.16.0
[INFO] [stderr]     Checking mio v0.8.11
[INFO] [stderr]     Checking signal-hook-registry v1.4.1
[INFO] [stderr]     Checking socket2 v0.5.3
[INFO] [stderr]     Checking atoi v2.0.0
[INFO] [stderr]     Checking parking_lot v0.12.1
[INFO] [stderr]     Checking regex-automata v0.3.8
[INFO] [stderr]     Checking regex-automata v0.1.10
[INFO] [stderr]     Checking matchers v0.1.0
[INFO] [stderr]     Checking regex v1.9.5
[INFO] [stderr]    Compiling tracing-attributes v0.1.26
[INFO] [stderr]    Compiling tokio-macros v2.1.0
[INFO] [stderr]    Compiling async-stream-impl v0.3.5
[INFO] [stderr]    Compiling clap_derive v4.4.2
[INFO] [stderr]     Checking tokio v1.32.0
[INFO] [stderr]     Checking async-stream v0.3.5
[INFO] [stderr]     Checking tracing v0.1.37
[INFO] [stderr]     Checking tracing-subscriber v0.3.17
[INFO] [stderr]     Checking clap v4.4.2
[INFO] [stderr]     Checking tokio-stream v0.1.14
[INFO] [stderr]     Checking mini-redis v0.4.1 (/opt/rustwide/workdir)
[INFO] [stderr]  Documenting mini-redis v0.4.1 (/opt/rustwide/workdir)
[INFO] [stdout] warning: unresolved link to `connect`
[INFO] [stdout]   --> src/clients/client.rs:30:21
[INFO] [stdout]    |
[INFO] [stdout] 30 | /// the [`connect`](fn@connect) function.
[INFO] [stdout]    |                     ^^^^^^^^^^ no item named `connect` in scope
[INFO] [stdout]    |
[INFO] [stdout]    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout]    = note: `#[warn(rustdoc::broken_intra_doc_links)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `connect`
[INFO] [stdout]   --> src/clients/blocking_client.rs:39:39
[INFO] [stdout]    |
[INFO] [stdout] 39 | /// established using the [`connect`](fn@connect) function.
[INFO] [stdout]    |                                       ^^^^^^^^^^ no item named `connect` in scope
[INFO] [stdout]    |
[INFO] [stdout]    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `Duration`
[INFO] [stdout]   --> src/cmd/set.rs:34:18
[INFO] [stdout]    |
[INFO] [stdout] 34 |     /// 使用 Option<Duration> 表示这是一个可选参数：
[INFO] [stdout]    |                    ^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(rustdoc::invalid_html_tags)]` on by default
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]    |
[INFO] [stdout] 34 |     /// 使用 `Option<Duration>` 表示这是一个可选参数：
[INFO] [stdout]    |              +                +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `Bytes`
[INFO] [stdout]   --> src/cmd/ping.rs:21:20
[INFO] [stdout]    |
[INFO] [stdout] 21 |     /// 【知识点：Option<Bytes>】
[INFO] [stdout]    |                         ^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]    |
[INFO] [stdout] 21 |     /// 【知识点：`Option<Bytes>`】
[INFO] [stdout]    |                   +             +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/cmd/get.rs:12:1
[INFO] [stdout]    |
[INFO] [stdout] 12 | / pub struct Get {
[INFO] [stdout] 13 | |     /// 要获取的键名
[INFO] [stdout] 14 | |     /// 使用 String 类型存储，确保拥有所有权，避免生命周期问题
[INFO] [stdout] 15 | |     key: String,
[INFO] [stdout] 16 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `这样外部代码可以直接使用 `cmd::Get` 而不需要 `cmd::get::Get``
[INFO] [stdout]    = help: ends near `Redis GET 命令结构体`
[INFO] [stdout]    = note: `#[deny(rustdoc::unportable_markdown)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/cmd/publish.rs:28:1
[INFO] [stdout]    |
[INFO] [stdout] 28 | / pub struct Publish {
[INFO] [stdout] 29 | |     /// Name of the channel on which the message should be published.
[INFO] [stdout] 30 | |     /// 【知识点：频道名称】
[INFO] [stdout] ...  |
[INFO] [stdout] 38 | |     message: Bytes,
[INFO] [stdout] 39 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `外部代码可以直接使用 `cmd::Publish``
[INFO] [stdout]    = help: ends near `Posts a message to the given channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/cmd/set.rs:21:1
[INFO] [stdout]    |
[INFO] [stdout] 21 | / pub struct Set {
[INFO] [stdout] 22 | |     /// 查找键
[INFO] [stdout] 23 | |     /// 使用 String 类型因为键通常是可读的文本
[INFO] [stdout] 24 | |     key: String,
[INFO] [stdout] ...  |
[INFO] [stdout] 37 | |     expire: Option<Duration>,
[INFO] [stdout] 38 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `外部代码可以直接使用 `cmd::Set``
[INFO] [stdout]    = help: ends near `Redis SET 命令`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/cmd/subscribe.rs:38:1
[INFO] [stdout]    |
[INFO] [stdout] 38 | / pub struct Subscribe {
[INFO] [stdout] ...  |
[INFO] [stdout] 43 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `- 它们操作相同的订阅状态`
[INFO] [stdout]    = help: ends near ``
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/cmd/subscribe.rs:38:1
[INFO] [stdout]    |
[INFO] [stdout] 38 | / pub struct Subscribe {
[INFO] [stdout] ...  |
[INFO] [stdout] 43 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `- 共享订阅管理的内部状态`
[INFO] [stdout]    = help: ends near ``
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/cmd/subscribe.rs:60:1
[INFO] [stdout]    |
[INFO] [stdout] 60 | / pub struct Unsubscribe {
[INFO] [stdout] 61 | |     channels: Vec<String>,
[INFO] [stdout] 62 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `- 它们操作相同的订阅状态`
[INFO] [stdout]    = help: ends near ``
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/cmd/subscribe.rs:60:1
[INFO] [stdout]    |
[INFO] [stdout] 60 | / pub struct Unsubscribe {
[INFO] [stdout] 61 | |     channels: Vec<String>,
[INFO] [stdout] 62 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `- 共享订阅管理的内部状态`
[INFO] [stdout]    = help: ends near ``
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/cmd/ping.rs:19:1
[INFO] [stdout]    |
[INFO] [stdout] 19 | / pub struct Ping {
[INFO] [stdout] 20 | |     /// optional message to be returned
[INFO] [stdout] 21 | |     /// 【知识点：Option<Bytes>】
[INFO] [stdout] ...  |
[INFO] [stdout] 25 | |     msg: Option<Bytes>,
[INFO] [stdout] 26 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `外部代码可以直接使用 `cmd::Ping``
[INFO] [stdout]    = help: ends near `return a copy of the argument as a bulk.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/cmd/unknown.rs:22:1
[INFO] [stdout]    |
[INFO] [stdout] 22 | / pub struct Unknown {
[INFO] [stdout] ...  |
[INFO] [stdout] 27 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Unknown 命令用于优雅处理不支持的命令`
[INFO] [stdout]    = help: ends near `Represents an "unknown" command. This is not a real `Redis` command.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `u8`
[INFO] [stdout]   --> src/frame.rs:48:29
[INFO] [stdout]    |
[INFO] [stdout] 48 | /// 【知识点：为什么使用 Bytes 而不是 Vec<u8>】
[INFO] [stdout]    |                                          ^^^^
[INFO] [stdout]    |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]    |
[INFO] [stdout] 48 | /// 【知识点：为什么使用 Bytes 而不是 `Vec<u8>`】
[INFO] [stdout]    |                                       +       +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `u8`
[INFO] [stdout]   --> src/frame.rs:49:47
[INFO] [stdout]    |
[INFO] [stdout] 49 | /// Bytes 是 bytes crate 提供的引用计数的不可变字节序列，相比 Vec<u8> 的优势：
[INFO] [stdout]    |                                                                  ^^^^
[INFO] [stdout]    |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]    |
[INFO] [stdout] 49 | /// Bytes 是 bytes crate 提供的引用计数的不可变字节序列，相比 `Vec<u8>` 的优势：
[INFO] [stdout]    |                                                               +       +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `Shared`
[INFO] [stdout]   --> src/db.rs:93:11
[INFO] [stdout]    |
[INFO] [stdout] 93 | ///    Arc<Shared> 可以安全地跨线程传递，Shared 内部的 Mutex 保证数据安全
[INFO] [stdout]    |           ^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]    |
[INFO] [stdout] 93 | ///    `Arc<Shared>` 可以安全地跨线程传递，Shared 内部的 Mutex 保证数据安全
[INFO] [stdout]    |        +           +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `Shared`
[INFO] [stdout]    --> src/db.rs:103:32
[INFO] [stdout]     |
[INFO] [stdout] 103 |     /// 指向共享状态的 Arc，后台任务也持有 Arc<Shared> 的克隆
[INFO] [stdout]     |                                               ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 103 |     /// 指向共享状态的 Arc，后台任务也持有 `Arc<Shared>` 的克隆
[INFO] [stdout]     |                                            +           +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `Bytes`
[INFO] [stdout]    --> src/db.rs:158:50
[INFO] [stdout]     |
[INFO] [stdout] 158 | /// 2. pub_sub: HashMap<String, broadcast::Sender<Bytes>>
[INFO] [stdout]     |                                                  ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `Frame`
[INFO] [stdout]    --> src/parse.rs:109:36
[INFO] [stdout]     |
[INFO] [stdout] 109 |     /// `self.parts.next()`返回Option<Frame>：
[INFO] [stdout]     |                                      ^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 109 |     /// `self.parts.next()``返回Option<Frame>`：
[INFO] [stdout]     |                            +                 +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `u8`
[INFO] [stdout]    --> src/parse.rs:165:41
[INFO] [stdout]     |
[INFO] [stdout] 165 |     /// String.into_bytes()将String转换为Vec<u8>，
[INFO] [stdout]     |                                             ^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 165 |     /// String.into_bytes()`将String转换为Vec<u8>`，
[INFO] [stdout]     |                            +                     +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `dyn`
[INFO] [stdout]    --> src/parse.rs:329:28
[INFO] [stdout]     |
[INFO] [stdout] 329 | /// 2. **错误链支持**：可以向上传播为Box<dyn std::error::Error>
[INFO] [stdout]     |                                         ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `DbInner`
[INFO] [stdout]    --> src/server.rs:179:19
[INFO] [stdout]     |
[INFO] [stdout] 179 |     /// - Db内部是Arc<DbInner>，因此克隆Db只是增加引用计数，成本低
[INFO] [stdout]     |                      ^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 179 |     /// - `Db内部是Arc<DbInner>`，因此克隆Db只是增加引用计数，成本低
[INFO] [stdout]     |           +                    +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: this URL is not a hyperlink
[INFO] [stdout]    --> src/server.rs:537:9
[INFO] [stdout]     |
[INFO] [stdout] 537 |     /// https://redis.io/topics/pipelining
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: bare URLs are not automatically turned into clickable links
[INFO] [stdout]     = note: `#[warn(rustdoc::bare_urls)]` on by default
[INFO] [stdout] help: use an automatic link instead
[INFO] [stdout]     |
[INFO] [stdout] 537 |     /// <https://redis.io/topics/pipelining>
[INFO] [stdout]     |         +                                  +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/connection.rs:49:1
[INFO] [stdout]    |
[INFO] [stdout] 49 | / pub struct Connection {
[INFO] [stdout] 50 | |     /// 带缓冲的 TCP 流
[INFO] [stdout] 51 | |     ///
[INFO] [stdout] 52 | |     /// # BufWriter 的作用
[INFO] [stdout] ...  |
[INFO] [stdout] 79 | |     buffer: BytesMut,
[INFO] [stdout] 80 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `- 实现自定义的客户端逻辑`
[INFO] [stdout]    = help: ends near ``
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/connection.rs:49:1
[INFO] [stdout]    |
[INFO] [stdout] 49 | / pub struct Connection {
[INFO] [stdout] 50 | |     /// 带缓冲的 TCP 流
[INFO] [stdout] 51 | |     ///
[INFO] [stdout] 52 | |     /// # BufWriter 的作用
[INFO] [stdout] ...  |
[INFO] [stdout] 79 | |     buffer: BytesMut,
[INFO] [stdout] 80 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `- 学习 Redis 协议的工作方式`
[INFO] [stdout]    = help: ends near ``
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `dyn`
[INFO] [stdout]    --> src/lib.rs:243:13
[INFO] [stdout]     |
[INFO] [stdout] 243 | /// 【知识点：Box<dyn std::error::Error> 详解】
[INFO] [stdout]     |                  ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `T`
[INFO] [stdout]    --> src/lib.rs:270:15
[INFO] [stdout]     |
[INFO] [stdout] 270 | ///    - Mutex<T> 是 Sync，Cell<T> 不是 Sync
[INFO] [stdout]     |               ^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 270 | ///    - `Mutex<T>` 是 Sync，Cell<T> 不是 Sync
[INFO] [stdout]     |          +        +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `T`
[INFO] [stdout]    --> src/lib.rs:270:30
[INFO] [stdout]     |
[INFO] [stdout] 270 | ///    - Mutex<T> 是 Sync，Cell<T> 不是 Sync
[INFO] [stdout]     |                                ^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 270 | ///    - Mutex<T> 是 Sync，`Cell<T>` 不是 Sync
[INFO] [stdout]     |                            +       +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `dyn`
[INFO] [stdout]    --> src/lib.rs:293:25
[INFO] [stdout]     |
[INFO] [stdout] 293 | /// 只有在需要统一错误类型时才转换为 Box<dyn Error>。
[INFO] [stdout]     |                                         ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `T`
[INFO] [stdout]    --> src/lib.rs:316:18
[INFO] [stdout]     |
[INFO] [stdout] 316 | /// crate::Result<T> 特指使用本模块 Error 类型的 Result
[INFO] [stdout]     |                  ^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 316 | /// `crate::Result<T>` 特指使用本模块 Error 类型的 Result
[INFO] [stdout]     |     +                +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `T`
[INFO] [stdout]    --> src/lib.rs:319:17
[INFO] [stdout]     |
[INFO] [stdout] 319 | /// 当函数返回 Result<T> 时，可以使用 ? 操作符：
[INFO] [stdout]     |                      ^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 319 | /// 当函数返回 `Result<T>` 时，可以使用 ? 操作符：
[INFO] [stdout]     |                +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `dyn`
[INFO] [stdout]    --> src/lib.rs:327:22
[INFO] [stdout]     |
[INFO] [stdout] 327 | /// ? 会自动将错误类型转换为 Box<dyn Error>（通过 From trait）。
[INFO] [stdout]     |                                 ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: `instrument` is both a module and an attribute macro
[INFO] [stdout]   --> src/cmd/get.rs:87:23
[INFO] [stdout]    |
[INFO] [stdout] 87 |     /// # tracing 的 #[instrument] 宏详解
[INFO] [stdout]    |                        ^^^^^^^^^^ ambiguous link
[INFO] [stdout]    |
[INFO] [stdout] help: to link to the module, prefix with `mod@`
[INFO] [stdout]    |
[INFO] [stdout] 87 |     /// # tracing 的 #[mod@instrument] 宏详解
[INFO] [stdout]    |                        ++++
[INFO] [stdout] help: to link to the attribute macro, prefix with `attribute@`
[INFO] [stdout]    |
[INFO] [stdout] 87 |     /// # tracing 的 #[attribute@instrument] 宏详解
[INFO] [stdout]    |                        ++++++++++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: `instrument` is both a module and an attribute macro
[INFO] [stdout]    --> src/server.rs:528:5
[INFO] [stdout]     |
[INFO] [stdout] 528 | /     /// 【知识点：Handler::run - 处理单个连接】
[INFO] [stdout] 529 | |     /// Process a single connection.
[INFO] [stdout] 530 | |     ///
[INFO] [stdout] 531 | |     /// Request frames are read from the socket and processed. Responses are
[INFO] [stdout] ...   |
[INFO] [stdout] 550 | |     /// Span代表一个时间段内的操作，类似于日志中的"进入函数"和"退出函数"，
[INFO] [stdout] 551 | |     /// 但更适合异步代码，因为异步函数的执行可能是分段的。
[INFO] [stdout]     | |__________________________________________________________^
[INFO] [stdout]     |
[INFO] [stdout]     = note: the link appears in this line:
[INFO] [stdout]             
[INFO] [stdout]             【知识点：#[instrument]属性宏 - Tracing的自动追踪】
[INFO] [stdout]                              ^^^^^^^^^^
[INFO] [stdout]     = note: ambiguous link
[INFO] [stdout]     = help: to link to the module, prefix with `mod@`: mod@instrument
[INFO] [stdout]     = help: to link to the attribute macro, prefix with `attribute@`: attribute@instrument
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr] error: could not document `mini-redis`
[INFO] [stderr] warning: build failed, waiting for other jobs to finish...
[INFO] running `Command { std: "docker" "inspect" "f89167364e48aee210c81a08cb9778e8b23e268e9624ae4a4e82e54af44e9223", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "f89167364e48aee210c81a08cb9778e8b23e268e9624ae4a4e82e54af44e9223", kill_on_drop: false }`
[INFO] [stdout] f89167364e48aee210c81a08cb9778e8b23e268e9624ae4a4e82e54af44e9223
