Fix sw accum_checksum rollback bug.

This commit is contained in:
obdev
2023-03-03 07:46:11 +00:00
committed by ob-robot
parent 6d7dbdc556
commit c19b2b1dcd
5 changed files with 176 additions and 44 deletions

View File

@ -32,6 +32,98 @@ using namespace palf;
namespace unittest
{
TEST(TestLogGroupEntryHeader, test_group_entry_header_wrap_checksum)
{
const int64_t BUFSIZE = 1 << 21;
LogGroupEntryHeader header;
LogEntryHeader log_entry_header;
int64_t group_entry_header_size = header.get_serialize_size();
int64_t log_entry_header_size = log_entry_header.get_serialize_size();
int64_t total_header_size = group_entry_header_size + log_entry_header_size;
char buf[BUFSIZE];
char ptr[BUFSIZE] = "helloworld";
// 数据部分
memcpy(buf + total_header_size, ptr, strlen(ptr));
bool is_padding_log = false;
const char *data = buf + total_header_size;
int64_t data_len = strlen(ptr);
memcpy(buf + total_header_size + data_len + log_entry_header_size, ptr, strlen(ptr));
int64_t min_timestamp = 0;
share::SCN max_scn = share::SCN::min_scn();
int64_t log_id = 1;
LSN committed_lsn;
committed_lsn.val_ = 1;
int64_t proposal_id = 1;
int64_t log_checksum = 0;
// test LogEntry and LogEntryHeader
EXPECT_EQ(OB_SUCCESS, log_entry_header.generate_header(data, data_len, share::SCN::base_scn()));
int64_t tmp_pos = 0, new_pos = 0;
EXPECT_EQ(OB_SUCCESS,
log_entry_header.serialize(buf + group_entry_header_size, BUFSIZE, tmp_pos));
EXPECT_EQ(tmp_pos, log_entry_header_size);
EXPECT_EQ(OB_SUCCESS,
log_entry_header.serialize(buf + total_header_size + data_len, BUFSIZE, new_pos));
EXPECT_EQ(new_pos, log_entry_header_size);
// test LogGroupEntryHeader and LogEntry
LogWriteBuf write_buf;
int64_t group_log_data_len = 0;
int64_t group_log_len = group_entry_header_size + (log_entry_header_size + data_len);
for (int64_t sub_val = 1; sub_val < group_log_len; ++sub_val) {
write_buf.reset();
EXPECT_EQ(OB_SUCCESS, write_buf.push_back(buf, sub_val));
EXPECT_EQ(OB_SUCCESS, write_buf.push_back(buf + sub_val, group_log_len - sub_val));
group_log_data_len = group_log_len - group_entry_header_size;
PALF_LOG(INFO, "before group_header generate", K(group_log_data_len), K(write_buf), K(sub_val));
EXPECT_EQ(OB_SUCCESS,
header.generate(false, is_padding_log, write_buf, group_log_data_len,
max_scn, log_id, committed_lsn, proposal_id, log_checksum));
}
is_padding_log = true;
for (int64_t sub_val = 1; sub_val < group_log_len; ++sub_val) {
write_buf.reset();
EXPECT_EQ(OB_SUCCESS, write_buf.push_back(buf, sub_val));
EXPECT_EQ(OB_SUCCESS, write_buf.push_back(buf + sub_val, group_log_len - sub_val));
group_log_data_len = group_log_len - group_entry_header_size;
PALF_LOG(INFO, "before group_header generate", K(group_log_data_len), K(write_buf), K(sub_val));
EXPECT_EQ(OB_SUCCESS,
header.generate(false, is_padding_log, write_buf, group_log_data_len,
max_scn, log_id, committed_lsn, proposal_id, log_checksum));
}
group_log_len = group_entry_header_size + 2 * (log_entry_header_size + data_len);
for (int64_t sub_val = 1; sub_val < group_log_len; ++sub_val) {
write_buf.reset();
EXPECT_EQ(OB_SUCCESS, write_buf.push_back(buf, sub_val));
EXPECT_EQ(OB_SUCCESS, write_buf.push_back(buf + sub_val, group_log_len - sub_val));
group_log_data_len = group_log_len - group_entry_header_size;
PALF_LOG(INFO, "before group_header generate", K(group_log_data_len), K(write_buf), K(sub_val));
EXPECT_EQ(OB_SUCCESS,
header.generate(false, is_padding_log, write_buf, group_log_data_len,
max_scn, log_id, committed_lsn, proposal_id, log_checksum));
}
is_padding_log = true;
for (int64_t sub_val = 1; sub_val < group_log_len; ++sub_val) {
write_buf.reset();
EXPECT_EQ(OB_SUCCESS, write_buf.push_back(buf, sub_val));
EXPECT_EQ(OB_SUCCESS, write_buf.push_back(buf + sub_val, group_log_len - sub_val));
group_log_data_len = group_log_len - group_entry_header_size;
PALF_LOG(INFO, "before group_header generate", K(group_log_data_len), K(write_buf), K(sub_val));
EXPECT_EQ(OB_SUCCESS,
header.generate(false, is_padding_log, write_buf, group_log_data_len,
max_scn, log_id, committed_lsn, proposal_id, log_checksum));
}
is_padding_log = true;
EXPECT_EQ(OB_SUCCESS,
header.generate(false, is_padding_log, write_buf, group_log_data_len,
max_scn, log_id, committed_lsn, proposal_id, log_checksum));
}
TEST(TestLogGroupEntryHeader, test_log_group_entry_header)
{
const int64_t BUFSIZE = 1 << 21;
@ -78,8 +170,6 @@ TEST(TestLogGroupEntryHeader, test_log_group_entry_header)
max_scn, log_id, committed_lsn, proposal_id, log_checksum));
max_scn.set_base();
int64_t defalut_acc = 10;
header.update_accumulated_checksum(defalut_acc);
header.update_header_checksum();
min_timestamp = 1;
EXPECT_EQ(OB_SUCCESS,
header.generate(false, is_padding_log, write_buf, data_len + log_entry_header_size,
@ -92,8 +182,6 @@ TEST(TestLogGroupEntryHeader, test_log_group_entry_header)
EXPECT_EQ(data_len + log_entry_header_size, header.get_data_len());
EXPECT_EQ(max_scn, header.get_max_scn());
EXPECT_EQ(log_id, header.get_log_id());
EXPECT_EQ(proposal_id, header.get_log_proposal_id());
EXPECT_EQ(committed_lsn, header.get_committed_end_lsn());
int64_t pos = 0;
EXPECT_EQ(OB_SUCCESS, header.serialize(buf, BUFSIZE, pos));
EXPECT_EQ(pos, header.get_serialize_size());