Closed guoliushui closed 5 years ago
请求体大小为100+K,是指一个protobuf的string域里面放了100+K长度的数据? 出错是什么形式?有core吗?有错误日志吗? 是否可以提供可复现的示例代码?
自带的echo就可以,把里面的request字符串搞大一点,我测的是117k时(就是不停的复制hollo world多复制几十遍就行了,或者复制其他长字符串多复制几遍),会出错,服务端会解压缩失败,不会core
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?
@scottzzq 你的修复能解决这个问题,不过可以再改进,见 #234 。这样_output_buffer可以尽可能地重复使用。你看看还有没有什么问题?
多谢了,你这个改法更好! @qinzuoyan
sofa使用snapy压缩请求体大小为100+K时解压缩出错