Files
oceanbase/unittest/storage/memtable/test_rowkey_codec.cpp
wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

440 lines
14 KiB
C++

/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
*/
#include "storage/memtable/ob_rowkey_codec.h"
#include "lib/allocator/page_arena.h"
#include "common/object/ob_object.h"
#include "common/rowkey/ob_rowkey.h"
#include "utils_rowkey_builder.h"
#include <gtest/gtest.h>
namespace oceanbase
{
namespace unittest
{
using namespace oceanbase::common;
using namespace oceanbase::memtable;
class ObBuffer
{
public:
ObBuffer() : buf_(NULL), cap_(0), pos_(0) {}
~ObBuffer()
{
if (NULL != buf_)
{
delete[] buf_;
buf_ = NULL;
}
}
public:
void set_buf(const int64_t cap)
{
buf_ = new(std::nothrow) char[cap];
assert(NULL != buf_);
cap_ = cap;
pos_ = 0;
}
void reset()
{
if (NULL != buf_)
{
delete[] buf_;
buf_ = NULL;
}
cap_ = 0;
pos_ = 0;
}
public:
char *get_data() const { return buf_; }
int64_t get_capacity() const { return cap_; }
int64_t &get_capacity() { return cap_; }
int64_t &get_position() { return pos_; }
private:
char *buf_;
int64_t cap_;
int64_t pos_;
};
////////////////////////////////////////////////////////////////////////////////////////////////////
void test_decode_encode(const ObRowkeyWrapper &rkw)
{
static const int64_t VALID_BUFFER_SIZE = 1<<21;
static const int64_t LOOP_TIMES = 100;
ObBuffer src_buffer;
ObBuffer dst_buffer;
int ret = OB_SUCCESS;
src_buffer.set_buf(VALID_BUFFER_SIZE);
for (int64_t i = 0; i < LOOP_TIMES; ++i)
{
int64_t encode_orig_pos = src_buffer.get_position();
ret = encode_table_id(i, src_buffer);
ASSERT_EQ(OB_SUCCESS, ret);
ret = encode_rowkey_len(static_cast<uint8_t>(rkw.get_obj_cnt()), src_buffer);
ASSERT_EQ(OB_SUCCESS, ret);
ret = encode_compact_rowkey(rkw.get_rowkey(), src_buffer);
if (OB_FAIL(ret)) abort();
ASSERT_EQ(OB_SUCCESS, ret);
dst_buffer.set_buf(VALID_BUFFER_SIZE);
for (int64_t j = 0; j < LOOP_TIMES; ++j)
{
int64_t decode_orig_pos = src_buffer.get_position();
src_buffer.get_position() = encode_orig_pos;
uint64_t table_id = 0;
ret = decode_table_id(table_id, src_buffer);
ASSERT_EQ(OB_SUCCESS, ret);
ASSERT_EQ(static_cast<int64_t>(table_id), i);
uint8_t rk_len = 0;
ret = decode_rowkey_len(rk_len, src_buffer);
ASSERT_EQ(OB_SUCCESS, ret);
ObRowkeyWrapper decode_rkw(rk_len);
ret = decode_compact_rowkey(decode_rkw.get_rowkey(), src_buffer, dst_buffer);
ASSERT_EQ(OB_SUCCESS, ret);
ASSERT_EQ(rkw.get_rowkey(), decode_rkw.get_rowkey());
ASSERT_EQ(decode_orig_pos, src_buffer.get_position());
if (rkw.get_rowkey() != decode_rkw.get_rowkey())
{
TRANS_LOG(WARN, "NE::", "\nrk1", rkw.get_rowkey(), "\nrk2", decode_rkw.get_rowkey());
}
}
}
}
TEST(TestObRowkeyCodec, test_encode_decode_normal)
{
test_decode_encode(
RK(
V("hello", 5),
V(NULL, 0),
I(1024),
N("3.14"),
//B(true),
//T(::oceanbase::common::ObTimeUtility::current_time()),
U(),
OBMIN(),
OBMAX(),
V("world", 5),
V(NULL, 0),
I(-1024),
N("-3.14"),
//B(false),
//T(-::oceanbase::common::ObTimeUtility::current_time()),
U(),
OBMIN(),
OBMAX()
));
int64_t v = 0x0100abcd01001234;
test_decode_encode(
RK(
V(NULL, 0),
V(reinterpret_cast<char *>(&v), 1),
V(reinterpret_cast<char *>(&v), 2),
V(reinterpret_cast<char *>(&v), 3),
V(reinterpret_cast<char *>(&v), 4),
V(reinterpret_cast<char *>(&v), 5),
V(reinterpret_cast<char *>(&v), 6),
V(reinterpret_cast<char *>(&v), 7),
V(reinterpret_cast<char *>(&v), 8)
));
test_decode_encode(
RK(
N("3.14"),
N("-3.14"),
N("0"),
N("999999999999999999999999999999999999999999999000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
N("-999999999999999999999999999999999999999999999000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"),
N("0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"),
N("-0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"),
N("1.23456789123456789123456789123456789123456789123456789"),
N("-1.23456789123456789123456789123456789123456789123456789"),
N("12345678912345678912345678912345678912345678.9123456789"),
N("-12345678912345678912345678912345678912345678.9123456789")
));
}
TEST(TestObRowkeyCodec, test_encode_decode_abnormal)
{
ObBuffer src_buffer;
ObBuffer dst_buffer;
int ret = OB_SUCCESS;
RK rkw_e(E(RF_DELETE));
uint8_t rk_len = 1;
uint64_t table_id = 1000;
RK rkw_v(V("hello", 5));
RK rkw_n(N("3.141593"));
RK rkw_i(I(1024));
//RK rkw_t(T(::oceanbase::common::ObTimeUtility::current_time()));
//RK rkw_b(B(true));
// null pointer, invalid param
src_buffer.reset();
ret = encode_compact_rowkey(rkw_v.get_rowkey(), src_buffer);
EXPECT_EQ(OB_INVALID_ARGUMENT, ret);
// buffer not enough
src_buffer.set_buf(3);
src_buffer.get_position() = 0;
ret = encode_compact_rowkey(rkw_v.get_rowkey(), src_buffer);
EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
EXPECT_EQ(0, src_buffer.get_position());
src_buffer.get_position() = 3;
ret = encode_compact_rowkey(rkw_v.get_rowkey(), src_buffer);
EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
// null pointer, invalid param
src_buffer.reset();
ret = encode_compact_rowkey(rkw_n.get_rowkey(), src_buffer);
EXPECT_EQ(OB_INVALID_ARGUMENT, ret);
// buffer not enough
src_buffer.set_buf(3);
src_buffer.get_position() = 0;
ret = encode_compact_rowkey(rkw_n.get_rowkey(), src_buffer);
EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
EXPECT_EQ(0, src_buffer.get_position());
src_buffer.get_position() = 3;
ret = encode_compact_rowkey(rkw_n.get_rowkey(), src_buffer);
EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
// null pointer, invalid param
src_buffer.reset();
ret = encode_compact_rowkey(rkw_i.get_rowkey(), src_buffer);
EXPECT_EQ(OB_INVALID_ARGUMENT, ret);
// buffer not enough
src_buffer.set_buf(3);
src_buffer.get_position() = 0;
ret = encode_compact_rowkey(rkw_i.get_rowkey(), src_buffer);
EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
EXPECT_EQ(0, src_buffer.get_position());
src_buffer.get_position() = 3;
ret = encode_compact_rowkey(rkw_i.get_rowkey(), src_buffer);
EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
//// null pointer, invalid param
//src_buffer.reset();
//ret = encode_compact_rowkey(rkw_i.get_rowkey(), src_buffer);
//EXPECT_EQ(OB_INVALID_ARGUMENT, ret);
//// buffer not enough
//src_buffer.set_buf(3);
//src_buffer.get_position() = 0;
//ret = encode_compact_rowkey(rkw_t.get_rowkey(), src_buffer);
//EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
//EXPECT_EQ(0, src_buffer.get_position());
//src_buffer.get_position() = 3;
//ret = encode_compact_rowkey(rkw_t.get_rowkey(), src_buffer);
//EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
//// null pointer, invalid param
//src_buffer.reset();
//ret = encode_compact_rowkey(rkw_b.get_rowkey(), src_buffer);
//EXPECT_EQ(OB_INVALID_ARGUMENT, ret);
//// buffer not enough
//src_buffer.set_buf(1);
//src_buffer.get_position() = 0;
//ret = encode_compact_rowkey(rkw_b.get_rowkey(), src_buffer);
//EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
//EXPECT_EQ(0, src_buffer.get_position());
//src_buffer.get_position() = 1;
//ret = encode_compact_rowkey(rkw_b.get_rowkey(), src_buffer);
//EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
// not supported
ret = encode_compact_rowkey(rkw_e.get_rowkey(), src_buffer);
EXPECT_EQ(OB_NOT_SUPPORTED, ret);
//////////////////////////////
// null pointer, invalid param
src_buffer.reset();
ret = encode_rowkey_len(rk_len, src_buffer);
EXPECT_EQ(OB_INVALID_ARGUMENT, ret);
// buffer not enough
src_buffer.set_buf(1);
src_buffer.get_position() = 1;
ret = encode_rowkey_len(rk_len, src_buffer);
EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
// null pointer, invalid param
src_buffer.reset();
ret = encode_table_id(table_id, src_buffer);
EXPECT_EQ(OB_INVALID_ARGUMENT, ret);
// buffer not enough
src_buffer.set_buf(3);
src_buffer.get_position() = 1;
ret = encode_table_id(table_id, src_buffer);
EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
EXPECT_EQ(1, src_buffer.get_position());
// decode rowkey len
src_buffer.set_buf(2);
ret = encode_rowkey_len(rk_len, src_buffer);
EXPECT_EQ(OB_SUCCESS, ret);
EXPECT_EQ(1, src_buffer.get_position());
src_buffer.get_position() = 0;
src_buffer.get_capacity() = 0;
ret = decode_rowkey_len(rk_len, src_buffer);
EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
EXPECT_EQ(0, src_buffer.get_position());
// decode table id
src_buffer.set_buf(3);
ret = encode_table_id(table_id, src_buffer);
EXPECT_EQ(OB_SUCCESS, ret);
EXPECT_EQ(3, src_buffer.get_position());
// src buffer not integrity
src_buffer.get_position() = 0;
src_buffer.get_capacity() = 1;
ret = decode_table_id(table_id, src_buffer);
EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
EXPECT_EQ(0, src_buffer.get_position());
// src buffer not integrity
src_buffer.get_position() = 0;
src_buffer.get_capacity() = 2;
ret = decode_table_id(table_id, src_buffer);
EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
EXPECT_EQ(0, src_buffer.get_position());
//////////////////////////////
ObRowkeyWrapper decode_rkw(1);
int64_t v = 0x0100abcddcba0001;
RK rkw_v4decode(V(reinterpret_cast<char *>(&v), 3));
src_buffer.set_buf(7);
ret = encode_compact_rowkey(rkw_v4decode.get_rowkey(), src_buffer);
EXPECT_EQ(OB_SUCCESS, ret);
EXPECT_EQ(7, src_buffer.get_position());
// check position after decode
dst_buffer.set_buf(7);
src_buffer.get_position() = 0;
src_buffer.get_capacity() = 7;
ret = decode_compact_rowkey(decode_rkw.get_rowkey(), src_buffer, dst_buffer);
EXPECT_EQ(OB_SUCCESS, ret);
EXPECT_EQ(7, src_buffer.get_position());
EXPECT_EQ(3, dst_buffer.get_position());
// dst buffer not enough
dst_buffer.set_buf(2);
src_buffer.get_position() = 0;
src_buffer.get_capacity() = 7;
ret = decode_compact_rowkey(decode_rkw.get_rowkey(), src_buffer, dst_buffer);
EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
EXPECT_EQ(0, src_buffer.get_position());
EXPECT_EQ(0, dst_buffer.get_position());
// src buffer not integrity
dst_buffer.set_buf(7);
src_buffer.get_position() = 0;
src_buffer.get_capacity() = 1;
ret = decode_compact_rowkey(decode_rkw.get_rowkey(), src_buffer, dst_buffer);
EXPECT_EQ(OB_ERR_UNEXPECTED, ret);
EXPECT_EQ(0, src_buffer.get_position());
EXPECT_EQ(0, dst_buffer.get_position());
// src buffer not integrity
dst_buffer.set_buf(7);
src_buffer.get_position() = 0;
src_buffer.get_capacity() = 2;
ret = decode_compact_rowkey(decode_rkw.get_rowkey(), src_buffer, dst_buffer);
EXPECT_EQ(OB_ERR_UNEXPECTED, ret);
EXPECT_EQ(0, src_buffer.get_position());
EXPECT_EQ(0, dst_buffer.get_position());
// src buffer break
dst_buffer.set_buf(7);
src_buffer.get_position() = 0;
src_buffer.get_capacity() = 7;
src_buffer.get_data()[6] = '\2';
ret = decode_compact_rowkey(decode_rkw.get_rowkey(), src_buffer, dst_buffer);
EXPECT_EQ(OB_ERR_UNEXPECTED, ret);
EXPECT_EQ(0, src_buffer.get_position());
EXPECT_EQ(0, dst_buffer.get_position());
// invalid type
dst_buffer.set_buf(7);
src_buffer.get_position() = 0;
src_buffer.get_capacity() = 7;
src_buffer.get_data()[0] = static_cast<char>(0xff - 1);
ret = decode_compact_rowkey(decode_rkw.get_rowkey(), src_buffer, dst_buffer);
EXPECT_EQ(OB_NOT_SUPPORTED, ret);
EXPECT_EQ(0, src_buffer.get_position());
EXPECT_EQ(0, dst_buffer.get_position());
//////////////////////////////
RK rkw_i4decode(I(0x0100abcd));
src_buffer.set_buf(6);
ret = encode_compact_rowkey(rkw_i4decode.get_rowkey(), src_buffer);
EXPECT_EQ(OB_SUCCESS, ret);
EXPECT_EQ(6, src_buffer.get_position());
// check position after decode
dst_buffer.set_buf(6);
src_buffer.get_position() = 0;
src_buffer.get_capacity() = 6;
ret = decode_compact_rowkey(decode_rkw.get_rowkey(), src_buffer, dst_buffer);
EXPECT_EQ(OB_SUCCESS, ret);
EXPECT_EQ(6, src_buffer.get_position());
EXPECT_EQ(0, dst_buffer.get_position());
// src buffer not integrity
dst_buffer.set_buf(6);
src_buffer.get_position() = 0;
src_buffer.get_capacity() = 1;
ret = decode_compact_rowkey(decode_rkw.get_rowkey(), src_buffer, dst_buffer);
EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
EXPECT_EQ(0, src_buffer.get_position());
EXPECT_EQ(0, dst_buffer.get_position());
// src buffer not integrity
dst_buffer.set_buf(6);
src_buffer.get_position() = 0;
src_buffer.get_capacity() = 2;
ret = decode_compact_rowkey(decode_rkw.get_rowkey(), src_buffer, dst_buffer);
EXPECT_EQ(OB_BUF_NOT_ENOUGH, ret);
EXPECT_EQ(0, src_buffer.get_position());
EXPECT_EQ(0, dst_buffer.get_position());
}
}
}
int main(int argc, char **argv)
{
oceanbase::common::ObLogger::get_logger().set_file_name("test_rowkey_codec.log", true);
oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}