Files
oceanbase/mittest/simple_server/test_update_tablet_directly_when_mini.cpp

131 lines
4.4 KiB
C++

/**
* Copyright (c) 2024 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 <gtest/gtest.h>
#define protected public
#define private public
#include "mittest/env/ob_simple_server_helper.h"
#include "env/ob_simple_cluster_test_base.h"
#include "storage/tx_storage/ob_ls_service.h"
#include "share/ob_ls_id.h"
namespace oceanbase
{
using namespace storage;
using namespace share;
namespace unittest
{
class ObUpdateTabletDirectlyTest : public ObSimpleClusterTestBase
{
public:
ObUpdateTabletDirectlyTest()
: ObSimpleClusterTestBase("test_update_tablet_directly_when_mini"),
tenant_id_(1)
{
common::ObMySQLProxy &sql_proxy = get_curr_simple_server().get_sql_proxy();
ObSqlString sql;
int64_t affected_rows = 0;
sql_proxy.write("drop database test", affected_rows);
sql_proxy.write("create database test", affected_rows);
sql_proxy.write("use test", affected_rows);
}
int get_tablet(
const share::ObLSID &ls_id,
const common::ObTabletID &tablet_id,
ObTabletHandle &tablet_handle);
uint64_t tenant_id_;
};
int ObUpdateTabletDirectlyTest::get_tablet(
const share::ObLSID &ls_id,
const common::ObTabletID &tablet_id,
ObTabletHandle &tablet_handle)
{
int ret = OB_SUCCESS;
ObLSHandle ls_handle;
ObLS *ls = nullptr;
if (OB_FAIL(MTL(ObLSService*)->get_ls(ls_id, ls_handle, ObLSGetMod::STORAGE_MOD))) {
STORAGE_LOG(WARN, "failed to get ls", K(ret));
} else if (OB_ISNULL(ls = ls_handle.get_ls())) {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "ls is null", K(ret), KP(ls));
} else if (OB_FAIL(ls->get_tablet_svr()->direct_get_tablet(tablet_id, tablet_handle))) {
STORAGE_LOG(WARN, "failed to get tablet", K(ret), KP(ls));
}
return ret;
}
TEST_F(ObUpdateTabletDirectlyTest, update_tablet_directly)
{
int ret = OB_SUCCESS;
share::ObTenantSwitchGuard tguard;
ASSERT_EQ(OB_SUCCESS, tguard.switch_to(tenant_id_));
common::ObMySQLProxy &sql_proxy = get_curr_simple_server().get_sql_proxy();
sqlclient::ObISQLConnection *conn = NULL;
ASSERT_EQ(OB_SUCCESS, sql_proxy.acquire(conn));
int64_t affected_rows = 0;
#define WRITE_SQL(str) \
ASSERT_EQ(OB_SUCCESS, sql_proxy.write(str, affected_rows));
WRITE_SQL("create table t1(a int primary key)");
WRITE_SQL("set ob_trx_timeout = 3000000000");
WRITE_SQL("set ob_trx_idle_timeout = 3000000000");
WRITE_SQL("set ob_query_timeout = 3000000000");
WRITE_SQL("set autocommit=0");
STORAGE_LOG(INFO, "insert data start");
WRITE_SQL("begin;");
WRITE_SQL("insert into t1 values(1);");
WRITE_SQL("rollback;");
STORAGE_LOG(INFO, "insert data finish");
ObSqlString sql;
sql.assign_fmt("select tablet_id as val from oceanbase.__all_virtual_table where table_name = 't1' limit 1");
int64_t tablet_id = 0;
int64_t ls_id = 0;
if (OB_SUCC(SimpleServerHelper::select_int64(conn, sql.ptr(), tablet_id))) {
sql.reuse();
sql.assign_fmt("select ls_id as val from oceanbase.__all_virtual_tablet_to_ls where tablet_id = %ld limit 1", tablet_id);
if (OB_SUCC(SimpleServerHelper::select_int64(conn, sql.ptr(), ls_id))) {
sql.reuse();
sql.assign_fmt("alter system minor freeze tablet_id=%ld", tablet_id);
WRITE_SQL(sql.ptr());
}
}
int64_t idx = 0;
ObTabletHandle tablet_handle;
do {
ASSERT_EQ(OB_SUCCESS, get_tablet(ObLSID(ls_id), ObTabletID(tablet_id), tablet_handle));
ObSEArray<ObTableHandleV2, BASIC_MEMSTORE_CNT> memtable_handles;
if (OB_FAIL(tablet_handle.get_obj()->get_all_memtables_from_memtable_mgr(memtable_handles))) {
STORAGE_LOG(WARN, "failed to get all memtable", K(ret), K(ls_id), K(tablet_id));
} else if (memtable_handles.empty()) {
break;
} else {
STORAGE_LOG(INFO, "wait memtable release", K(ret), K(ls_id), K(tablet_id));
sleep(5);
}
} while (idx < 100 && OB_SUCC(ret));
}
} // unittest
} // oceanbase
int main(int argc, char **argv)
{
oceanbase::unittest::init_log_and_gtest(argc, argv);
OB_LOGGER.set_log_level("INFO");
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}