baidu / sofa-pbrpc

A light-weight RPC implement of google protobuf RPC framework.
Other
2.13k stars 655 forks source link

sofa使用snapy压缩请求体大小为100+K时解压缩出错 #233

Closed guoliushui closed 5 years ago

guoliushui commented 5 years ago

sofa使用snapy压缩请求体大小为100+K时解压缩出错

qinzuoyan commented 5 years ago

请求体大小为100+K,是指一个protobuf的string域里面放了100+K长度的数据? 出错是什么形式?有core吗?有错误日志吗? 是否可以提供可复现的示例代码?

guoliushui commented 5 years ago

自带的echo就可以,把里面的request字符串搞大一点,我测的是117k时(就是不停的复制hollo world多复制几十遍就行了,或者复制其他长字符串多复制几遍),会出错,服务端会解压缩失败,不会core

scottzzq commented 5 years ago
void SnappyInputStream::RawUncompress(char* input_buffer, uint32_t compressed_size) {
    size_t uncompressed_size;                  
    bool success = ::snappy::GetUncompressedLength(
        input_buffer, compressed_size, &uncompressed_size);
    SCHECK(success);                           

    if (uncompressed_size > _output_buffer_size) {
        delete[] _output_buffer;               
        _output_buffer_size = uncompressed_size;
        _output_buffer = new char[_output_buffer_size];
    }                                          
    _output_buffer_size = uncompressed_size;                                                                                                                                                 
    success = ::snappy::RawUncompress(input_buffer, compressed_size,
        _output_buffer);                       
    SCHECK(success);                           
}

我跟了主要是因为 _output_buffer_size这个变量代表不了 uncompressed_size,导致解压缩之后,最终导致ByteCount函数获取到的解压缩之后数据大小不准确,从而导致了解压缩失败, 麻烦 @qinzuoyan 看看我这个修复方案是不是ok?

qinzuoyan commented 5 years ago

@scottzzq 你的修复能解决这个问题,不过可以再改进,见 #234 。这样_output_buffer可以尽可能地重复使用。你看看还有没有什么问题?

scottzzq commented 5 years ago

多谢了,你这个改法更好! @qinzuoyan