• 罗杰
    2021-11-23
    越来越接近实际工作了,老师特别用心,目前没找到网络这块讲解这么详细的内容了。

    作者回复: :)

    
    2
  • 荒野林克
    2021-12-17
    老师,代码里当 frame 刚好是 2G 时,按理说应该已经越界了吧?

    作者回复: 对,确实如此。多谢指正。

    
    1
  • Rex Wang
    2022-08-19 来自北京
    GitHub代码里36_kv/src/error.rs中,KvError去掉了PartialEq属性宏,这是因为std::io::Error不支持binary操作符。 为了保证之前的test依然有效,可以自己定义一个IoError替换原文中KvError中的std::io::Error,手动实现impl From<std::io::Error> for KvError。
    
    4
  • 乌龙猹
    2021-11-22
    内容夯实 思路清晰 结构完整 循序渐进 每周都期待着老师更新课程内容
    
    3
  • 进击的Lancelot
    2022-10-13 来自广东
    思考题 1: 如果要压缩方式需要同时支持 gzip、lz4、zstd 这三种,则需要 2bit 的标记位,00 表示不压缩、01 表示 gzip、10 表示 lz4、11 表示 zstd,同样也是提取出一个 compressor 的 trait 并针对不同的压缩算法实现相应的 compress 和 decompress 方法,具体可以参考我的代码仓库:https://github.com/Phoenix500526/simple_kv/blob/main/src/network/compress 下的文件 思考题 2: 我采用了 shellfish 实现了 simple-kv-cli,代码可以参考:https://github.com/Phoenix500526/simple_kv/blob/main/src/kvc-cli.rs
    
    2
  • sonald
    2023-01-17 来自北京
    ``` /// 从 stream 中读取一个完整的 frame pub async fn read_frame<S>(stream: &mut S, buf: &mut BytesMut) -> Result<(), KvError> where S: AsyncRead + Unpin + Send, { let header = stream.read_u32().await? as usize; let (len, _compressed) = decode_header(header); // 如果没有这么大的内存,就分配至少一个 frame 的内存,保证它可用 buf.reserve(LEN_LEN + len); buf.put_u32(header as _); // advance_mut 是 unsafe 的原因是,从当前位置 pos 到 pos + len, // 这段内存目前没有初始化。我们就是为了 reserve 这段内存,然后从 stream // 里读取,读取完,它就是初始化的。所以,我们这么用是安全的 unsafe { buf.advance_mut(len) }; stream.read_exact(&mut buf[LEN_LEN..]).await?; Ok(()) } ``` 这里最后面的read_exact参数是有问题的吧,假设连续两次调用read_frame而没有消费buf的话,应该改成下面这样? ``` let start = len - size; stream.read_exact(&mut buf[start..]).await?; ```
    展开
    
    