提交 4a1adf11 编写于 作者: Y yy0 提交者: wangzelin.wzl

[clog] fix observer restart failed with decompression log entry in last...

[clog] fix observer restart failed with decompression log entry in last uncomplete block return -4527
上级 9d75514b
......@@ -129,7 +129,6 @@ private:
int get_next_entry_(Type& entry, ObReadParam& param, bool& force_read, int64_t& persist_len);
bool check_last_block_(const file_id_t file_id, const offset_t start_offset, const int64_t last_block_ts) const;
bool is_compressed_item_(const ObCLogItemType item_type) const;
int check_compressed_entry_length_(const char* buf, const int64_t buf_size) const;
private:
// magic number length in byte.
......@@ -467,21 +466,6 @@ bool ObRawEntryIterator<Type, Interface>::is_compressed_item_(const ObCLogItemTy
CLOG_ENTRY_COMPRESSED_ZSTD_138 == item_type);
}
template <class Type, class Interface>
int ObRawEntryIterator<Type, Interface>::check_compressed_entry_length_(const char* buf, const int64_t buf_size) const
{
int ret = common::OB_SUCCESS;
ObCompressedLogEntry comp_entry;
int64_t consume_buf_len = 0;
if (OB_FAIL(comp_entry.deserialize(buf, buf_size, consume_buf_len))) {
CLOG_LOG(WARN, "failed to deserialize ObCompressedLogEntry", K(ret));
} else if (OB_UNLIKELY(consume_buf_len > buf_size)) {
ret = common::OB_DESERIALIZE_ERROR;
CLOG_LOG(WARN, "buf not enough", K(ret), K(consume_buf_len), K(buf_size));
}
return ret;
}
// return OB_EAGAIN: to prepare buffer and do get_next_entry_ again
template <class Type, class Interface>
int ObRawEntryIterator<Type, Interface>::get_next_entry_(
......@@ -499,11 +483,11 @@ int ObRawEntryIterator<Type, Interface>::get_next_entry_(
if (is_compressed_item_(item_type)) {
int64_t local_pos = 0;
int64_t uncompress_len = 0;
if (OB_FAIL(check_compressed_entry_length_(buf_cur_, buf_size))) {
CLOG_LOG(WARN, "failed to check compressed entry length", K(ret), K(param), K(cur_offset_), K(buf_size));
} else if (OB_FAIL(uncompress(
buf_cur_, buf_size, compress_rbuf_.buf_, compress_rbuf_.buf_len_, uncompress_len, pos))) {
CLOG_LOG(WARN, "failed to uncompress", K(ret), K(param), K(buf_size));
if (OB_FAIL(
uncompress(buf_cur_, buf_size, compress_rbuf_.buf_, compress_rbuf_.buf_len_, uncompress_len, pos))) {
CLOG_LOG(
WARN, "failed to uncompress, ret will be overwrite with OB_INVALID_DATA", K(ret), K(param), K(buf_size));
ret = OB_INVALID_DATA;
} else if (OB_FAIL(entry.deserialize(compress_rbuf_.buf_, uncompress_len, local_pos))) {
if (common::OB_DESERIALIZE_ERROR == ret) {
ret = common::OB_INVALID_DATA;
......@@ -521,10 +505,16 @@ int ObRawEntryIterator<Type, Interface>::get_next_entry_(
} else { /*do nothing*/
}
} else {
ret = entry.deserialize(buf_cur_, buf_size, pos);
if (OB_SUCC(ret) && OB_UNLIKELY(pos > buf_size)) {
ret = common::OB_DESERIALIZE_ERROR;
CLOG_LOG(WARN, "buf not enough", K(ret), K(entry), K(buf_size), K(pos));
if (OB_FAIL(entry.deserialize(buf_cur_, buf_size, pos))) {
CLOG_LOG(WARN,
"log entry deserialize error, maybe corrupted",
K(ret),
K(item_type),
KP(buf_cur_),
KP(buf_end_),
K(pos),
K(cur_offset_),
K(file_id_));
}
}
if (OB_FAIL(ret)) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册