patch 4.0
This commit is contained in:
@ -21,12 +21,14 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <thread>
|
||||
|
||||
namespace oceanbase {
|
||||
namespace unittest {
|
||||
namespace oceanbase
|
||||
{
|
||||
namespace unittest
|
||||
{
|
||||
using namespace oceanbase::common;
|
||||
using namespace oceanbase::keybtree;
|
||||
using namespace oceanbase::memtable;
|
||||
using ObQueryEngineIterator = ObQueryEngine::Iterator<TScanHandle>;
|
||||
using ObQueryEngineIterator = ObQueryEngine::Iterator<BtreeIterator>;
|
||||
|
||||
TEST(TestObQueryEngine, get_and_set_table_index_node)
|
||||
{
|
||||
@ -35,11 +37,10 @@ TEST(TestObQueryEngine, get_and_set_table_index_node)
|
||||
constexpr int64_t THREAD_COUNT = 20;
|
||||
ObModAllocator allocator;
|
||||
ObQueryEngine qe(allocator);
|
||||
ObQueryEngine::TableIndexNode* table_index_nodes[TABLE_COUNT_LIMIT];
|
||||
ObQueryEngine::TableIndex *table_index = nullptr;
|
||||
uint64_t counter = 0;
|
||||
int ret = OB_SUCCESS;
|
||||
|
||||
memset(table_index_nodes, 0, sizeof(table_index_nodes));
|
||||
ret = qe.init(1);
|
||||
EXPECT_EQ(OB_SUCCESS, ret);
|
||||
|
||||
@ -47,23 +48,15 @@ TEST(TestObQueryEngine, get_and_set_table_index_node)
|
||||
for (int64_t i = 0; i < THREAD_COUNT; ++i) {
|
||||
threads[i] = std::thread([&]() {
|
||||
int ret = OB_SUCCESS;
|
||||
ObQueryEngine::TableIndexNode* tmp_ptr = nullptr;
|
||||
for (int64_t j = 0; j < TABLE_COUNT_LIMIT; ++j) {
|
||||
if (OB_FAIL(qe.get_table_index_node(j, tmp_ptr))) {
|
||||
EXPECT_EQ(OB_TABLE_NOT_EXIST, ret);
|
||||
ret = qe.set_table_index_node(j, 1, tmp_ptr);
|
||||
}
|
||||
// select or update must succeed.
|
||||
EXPECT_EQ(OB_SUCCESS, ret);
|
||||
EXPECT_TRUE(OB_NOT_NULL(tmp_ptr));
|
||||
if (ATOMIC_BCAS(table_index_nodes + j, nullptr, tmp_ptr)) {
|
||||
// if update address successfully, then counter it.
|
||||
ATOMIC_INC(&counter);
|
||||
} else {
|
||||
// else it must be equal with old_val.
|
||||
EXPECT_EQ(ATOMIC_LOAD(table_index_nodes + j), tmp_ptr);
|
||||
}
|
||||
tmp_ptr = nullptr;
|
||||
ObQueryEngine::TableIndex *tmp_ptr = nullptr;
|
||||
if (OB_FAIL(qe.set_table_index(i, tmp_ptr))) {
|
||||
TRANS_LOG(WARN, "", KR(ret));
|
||||
} else {
|
||||
ATOMIC_AAF(&counter, 1);
|
||||
ObQueryEngine::TableIndex *cmp_ptr = nullptr;
|
||||
EXPECT_NE(nullptr, tmp_ptr);
|
||||
EXPECT_EQ(OB_SUCCESS, qe.get_table_index(cmp_ptr));
|
||||
EXPECT_EQ(tmp_ptr, cmp_ptr);
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -72,7 +65,7 @@ TEST(TestObQueryEngine, get_and_set_table_index_node)
|
||||
threads[i].join();
|
||||
}
|
||||
|
||||
EXPECT_EQ(counter, TABLE_COUNT_LIMIT);
|
||||
EXPECT_EQ(counter, THREAD_COUNT);
|
||||
}
|
||||
|
||||
TEST(TestObQueryEngine, smoke_test)
|
||||
@ -82,28 +75,30 @@ TEST(TestObQueryEngine, smoke_test)
|
||||
int ret = OB_SUCCESS;
|
||||
ObModAllocator allocator;
|
||||
ObQueryEngine qe(allocator);
|
||||
ObMemtableKey* mtk[R_COUNT];
|
||||
ObMemtableKey *mtk[R_COUNT];
|
||||
ObMvccTransNode tdn[R_COUNT];
|
||||
ObMvccRow mtv[R_COUNT];
|
||||
|
||||
auto init_mtv = [&](ObMvccRow& mtv, ObMvccTransNode& node) { mtv.list_head_ = &node; };
|
||||
auto test_set_and_get = [&](ObMemtableKey* mtk, ObMvccRow& mtv) {
|
||||
auto init_mtv = [&](ObMvccRow &mtv, ObMvccTransNode &node) {
|
||||
mtv.list_head_ = &node;
|
||||
};
|
||||
auto test_set_and_get = [&](ObMemtableKey *mtk, ObMvccRow &mtv) {
|
||||
int ret = OB_SUCCESS;
|
||||
ret = qe.set(mtk, &mtv);
|
||||
EXPECT_EQ(OB_SUCCESS, ret);
|
||||
ObMemtableKey t;
|
||||
ObMvccRow* v = nullptr;
|
||||
ObMvccRow *v = nullptr;
|
||||
ret = qe.get(mtk, v, &t);
|
||||
EXPECT_EQ(OB_SUCCESS, ret);
|
||||
EXPECT_EQ(v, &mtv);
|
||||
};
|
||||
auto test_ensure = [&](ObMemtableKey* mtk, ObMvccRow& mtv) {
|
||||
auto test_ensure = [&](ObMemtableKey *mtk, ObMvccRow &mtv) {
|
||||
int ret = OB_SUCCESS;
|
||||
ret = qe.ensure(mtk, &mtv);
|
||||
EXPECT_EQ(OB_SUCCESS, ret);
|
||||
};
|
||||
auto test_scan = [&](int64_t start, bool include_start, int64_t end, bool include_end) {
|
||||
ObIQueryEngineIterator* iter = nullptr;
|
||||
ObIQueryEngineIterator *iter = nullptr;
|
||||
ret = qe.scan(mtk[start], !include_start, mtk[end], !include_end, 1, iter);
|
||||
bool skip_purge_memtable = false;
|
||||
EXPECT_EQ(OB_SUCCESS, ret);
|
||||
@ -118,7 +113,7 @@ TEST(TestObQueryEngine, smoke_test)
|
||||
for (int64_t i = (include_start ? start : (start - 1)); i >= (include_end ? end : (end + 1)); i--) {
|
||||
ret = iter->next(skip_purge_memtable);
|
||||
EXPECT_EQ(OB_SUCCESS, ret);
|
||||
assert(0 == mtk[i]->compare(*iter->get_key()));
|
||||
assert(0 == mtk[i]->compare(*iter->get_key()));
|
||||
EXPECT_EQ(&mtv[i], iter->get_value());
|
||||
}
|
||||
}
|
||||
@ -132,12 +127,12 @@ TEST(TestObQueryEngine, smoke_test)
|
||||
ret = qe.init(1);
|
||||
EXPECT_EQ(OB_SUCCESS, ret);
|
||||
|
||||
INIT_MTK(allocator, mtk[0], 1000, V("aaaa", 4), I(1024), N("1234567890.01234567890"));
|
||||
INIT_MTK(allocator, mtk[1], 1000, V("aaaa", 4), I(1024), N("1234567890.01234567891"));
|
||||
INIT_MTK(allocator, mtk[2], 1000, V("aaaa", 4), I(2048), N("1234567890.01234567890"));
|
||||
INIT_MTK(allocator, mtk[3], 1000, V("aaaa", 4), I(2048), N("1234567890.01234567891"));
|
||||
INIT_MTK(allocator, mtk[4], 1000, V("bbbb", 4), I(2048), N("1234567890.01234567890"));
|
||||
INIT_MTK(allocator, mtk[5], 1000, V("bbbb", 4), I(2048), N("1234567890.01234567891"));
|
||||
INIT_MTK(allocator, mtk[0], V("aaaa", 4), I(1024), N("1234567890.01234567890"));
|
||||
INIT_MTK(allocator, mtk[1], V("aaaa", 4), I(1024), N("1234567890.01234567891"));
|
||||
INIT_MTK(allocator, mtk[2], V("aaaa", 4), I(2048), N("1234567890.01234567890"));
|
||||
INIT_MTK(allocator, mtk[3], V("aaaa", 4), I(2048), N("1234567890.01234567891"));
|
||||
INIT_MTK(allocator, mtk[4], V("bbbb", 4), I(2048), N("1234567890.01234567890"));
|
||||
INIT_MTK(allocator, mtk[5], V("bbbb", 4), I(2048), N("1234567890.01234567891"));
|
||||
|
||||
init_mtv(mtv[0], tdn[0]);
|
||||
init_mtv(mtv[1], tdn[1]);
|
||||
@ -167,45 +162,45 @@ TEST(TestObQueryEngine, smoke_test)
|
||||
|
||||
EXPECT_EQ(R_COUNT, qe.btree_size());
|
||||
|
||||
test_scan(0, true, 5, true);
|
||||
test_scan(0, true, 5, true);
|
||||
test_scan(0, false, 5, true);
|
||||
test_scan(0, true, 5, false);
|
||||
test_scan(0, true, 5, false);
|
||||
test_scan(0, false, 5, false);
|
||||
|
||||
test_scan(5, true, 0, true);
|
||||
test_scan(5, true, 0, true);
|
||||
test_scan(5, false, 0, true);
|
||||
test_scan(5, true, 0, false);
|
||||
test_scan(5, true, 0, false);
|
||||
test_scan(5, false, 0, false);
|
||||
|
||||
test_scan(1, true, 4, true);
|
||||
test_scan(1, true, 4, true);
|
||||
test_scan(1, false, 4, true);
|
||||
test_scan(1, true, 4, false);
|
||||
test_scan(1, true, 4, false);
|
||||
test_scan(1, false, 4, false);
|
||||
|
||||
test_scan(4, true, 1, true);
|
||||
test_scan(4, true, 1, true);
|
||||
test_scan(4, false, 1, true);
|
||||
test_scan(4, true, 1, false);
|
||||
test_scan(4, true, 1, false);
|
||||
test_scan(4, false, 1, false);
|
||||
|
||||
test_scan(0, true, 0, true);
|
||||
test_scan(1, true, 1, true);
|
||||
test_scan(2, true, 2, true);
|
||||
test_scan(3, true, 3, true);
|
||||
test_scan(4, true, 4, true);
|
||||
test_scan(5, true, 5, true);
|
||||
test_scan(0, true, 0, true);
|
||||
test_scan(1, true, 1, true);
|
||||
test_scan(2, true, 2, true);
|
||||
test_scan(3, true, 3, true);
|
||||
test_scan(4, true, 4, true);
|
||||
test_scan(5, true, 5, true);
|
||||
|
||||
test_scan(0, false, 0, false);
|
||||
test_scan(1, false, 1, false);
|
||||
test_scan(2, false, 2, false);
|
||||
test_scan(3, false, 3, false);
|
||||
test_scan(4, false, 4, false);
|
||||
test_scan(5, false, 5, false);
|
||||
test_scan(0, false, 0, false);
|
||||
test_scan(1, false, 1, false);
|
||||
test_scan(2, false, 2, false);
|
||||
test_scan(3, false, 3, false);
|
||||
test_scan(4, false, 4, false);
|
||||
test_scan(5, false, 5, false);
|
||||
}
|
||||
|
||||
} // namespace unittest
|
||||
} // namespace oceanbase
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
oceanbase::common::ObLogger::get_logger().set_file_name("test_query_engine.log", true);
|
||||
oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
|
||||
|
Reference in New Issue
Block a user