feat: hbaseapi support ttl & maxversions
This commit is contained in:
		@ -18,11 +18,15 @@
 | 
			
		||||
#include "observer/ob_server.h"
 | 
			
		||||
#include "observer/table/ob_table_api_row_iterator.h"
 | 
			
		||||
#include "observer/table/ob_table_service.h"
 | 
			
		||||
#include "observer/table/ob_table_ttl_manager.h"
 | 
			
		||||
#include "rootserver/ob_ttl_scheduler.h"
 | 
			
		||||
#include "share/table/ob_ttl_util.h"
 | 
			
		||||
 | 
			
		||||
namespace oceanbase {
 | 
			
		||||
 | 
			
		||||
namespace observer {
 | 
			
		||||
 | 
			
		||||
using namespace oceanbase::table;
 | 
			
		||||
// #define UNUSED(x) (x)
 | 
			
		||||
static const int64_t TEST_COLUMN_CNT = 3;
 | 
			
		||||
static const int64_t TEST_ROWKEY_COLUMN_CNT = 1;
 | 
			
		||||
@ -359,6 +363,813 @@ TEST_F(TestTableApi, open_and_get_next_row)
 | 
			
		||||
  ASSERT_EQ(OB_SUCCESS, row_iterator.get_next_row(row));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
 | 
			
		||||
class TestTableTTL : public::testing::Test {
 | 
			
		||||
public:
 | 
			
		||||
  TestTableTTL() {}
 | 
			
		||||
  virtual ~TestTableTTL() {}
 | 
			
		||||
  virtual void SetUp(); /*global event*/
 | 
			
		||||
  virtual void TearDown();
 | 
			
		||||
  void insert_one_partition_task();
 | 
			
		||||
 | 
			
		||||
  common::ObMySQLProxy sql_proxy_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void TestTableTTL::SetUp()
 | 
			
		||||
{
 | 
			
		||||
  ObTTLManager::get_instance().event_delay_ = 20 * 1000L;
 | 
			
		||||
  ObTTLManager::get_instance().periodic_delay_ = 20 * 1000L;
 | 
			
		||||
  ObTTLManager::get_instance().sql_proxy_ = &sql_proxy_;
 | 
			
		||||
  ObTTLManager::get_instance().init();
 | 
			
		||||
  ObTTLManager::get_instance().start();
 | 
			
		||||
  usleep(100 * 1000L);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TestTableTTL::TearDown()
 | 
			
		||||
{
 | 
			
		||||
  ObTTLManager::get_instance().stop();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(TestTableTTL, proc_rs_cmd)
 | 
			
		||||
{
 | 
			
		||||
  uint64_t tenant_id[3] = {1, 2, 3};
 | 
			
		||||
  uint64_t table_id[4];
 | 
			
		||||
  ObPartitionKey pk[5];
 | 
			
		||||
  int64_t task_id1 = 1;
 | 
			
		||||
  ObTTLTaskInfo task_info;
 | 
			
		||||
  ObTTLPara para;
 | 
			
		||||
 | 
			
		||||
  table_id[0] = combine_id(tenant_id[0], 1);
 | 
			
		||||
  table_id[1] = combine_id(tenant_id[1], 2);
 | 
			
		||||
  table_id[2] = combine_id(tenant_id[1], 1);
 | 
			
		||||
  table_id[3] = combine_id(tenant_id[2], 1);
 | 
			
		||||
 | 
			
		||||
  pk[0] = ObPartitionKey(table_id[0], 1, 1);
 | 
			
		||||
  pk[1] = ObPartitionKey(table_id[1], 1, 2);
 | 
			
		||||
  pk[2] = ObPartitionKey(table_id[2], 1, 3);
 | 
			
		||||
  pk[3] = ObPartitionKey(table_id[3], 1, 4);
 | 
			
		||||
  pk[4] = ObPartitionKey(table_id[3], 2, 5);
 | 
			
		||||
  
 | 
			
		||||
  ObTTLTaskCtx* ctx = NULL;
 | 
			
		||||
  int64_t rsp_time = OB_INVALID_ID;
 | 
			
		||||
  ObTTLManager::ObTTLTenantInfo* tenant_ttl = NULL;
 | 
			
		||||
  ObTTLManager& ttl_mgr = ObTTLManager::get_instance();
 | 
			
		||||
  /*1.1 simulate: rs send a trigger request*/
 | 
			
		||||
  ttl_mgr.proc_rs_cmd(tenant_id[0], task_id1, true, OB_TTL_TASK_RUNNING);
 | 
			
		||||
  {
 | 
			
		||||
    common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
    tenant_ttl = (ObTTLManager::ObTTLTenantInfo*)ttl_mgr.get_tenant_info(tenant_id[0], false);
 | 
			
		||||
    ASSERT_EQ(1, ttl_mgr.ttl_tenant_parts_map_.size());
 | 
			
		||||
    ASSERT_TRUE(NULL != tenant_ttl);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->state_, OB_TTL_TASK_RUNNING);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->is_usr_trigger_, true);
 | 
			
		||||
    rsp_time = tenant_ttl->rsp_time_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /*1.2. simulate: new a partition task*/
 | 
			
		||||
  {
 | 
			
		||||
    for (int i = 0; i<5; i++) {
 | 
			
		||||
      if (pk[i].get_tenant_id() == tenant_id[0]) {
 | 
			
		||||
        task_info.pkey_ = pk[i];
 | 
			
		||||
        task_info.task_id_ = task_id1;
 | 
			
		||||
        ttl_mgr.generate_one_partition_task(task_info, para);
 | 
			
		||||
        common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
        ctx = ttl_mgr.get_one_partition_ctx(pk[0]);
 | 
			
		||||
        ASSERT_TRUE(NULL != ctx);
 | 
			
		||||
        ASSERT_EQ(ctx->task_status_ , OB_TTL_TASK_PREPARE);
 | 
			
		||||
      }      
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  usleep(100 * 1000L);
 | 
			
		||||
  {
 | 
			
		||||
    common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
    tenant_ttl = (ObTTLManager::ObTTLTenantInfo*)ttl_mgr.get_tenant_info(tenant_id[0], false);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->part_task_map_.size() , 1);
 | 
			
		||||
    ctx = ttl_mgr.get_one_partition_ctx(pk[0]);
 | 
			
		||||
    ASSERT_EQ(ctx->task_status_ , OB_TTL_TASK_PREPARE);
 | 
			
		||||
 | 
			
		||||
    /*1.3. simulate: sync sys table logical*/
 | 
			
		||||
    ctx->is_dirty_ = false;
 | 
			
		||||
    ctx->task_status_ = OB_TTL_TASK_RUNNING;
 | 
			
		||||
    ctx->rsp_time_ = tenant_ttl->rsp_time_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /*1.4. reponse to rs*/
 | 
			
		||||
  usleep(100 * 1000L);
 | 
			
		||||
  {
 | 
			
		||||
    common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
    tenant_ttl = (ObTTLManager::ObTTLTenantInfo*)ttl_mgr.get_tenant_info(tenant_id[0], false);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->rsp_time_ , OB_INVALID_ID); 
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->is_dirty_ , false); 
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /*5.1 retrigger*/
 | 
			
		||||
  ttl_mgr.proc_rs_cmd(tenant_id[0], 3, true, OB_TTL_TASK_RUNNING);
 | 
			
		||||
  /*mock response rs*/
 | 
			
		||||
  {
 | 
			
		||||
    common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
    ctx = ttl_mgr.get_one_partition_ctx(pk[0]);
 | 
			
		||||
    ctx->is_dirty_ = false;
 | 
			
		||||
    ctx->rsp_time_ = tenant_ttl->rsp_time_;
 | 
			
		||||
  }
 | 
			
		||||
  ctx->rsp_time_ = tenant_ttl->rsp_time_;
 | 
			
		||||
  /*5.1. reponse to rs*/
 | 
			
		||||
  usleep(100 * 1000L);
 | 
			
		||||
  {
 | 
			
		||||
    common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
    tenant_ttl = (ObTTLManager::ObTTLTenantInfo*)ttl_mgr.get_tenant_info(tenant_id[0], false);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->rsp_time_ , OB_INVALID_ID);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->is_dirty_ , false);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->task_id_ , 3);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /*2.1 simulate: rs send a pending request*/
 | 
			
		||||
  ttl_mgr.proc_rs_cmd(tenant_id[0], task_id1, true, OB_TTL_TASK_PENDING);
 | 
			
		||||
  {
 | 
			
		||||
    common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
    tenant_ttl = (ObTTLManager::ObTTLTenantInfo*)ttl_mgr.get_tenant_info(tenant_id[0], false);
 | 
			
		||||
    ctx = ttl_mgr.get_one_partition_ctx(pk[0]);
 | 
			
		||||
    ASSERT_TRUE(NULL != tenant_ttl);
 | 
			
		||||
    ASSERT_TRUE(NULL != ctx);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->state_, OB_TTL_TASK_PENDING);
 | 
			
		||||
    ASSERT_TRUE(tenant_ttl->rsp_time_ != OB_INVALID_ID);
 | 
			
		||||
    ASSERT_TRUE(tenant_ttl->rsp_time_ != ctx->rsp_time_);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->is_dirty_, true);
 | 
			
		||||
    ASSERT_EQ(ctx->task_status_, OB_TTL_TASK_RUNNING);
 | 
			
		||||
    ASSERT_EQ(ctx->is_dirty_, false);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  usleep(100 * 1000L);
 | 
			
		||||
  {
 | 
			
		||||
    common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
    tenant_ttl = (ObTTLManager::ObTTLTenantInfo*)ttl_mgr.get_tenant_info(tenant_id[0], false);
 | 
			
		||||
    ctx = ttl_mgr.get_one_partition_ctx(pk[0]);
 | 
			
		||||
    ASSERT_TRUE(NULL != tenant_ttl);
 | 
			
		||||
    ASSERT_TRUE(NULL != ctx);
 | 
			
		||||
    ASSERT_EQ(ctx->is_dirty_, true);
 | 
			
		||||
    ASSERT_EQ(ctx->task_status_, OB_TTL_TASK_PENDING);
 | 
			
		||||
    
 | 
			
		||||
    /*2.3. simulate: sync sys table logical*/
 | 
			
		||||
    ctx->is_dirty_ = false;
 | 
			
		||||
    ctx->rsp_time_ = tenant_ttl->rsp_time_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /*2.4 wait rsp*/
 | 
			
		||||
  usleep(100 * 1000L);
 | 
			
		||||
  {
 | 
			
		||||
    common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
    tenant_ttl = (ObTTLManager::ObTTLTenantInfo*)ttl_mgr.get_tenant_info(tenant_id[0], false);
 | 
			
		||||
    ctx = ttl_mgr.get_one_partition_ctx(pk[0]);
 | 
			
		||||
    ASSERT_TRUE(NULL != tenant_ttl);
 | 
			
		||||
    ASSERT_TRUE(NULL != ctx);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->rsp_time_ , OB_INVALID_ID); 
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->is_dirty_ , false); 
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->state_ , ctx->task_status_); 
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /*3.1 simulate: rs send a resume request*/
 | 
			
		||||
  ttl_mgr.proc_rs_cmd(tenant_id[0], task_id1, true, OB_TTL_TASK_RUNNING);
 | 
			
		||||
  {
 | 
			
		||||
    common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
    tenant_ttl = (ObTTLManager::ObTTLTenantInfo*)ttl_mgr.get_tenant_info(tenant_id[0], false);
 | 
			
		||||
    ctx = ttl_mgr.get_one_partition_ctx(pk[0]);
 | 
			
		||||
    ASSERT_TRUE(NULL != tenant_ttl);
 | 
			
		||||
    ASSERT_TRUE(NULL != ctx);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->state_, OB_TTL_TASK_RUNNING);
 | 
			
		||||
    ASSERT_TRUE(tenant_ttl->rsp_time_ != OB_INVALID_ID);
 | 
			
		||||
    ASSERT_TRUE(tenant_ttl->rsp_time_ != ctx->rsp_time_);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->is_dirty_, true);
 | 
			
		||||
    ASSERT_EQ(ctx->task_status_, OB_TTL_TASK_PENDING);
 | 
			
		||||
    ASSERT_EQ(ctx->is_dirty_, false);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  usleep(100 * 1000L);
 | 
			
		||||
  {
 | 
			
		||||
    /*3.2. simulate: sync sys table logical*/
 | 
			
		||||
    common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
    tenant_ttl = (ObTTLManager::ObTTLTenantInfo*)ttl_mgr.get_tenant_info(tenant_id[0], false);
 | 
			
		||||
    ctx = ttl_mgr.get_one_partition_ctx(pk[0]);
 | 
			
		||||
    ASSERT_TRUE(NULL != tenant_ttl);
 | 
			
		||||
    ASSERT_TRUE(NULL != ctx);
 | 
			
		||||
    ASSERT_EQ(ctx->is_dirty_, true);
 | 
			
		||||
    ASSERT_EQ(ctx->task_status_, OB_TTL_TASK_RUNNING);
 | 
			
		||||
    
 | 
			
		||||
    /*3.3. simulate: sync sys table logical*/
 | 
			
		||||
    ctx->is_dirty_ = false;
 | 
			
		||||
    ctx->rsp_time_ = tenant_ttl->rsp_time_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /*3.4 wait rsp*/
 | 
			
		||||
  usleep(100 * 1000L);
 | 
			
		||||
  {
 | 
			
		||||
    common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
    tenant_ttl = (ObTTLManager::ObTTLTenantInfo*)ttl_mgr.get_tenant_info(tenant_id[0], false);
 | 
			
		||||
    ctx = ttl_mgr.get_one_partition_ctx(pk[0]);
 | 
			
		||||
    ASSERT_TRUE(NULL != tenant_ttl);
 | 
			
		||||
    ASSERT_TRUE(NULL != ctx);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->rsp_time_ , OB_INVALID_ID);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->is_dirty_ , false);
 | 
			
		||||
    ASSERT_EQ(ctx->task_status_ , OB_TTL_TASK_RUNNING);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    /*4.1 simulate: rs send a resume request*/
 | 
			
		||||
  ttl_mgr.proc_rs_cmd(tenant_id[0], task_id1, true, OB_TTL_TASK_CANCEL);
 | 
			
		||||
  {
 | 
			
		||||
    common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
    tenant_ttl = (ObTTLManager::ObTTLTenantInfo*)ttl_mgr.get_tenant_info(tenant_id[0], false);
 | 
			
		||||
    ctx = ttl_mgr.get_one_partition_ctx(pk[0]);
 | 
			
		||||
    ASSERT_TRUE(NULL != tenant_ttl);
 | 
			
		||||
    ASSERT_TRUE(NULL != ctx);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->state_, OB_TTL_TASK_CANCEL);
 | 
			
		||||
    ASSERT_TRUE(tenant_ttl->rsp_time_ != OB_INVALID_ID);
 | 
			
		||||
    ASSERT_TRUE(tenant_ttl->rsp_time_ != ctx->rsp_time_);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->is_dirty_, true);
 | 
			
		||||
    ASSERT_EQ(ctx->task_status_, OB_TTL_TASK_RUNNING);
 | 
			
		||||
    ASSERT_EQ(ctx->is_dirty_, false);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  usleep(100 * 1000L);
 | 
			
		||||
  {
 | 
			
		||||
    common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
    tenant_ttl = (ObTTLManager::ObTTLTenantInfo*)ttl_mgr.get_tenant_info(tenant_id[0], false);
 | 
			
		||||
    ctx = ttl_mgr.get_one_partition_ctx(pk[0]);
 | 
			
		||||
    ASSERT_TRUE(NULL != tenant_ttl);
 | 
			
		||||
    ASSERT_TRUE(NULL != ctx);
 | 
			
		||||
    ASSERT_EQ(ctx->is_dirty_, true);
 | 
			
		||||
    ASSERT_EQ(ctx->task_status_, OB_TTL_TASK_CANCEL);
 | 
			
		||||
    
 | 
			
		||||
    /*4.2. simulate: sync sys table logical*/
 | 
			
		||||
    ctx->is_dirty_ = false;
 | 
			
		||||
    ctx->rsp_time_ = tenant_ttl->rsp_time_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /*4.3 wait rsp*/
 | 
			
		||||
  usleep(100 * 1000L);
 | 
			
		||||
  {
 | 
			
		||||
    common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
    tenant_ttl = (ObTTLManager::ObTTLTenantInfo*)ttl_mgr.get_tenant_info(tenant_id[0], false);
 | 
			
		||||
    ctx = ttl_mgr.get_one_partition_ctx(pk[0]);
 | 
			
		||||
    ASSERT_TRUE(NULL == tenant_ttl);
 | 
			
		||||
    ASSERT_TRUE(NULL == ctx);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(TestTableTTL, dag_report)
 | 
			
		||||
{
 | 
			
		||||
  ObTTLManager& ttl_mgr = ObTTLManager::get_instance();
 | 
			
		||||
  ObPartitionKey pkey(combine_id(1, 1) ,1 , 1);
 | 
			
		||||
  ObTTLTaskCtx* ctx = NULL;
 | 
			
		||||
  ObTTLManager::ObTTLTenantInfo* tenant_ttl = NULL;
 | 
			
		||||
  ObTTLTaskInfo task_info;
 | 
			
		||||
  ObTTLPara para;
 | 
			
		||||
  bool is_stop = false;
 | 
			
		||||
  int ret = OB_SUCCESS;
 | 
			
		||||
  uint32_t tenant_id = 1001;
 | 
			
		||||
  uint32_t tenant_id1 = 1002;
 | 
			
		||||
 | 
			
		||||
  /*1.1 simulate: rs send a trigger request*/
 | 
			
		||||
  ttl_mgr.proc_rs_cmd(pkey.get_tenant_id(), 1, true, OB_TTL_TASK_RUNNING);
 | 
			
		||||
  {
 | 
			
		||||
    common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
    tenant_ttl = (ObTTLManager::ObTTLTenantInfo*)ttl_mgr.get_tenant_info(pkey.get_tenant_id(), false);
 | 
			
		||||
    ASSERT_EQ(1, ttl_mgr.ttl_tenant_parts_map_.size());
 | 
			
		||||
    ASSERT_TRUE(NULL != tenant_ttl);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->state_, OB_TTL_TASK_RUNNING);
 | 
			
		||||
    ASSERT_EQ(tenant_ttl->is_usr_trigger_, true);
 | 
			
		||||
    tenant_ttl->ttl_continue_ = true;
 | 
			
		||||
  }
 | 
			
		||||
  task_info.pkey_ = pkey;
 | 
			
		||||
  ret = ttl_mgr.generate_one_partition_task(task_info, para);
 | 
			
		||||
  ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
 | 
			
		||||
  usleep(100 * 1000L); /*wait schedule*/
 | 
			
		||||
  {
 | 
			
		||||
    /*1.1 simulate: rs send a trigger request*/
 | 
			
		||||
    
 | 
			
		||||
    task_info.err_code_ = OB_SUCCESS;
 | 
			
		||||
    ret = ttl_mgr.report_task_status(task_info, para, is_stop);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
    ASSERT_EQ(is_stop, false);
 | 
			
		||||
    {
 | 
			
		||||
      common::ObSpinLockGuard guard(ttl_mgr.lock_);
 | 
			
		||||
      ctx = ttl_mgr.get_one_partition_ctx(pkey);
 | 
			
		||||
      ASSERT_TRUE(NULL != ctx);
 | 
			
		||||
      ASSERT_EQ(ctx->task_status_, OB_TTL_TASK_PENDING);  /*config disable ttl*/
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    task_info.err_code_ = OB_NOT_INIT;
 | 
			
		||||
    ret = ttl_mgr.report_task_status(task_info, para, is_stop);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
    ASSERT_EQ(is_stop, true);
 | 
			
		||||
    ASSERT_EQ(ctx->task_status_, OB_TTL_TASK_PENDING); 
 | 
			
		||||
 | 
			
		||||
    task_info.err_code_ = OB_ITER_END;
 | 
			
		||||
    ret = ttl_mgr.report_task_status(task_info, para, is_stop);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
    ASSERT_EQ(is_stop, true);
 | 
			
		||||
    ASSERT_EQ(ctx->task_status_, OB_TTL_TASK_FINISH); 
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
#endif 
 | 
			
		||||
 | 
			
		||||
class TestRsTTL : public::testing::Test {
 | 
			
		||||
public:
 | 
			
		||||
  TestRsTTL() {};
 | 
			
		||||
  virtual ~TestRsTTL() {}
 | 
			
		||||
  virtual void SetUp(); /*global event*/
 | 
			
		||||
  virtual void TearDown();
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class TestRsTTLTaskMgr : public rootserver::ObTTLTenantTaskMgr {
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  static TestRsTTLTaskMgr& get_instance() {
 | 
			
		||||
    static TestRsTTLTaskMgr instance_;
 | 
			
		||||
    return instance_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int init() {
 | 
			
		||||
    return ObTTLTenantTaskMgr::init();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int get_alive_servers(uint64_t tenant_id,  rootserver::ServerList& server_infos) { 
 | 
			
		||||
    UNUSED(tenant_id);
 | 
			
		||||
    UNUSED(server_infos);
 | 
			
		||||
    return OB_SUCCESS; 
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  int get_tenant_ids(ObIArray<uint64_t>& tenant_ids)
 | 
			
		||||
  {
 | 
			
		||||
    UNUSED(tenant_ids);
 | 
			
		||||
    return OB_SUCCESS;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  int read_tenant_status(uint64_t tenant_id, 
 | 
			
		||||
                        common::ObTTLStatusArray& tenant_tasks)
 | 
			
		||||
  {
 | 
			
		||||
    UNUSED(tenant_id);
 | 
			
		||||
    UNUSED(tenant_tasks);
 | 
			
		||||
    return OB_SUCCESS; 
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int delete_task(uint64_t tenant_id, uint64_t task_id)
 | 
			
		||||
  {
 | 
			
		||||
    UNUSED(tenant_id);
 | 
			
		||||
    UNUSED(task_id);
 | 
			
		||||
    return OB_SUCCESS; 
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int update_task_status(uint64_t tenant_id,
 | 
			
		||||
                      uint64_t task_id,
 | 
			
		||||
                      int64_t rs_new_status)
 | 
			
		||||
  {
 | 
			
		||||
    UNUSED(tenant_id);
 | 
			
		||||
    UNUSED(task_id);
 | 
			
		||||
    UNUSED(rs_new_status);
 | 
			
		||||
    return OB_SUCCESS; 
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int fetch_ttl_task_id(int64_t &new_task_id, int64_t last_task_id) {
 | 
			
		||||
    UNUSED(last_task_id);
 | 
			
		||||
    new_task_id = ++task_id_;
 | 
			
		||||
    return OB_SUCCESS;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int insert_tenant_task(ObTTLStatus& ttl_task) {
 | 
			
		||||
    UNUSED(ttl_task);
 | 
			
		||||
    return OB_SUCCESS;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int in_active_time(uint64_t tenant_id, bool& is_active_time) {
 | 
			
		||||
   UNUSED(tenant_id);
 | 
			
		||||
   is_active_time = active_time_;
 | 
			
		||||
   return OB_SUCCESS; 
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void set_active_time(bool active_time) {
 | 
			
		||||
    active_time_ = active_time;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool is_enable_ttl(uint64_t tenant_id) {
 | 
			
		||||
    UNUSED(tenant_id);
 | 
			
		||||
    return enable_ttl_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void set_enable_ttl(bool enable_ttl) {
 | 
			
		||||
    enable_ttl_ = enable_ttl;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int dispatch_ttl_request(rootserver::ServerList& addrs, 
 | 
			
		||||
                          rootserver::ServerList& eliminate_addrs, 
 | 
			
		||||
                          uint64_t tenant_id,
 | 
			
		||||
                          int ttl_cmd,
 | 
			
		||||
                          int trigger_type,
 | 
			
		||||
                          int64_t task_id) {
 | 
			
		||||
    UNUSED(addrs);
 | 
			
		||||
    UNUSED(eliminate_addrs);
 | 
			
		||||
    UNUSED(tenant_id);
 | 
			
		||||
    UNUSED(ttl_cmd);
 | 
			
		||||
    UNUSED(trigger_type);
 | 
			
		||||
    UNUSED(task_id);
 | 
			
		||||
    ++snd_server_cnt_;
 | 
			
		||||
    return OB_SUCCESS;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  TestRsTTLTaskMgr() 
 | 
			
		||||
    : ObTTLTenantTaskMgr(),
 | 
			
		||||
      task_id_(0),
 | 
			
		||||
      enable_ttl_(true),
 | 
			
		||||
      active_time_(true),
 | 
			
		||||
      snd_server_cnt_(0) {}
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  uint64_t task_id_;
 | 
			
		||||
  bool enable_ttl_;
 | 
			
		||||
  bool active_time_;
 | 
			
		||||
  uint64_t snd_server_cnt_ = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define TESTTTLMGR TestRsTTLTaskMgr::get_instance()
 | 
			
		||||
 | 
			
		||||
class TTLTestHelper {
 | 
			
		||||
public:
 | 
			
		||||
  static int construct_ttl_status(uint64_t tenant_id, size_t count, common::ObTTLStatusArray& tenant_tasks);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void TestRsTTL::SetUp()
 | 
			
		||||
{
 | 
			
		||||
  TESTTTLMGR.init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TestRsTTL::TearDown()
 | 
			
		||||
{ 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define OB_TTL_RESPONSE_MASK (1 << 30)
 | 
			
		||||
#define OB_TTL_STATUS_MASK  (OB_TTL_RESPONSE_MASK - 1)
 | 
			
		||||
 | 
			
		||||
#define SET_TASK_PURE_STATUS(status, state) ((status) = ((state) & OB_TTL_STATUS_MASK) + ((status & OB_TTL_RESPONSE_MASK)))
 | 
			
		||||
#define SET_TASK_RESPONSE(status, state) ((status) |= (((state) & 1) << 30))
 | 
			
		||||
#define SET_TASK_STATUS(status, pure_status, is_responsed) { SET_TASK_PURE_STATUS(status, pure_status), SET_TASK_RESPONSE(status, is_responsed); }
 | 
			
		||||
 | 
			
		||||
#define EVAL_TASK_RESPONSE(status) (((status) & OB_TTL_RESPONSE_MASK) >> 30)
 | 
			
		||||
#define EVAL_TASK_PURE_STATUS(status) (static_cast<ObTTLTaskStatus>((status) & OB_TTL_STATUS_MASK))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * add tenant
 | 
			
		||||
 * add ttl task
 | 
			
		||||
 * send msg
 | 
			
		||||
 * insert into table
 | 
			
		||||
*/
 | 
			
		||||
#if 0
 | 
			
		||||
TEST_F(TestRsTTL, ttl_basic)
 | 
			
		||||
{
 | 
			
		||||
  int ret = OB_SUCCESS;
 | 
			
		||||
  uint32_t tenant_id = 1001;
 | 
			
		||||
  uint32_t tenant_id1 = 1002;
 | 
			
		||||
 | 
			
		||||
  ret = TESTTTLMGR.add_tenant(tenant_id);
 | 
			
		||||
  ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
 | 
			
		||||
  ret = TESTTTLMGR.refresh_tenant(tenant_id);
 | 
			
		||||
  ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
 | 
			
		||||
  ret = TESTTTLMGR.refresh_tenant(tenant_id);
 | 
			
		||||
  ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
 | 
			
		||||
  rootserver::ObTTLTenantTask* task_ptr = NULL;
 | 
			
		||||
  ret = TESTTTLMGR.get_tenant_tasks_ptr(tenant_id, task_ptr);
 | 
			
		||||
  ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
  rootserver::ObTTLTenantTask& task_ref = *task_ptr;
 | 
			
		||||
  ASSERT_EQ(task_ref.tasks_.count(), 0);
 | 
			
		||||
  
 | 
			
		||||
  ret = TESTTTLMGR.add_tenant(tenant_id1);
 | 
			
		||||
  ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
 | 
			
		||||
  // no ttl task exist return error
 | 
			
		||||
  ret = TESTTTLMGR.add_ttl_task(tenant_id, ObTTLTaskType::OB_TTL_CANCEL);
 | 
			
		||||
  ASSERT_NE(ret, OB_SUCCESS);
 | 
			
		||||
  
 | 
			
		||||
  ret = TESTTTLMGR.add_ttl_task(tenant_id, ObTTLTaskType::OB_TTL_MOVE);
 | 
			
		||||
  ASSERT_NE(ret, OB_SUCCESS);
 | 
			
		||||
  
 | 
			
		||||
  ret = TESTTTLMGR.add_ttl_task(tenant_id, ObTTLTaskType::OB_TTL_RESUME);
 | 
			
		||||
  ASSERT_NE(ret, OB_SUCCESS);
 | 
			
		||||
  
 | 
			
		||||
  ret = TESTTTLMGR.add_ttl_task(tenant_id, ObTTLTaskType::OB_TTL_SUSPEND);
 | 
			
		||||
  ASSERT_NE(ret, OB_SUCCESS);
 | 
			
		||||
  
 | 
			
		||||
  // add ttl task
 | 
			
		||||
  ret = TESTTTLMGR.add_ttl_task(tenant_id, ObTTLTaskType::OB_TTL_TRIGGER);
 | 
			
		||||
  ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
  {
 | 
			
		||||
    ASSERT_EQ(task_ref.tasks_.count(), 1);
 | 
			
		||||
 | 
			
		||||
    rootserver::RsTenantTask& rs_task = task_ref.tasks_.at(0);
 | 
			
		||||
    ASSERT_EQ(rs_task.send_servers_.count(), 0);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.tenant_id_, tenant_id);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.table_id_, OB_INVALID_ID);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.partition_id_, OB_INVALID_ID);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.trigger_type_, static_cast<int64_t>(TRIGGER_TYPE::USER_TRIGGER));
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.status_, static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_CREATE));  
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    // add ttl task, cancel first, and add new one
 | 
			
		||||
    ret = TESTTTLMGR.add_ttl_task(tenant_id, ObTTLTaskType::OB_TTL_TRIGGER);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
    ASSERT_EQ(task_ref.tasks_.count(), 2);
 | 
			
		||||
    {
 | 
			
		||||
      rootserver::RsTenantTask& rs_task = task_ref.tasks_.at(0);
 | 
			
		||||
      ASSERT_EQ(rs_task.send_servers_.count(), 0);
 | 
			
		||||
      ASSERT_EQ(rs_task.ttl_status_.tenant_id_, tenant_id);
 | 
			
		||||
      ASSERT_EQ(rs_task.ttl_status_.table_id_, OB_INVALID_ID);
 | 
			
		||||
      ASSERT_EQ(rs_task.ttl_status_.partition_id_, OB_INVALID_ID);
 | 
			
		||||
      ASSERT_EQ(rs_task.ttl_status_.trigger_type_, static_cast<int64_t>(TRIGGER_TYPE::USER_TRIGGER));
 | 
			
		||||
      ASSERT_EQ(rs_task.ttl_status_.status_, static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_CANCEL));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
      // new added task, init status means waiting to scheduler
 | 
			
		||||
      rootserver::RsTenantTask& rs_task = task_ref.tasks_.at(1);
 | 
			
		||||
      ASSERT_EQ(rs_task.send_servers_.count(), 0);
 | 
			
		||||
      ASSERT_EQ(rs_task.ttl_status_.tenant_id_, tenant_id);
 | 
			
		||||
      ASSERT_EQ(rs_task.ttl_status_.table_id_, OB_INVALID_ID);
 | 
			
		||||
      ASSERT_EQ(rs_task.ttl_status_.partition_id_, OB_INVALID_ID);
 | 
			
		||||
      ASSERT_EQ(rs_task.ttl_status_.trigger_type_, static_cast<int64_t>(TRIGGER_TYPE::USER_TRIGGER));
 | 
			
		||||
      ASSERT_EQ(rs_task.ttl_status_.status_, static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_CREATE));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    // add ttl task, 2 task in queue, alter second task status
 | 
			
		||||
    ret = TESTTTLMGR.add_ttl_task(tenant_id, ObTTLTaskType::OB_TTL_SUSPEND);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
    ASSERT_EQ(task_ref.tasks_.count(), 2);
 | 
			
		||||
    // new added task, alter status
 | 
			
		||||
    rootserver::RsTenantTask& rs_task = task_ref.tasks_.at(1);
 | 
			
		||||
    ASSERT_EQ(rs_task.send_servers_.count(), 0);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.tenant_id_, tenant_id);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.table_id_, OB_INVALID_ID);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.partition_id_, OB_INVALID_ID);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.trigger_type_, static_cast<int64_t>(TRIGGER_TYPE::USER_TRIGGER));
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.status_, static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_SUSPEND));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    // add ttl task, 2 task in queue, alter second task status
 | 
			
		||||
    ret = TESTTTLMGR.add_ttl_task(tenant_id, ObTTLTaskType::OB_TTL_RESUME);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
    ASSERT_EQ(task_ref.tasks_.count(), 2);
 | 
			
		||||
    // new added task, alter status
 | 
			
		||||
    rootserver::RsTenantTask& rs_task = task_ref.tasks_.at(1);
 | 
			
		||||
    ASSERT_EQ(rs_task.send_servers_.count(), 0);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.tenant_id_, tenant_id);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.table_id_, OB_INVALID_ID);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.partition_id_, OB_INVALID_ID);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.trigger_type_, static_cast<int64_t>(TRIGGER_TYPE::USER_TRIGGER));
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.status_, static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_CREATE));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    // add ttl task, 2 task in queue, alter second task status
 | 
			
		||||
    ret = TESTTTLMGR.add_ttl_task(tenant_id, ObTTLTaskType::OB_TTL_CANCEL);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
    ASSERT_EQ(task_ref.tasks_.count(), 1);
 | 
			
		||||
    // new added task, alter status
 | 
			
		||||
    rootserver::RsTenantTask& rs_task = task_ref.tasks_.at(0);
 | 
			
		||||
    ASSERT_EQ(rs_task.send_servers_.count(), 0);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.tenant_id_, tenant_id);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.table_id_, OB_INVALID_ID);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.partition_id_, OB_INVALID_ID);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.trigger_type_, static_cast<int64_t>(TRIGGER_TYPE::USER_TRIGGER));
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.status_, static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_CANCEL));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    // add ttl task failed
 | 
			
		||||
    ret = TESTTTLMGR.add_ttl_task(tenant_id, ObTTLTaskType::OB_TTL_RESUME);
 | 
			
		||||
    ASSERT_NE(ret, OB_SUCCESS);
 | 
			
		||||
    ASSERT_EQ(task_ref.tasks_.count(), 1);
 | 
			
		||||
    // new added task, alter status
 | 
			
		||||
    rootserver::RsTenantTask& rs_task = task_ref.tasks_.at(0);
 | 
			
		||||
    ASSERT_EQ(rs_task.send_servers_.count(), 0);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.tenant_id_, tenant_id);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.table_id_, OB_INVALID_ID);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.partition_id_, OB_INVALID_ID);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.trigger_type_, static_cast<int64_t>(TRIGGER_TYPE::USER_TRIGGER));
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.status_, static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_CANCEL));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // process revieve msg
 | 
			
		||||
  {
 | 
			
		||||
    rootserver::RsTenantTask& rs_task = task_ref.tasks_.at(0);
 | 
			
		||||
    int64_t addr_value1 = 0x1234123412;
 | 
			
		||||
    common::ObAddr addr1(addr_value1);
 | 
			
		||||
    
 | 
			
		||||
    ret = rs_task.send_servers_.push_back(addr1);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
 | 
			
		||||
    uint64_t task_id = rs_task.ttl_status_.task_id_;
 | 
			
		||||
    uint64_t invalid_task_id = OB_INVALID_ID ;
 | 
			
		||||
 | 
			
		||||
    int64_t rsp_task_type = static_cast<int64_t>(ObTTLTaskType::OB_TTL_CANCEL);
 | 
			
		||||
    //  ret = TESTTTLMGR.process_tenant_task_rsp(tenant_id, invalid_task_id, rsp_task_type, addr1);
 | 
			
		||||
    //  ASSERT_NE(ret, OB_SUCCESS);
 | 
			
		||||
    //  
 | 
			
		||||
    //  
 | 
			
		||||
    //  rsp_task_type = static_cast<int64_t>(ObTTLTaskType::OB_TTL_MOVE);
 | 
			
		||||
    //  ret = TESTTTLMGR.process_tenant_task_rsp(tenant_id, task_id, rsp_task_type, addr1);
 | 
			
		||||
    //  ASSERT_NE(ret, OB_SUCCESS);
 | 
			
		||||
 | 
			
		||||
    rsp_task_type = static_cast<int64_t>(ObTTLTaskType::OB_TTL_CANCEL);
 | 
			
		||||
    ret = TESTTTLMGR.process_tenant_task_rsp(tenant_id, task_id, rsp_task_type, addr1);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
    ASSERT_EQ(EVAL_TASK_RESPONSE(rs_task.ttl_status_.status_), 0);
 | 
			
		||||
    ASSERT_EQ(EVAL_TASK_PURE_STATUS(rs_task.ttl_status_.status_), static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_MOVE));
 | 
			
		||||
 | 
			
		||||
    ret = TESTTTLMGR.process_tenant_tasks(tenant_id);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
    ASSERT_EQ(EVAL_TASK_RESPONSE(rs_task.ttl_status_.status_), 0);
 | 
			
		||||
    ASSERT_EQ(EVAL_TASK_PURE_STATUS(rs_task.ttl_status_.status_), static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_MOVE));
 | 
			
		||||
 | 
			
		||||
    rsp_task_type = static_cast<int64_t>(ObTTLTaskType::OB_TTL_MOVE);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
    ret = TESTTTLMGR.process_tenant_task_rsp(tenant_id, task_id, rsp_task_type, addr1);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
 | 
			
		||||
    ASSERT_EQ(EVAL_TASK_RESPONSE(rs_task.ttl_status_.status_), 1);
 | 
			
		||||
    ASSERT_EQ(EVAL_TASK_PURE_STATUS(rs_task.ttl_status_.status_), static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_MOVE));
 | 
			
		||||
    task_ref.tasks_.remove(0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  TESTTTLMGR.reset_local_tenant_task();
 | 
			
		||||
  TESTTTLMGR.delete_tenant(tenant_id);
 | 
			
		||||
  TESTTTLMGR.delete_tenant(tenant_id1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(TestRsTTL, ttl_periodic)
 | 
			
		||||
{
 | 
			
		||||
  int ret = OB_SUCCESS;
 | 
			
		||||
  uint32_t tenant_id = 1001;
 | 
			
		||||
 | 
			
		||||
  ret = TESTTTLMGR.add_tenant(tenant_id);
 | 
			
		||||
  ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
 | 
			
		||||
  ret = TESTTTLMGR.alter_status_and_add_ttl_task(tenant_id);
 | 
			
		||||
  ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
  
 | 
			
		||||
  rootserver::ObTTLTenantTask* task_ptr = NULL;
 | 
			
		||||
  ret = TESTTTLMGR.get_tenant_tasks_ptr(tenant_id, task_ptr);
 | 
			
		||||
  ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
  
 | 
			
		||||
  rootserver::ObTTLTenantTask& task_ref = *task_ptr;
 | 
			
		||||
  ASSERT_EQ(task_ref.tasks_.count(), 1);
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    rootserver::RsTenantTask& rs_task = task_ref.tasks_.at(0);
 | 
			
		||||
    ASSERT_EQ(rs_task.send_servers_.count(), 0);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.tenant_id_, tenant_id);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.table_id_, OB_INVALID_ID);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.partition_id_, OB_INVALID_ID);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.trigger_type_, static_cast<int64_t>(TRIGGER_TYPE::PERIODIC_TRIGGER));
 | 
			
		||||
    ASSERT_EQ(EVAL_TASK_RESPONSE(rs_task.ttl_status_.status_), 0);
 | 
			
		||||
    ASSERT_EQ(EVAL_TASK_PURE_STATUS(rs_task.ttl_status_.status_), static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_CREATE));
 | 
			
		||||
 | 
			
		||||
    rs_task.ttl_status_.task_update_time_ -= 360000 * 1000L * 1000L;
 | 
			
		||||
    ret = TESTTTLMGR.alter_status_and_add_ttl_task(tenant_id);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
 | 
			
		||||
    ret = TESTTTLMGR.add_ttl_task(tenant_id, ObTTLTaskType::OB_TTL_RESUME);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
    ASSERT_EQ(EVAL_TASK_RESPONSE(rs_task.ttl_status_.status_), 0);
 | 
			
		||||
    ASSERT_EQ(EVAL_TASK_PURE_STATUS(rs_task.ttl_status_.status_), static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_CREATE));
 | 
			
		||||
    ASSERT_EQ(task_ref.tasks_.count(), 1);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // 0:canceling, 1:create
 | 
			
		||||
    ret = TESTTTLMGR.add_ttl_task(tenant_id, ObTTLTaskType::OB_TTL_TRIGGER);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);    
 | 
			
		||||
    ASSERT_EQ(task_ref.tasks_.count(), 2);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.trigger_type_, static_cast<int64_t>(TRIGGER_TYPE::PERIODIC_TRIGGER));
 | 
			
		||||
    ASSERT_EQ(EVAL_TASK_RESPONSE(rs_task.ttl_status_.status_), 0);
 | 
			
		||||
    ASSERT_EQ(EVAL_TASK_PURE_STATUS(rs_task.ttl_status_.status_), static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_CANCEL));
 | 
			
		||||
    {
 | 
			
		||||
      rootserver::RsTenantTask& rs_task = task_ref.tasks_.at(1);
 | 
			
		||||
      ASSERT_EQ(rs_task.ttl_status_.trigger_type_, static_cast<int64_t>(TRIGGER_TYPE::USER_TRIGGER));
 | 
			
		||||
      ASSERT_EQ(EVAL_TASK_RESPONSE(rs_task.ttl_status_.status_), 0);
 | 
			
		||||
      ASSERT_EQ(EVAL_TASK_PURE_STATUS(rs_task.ttl_status_.status_), static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_CREATE));
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // first task set as move
 | 
			
		||||
    rs_task.all_responsed_ = true;
 | 
			
		||||
    ret = TESTTTLMGR.alter_status_and_add_ttl_task(tenant_id);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
    ASSERT_EQ(EVAL_TASK_RESPONSE(rs_task.ttl_status_.status_), 0);
 | 
			
		||||
    ASSERT_EQ(EVAL_TASK_PURE_STATUS(rs_task.ttl_status_.status_), static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_MOVE));
 | 
			
		||||
 | 
			
		||||
    // first task moveing, just retry send msg to server
 | 
			
		||||
    ret = TESTTTLMGR.process_tenant_tasks(tenant_id);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
    ASSERT_EQ(EVAL_TASK_RESPONSE(rs_task.ttl_status_.status_), 0);
 | 
			
		||||
    ASSERT_EQ(EVAL_TASK_PURE_STATUS(rs_task.ttl_status_.status_), static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_MOVE));
 | 
			
		||||
 | 
			
		||||
    // first task set as moved && delete first
 | 
			
		||||
    rs_task.all_responsed_ = true;
 | 
			
		||||
    ret = TESTTTLMGR.alter_status_and_add_ttl_task(tenant_id);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
    ASSERT_EQ(task_ref.tasks_.count(), 1);
 | 
			
		||||
    
 | 
			
		||||
    {
 | 
			
		||||
      rootserver::RsTenantTask& rs_task = task_ref.tasks_.at(0);
 | 
			
		||||
      ret = TESTTTLMGR.process_tenant_tasks(tenant_id);
 | 
			
		||||
      ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
      ASSERT_EQ(EVAL_TASK_RESPONSE(rs_task.ttl_status_.status_), 0);
 | 
			
		||||
      ASSERT_EQ(EVAL_TASK_PURE_STATUS(rs_task.ttl_status_.status_), static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_CREATE));
 | 
			
		||||
 | 
			
		||||
      rs_task.all_responsed_ = true;
 | 
			
		||||
      ret = TESTTTLMGR.alter_status_and_add_ttl_task(tenant_id);
 | 
			
		||||
      ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
      ASSERT_EQ(EVAL_TASK_RESPONSE(rs_task.ttl_status_.status_), 0);
 | 
			
		||||
      ASSERT_EQ(EVAL_TASK_PURE_STATUS(rs_task.ttl_status_.status_), static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_MOVE));
 | 
			
		||||
 | 
			
		||||
      rs_task.all_responsed_ = true;
 | 
			
		||||
      ret = TESTTTLMGR.alter_status_and_add_ttl_task(tenant_id);
 | 
			
		||||
      ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
      ASSERT_EQ(EVAL_TASK_RESPONSE(rs_task.ttl_status_.status_), 1);
 | 
			
		||||
      ASSERT_EQ(EVAL_TASK_PURE_STATUS(rs_task.ttl_status_.status_), static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_MOVE));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      ret = TESTTTLMGR.process_tenant_tasks(tenant_id);
 | 
			
		||||
      ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
      ASSERT_EQ(EVAL_TASK_RESPONSE(rs_task.ttl_status_.status_), 1);
 | 
			
		||||
      ASSERT_EQ(EVAL_TASK_PURE_STATUS(rs_task.ttl_status_.status_), static_cast<int64_t>(ObTTLTaskStatus::OB_RS_TTL_TASK_MOVE));
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
  TESTTTLMGR.reset_local_tenant_task();
 | 
			
		||||
  TESTTTLMGR.delete_tenant(tenant_id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(TestRsTTL, ttl_config)
 | 
			
		||||
{
 | 
			
		||||
  int ret = OB_SUCCESS;
 | 
			
		||||
  uint32_t tenant_id = 1001;
 | 
			
		||||
 | 
			
		||||
  ret = TESTTTLMGR.add_tenant(tenant_id);
 | 
			
		||||
  ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
 | 
			
		||||
  ret = TESTTTLMGR.alter_status_and_add_ttl_task(tenant_id);
 | 
			
		||||
  ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
  
 | 
			
		||||
  rootserver::ObTTLTenantTask* task_ptr = NULL;
 | 
			
		||||
  ret = TESTTTLMGR.get_tenant_tasks_ptr(tenant_id, task_ptr);
 | 
			
		||||
  ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
  
 | 
			
		||||
  rootserver::ObTTLTenantTask& task_ref = *task_ptr;
 | 
			
		||||
  ASSERT_EQ(task_ref.tasks_.count(), 1);
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    rootserver::RsTenantTask& rs_task = task_ref.tasks_.at(0);
 | 
			
		||||
 | 
			
		||||
    uint64_t send_server_cnt = TESTTTLMGR.snd_server_cnt_;
 | 
			
		||||
    ret = TESTTTLMGR.process_tenant_tasks(tenant_id);
 | 
			
		||||
    ASSERT_EQ(TESTTTLMGR.snd_server_cnt_, send_server_cnt + 1);
 | 
			
		||||
 | 
			
		||||
    TESTTTLMGR.active_time_ = false;
 | 
			
		||||
    ret = TESTTTLMGR.process_tenant_tasks(tenant_id);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.status_, static_cast<ObTTLTaskStatus>(ObTTLTaskStatus::OB_RS_TTL_TASK_SUSPEND));
 | 
			
		||||
 | 
			
		||||
    TESTTTLMGR.active_time_ = true;
 | 
			
		||||
    ret = TESTTTLMGR.process_tenant_tasks(tenant_id);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.status_, static_cast<ObTTLTaskStatus>(ObTTLTaskStatus::OB_RS_TTL_TASK_CREATE));
 | 
			
		||||
 | 
			
		||||
    TESTTTLMGR.enable_ttl_ = false;
 | 
			
		||||
    ret = TESTTTLMGR.process_tenant_tasks(tenant_id);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.status_, static_cast<ObTTLTaskStatus>(ObTTLTaskStatus::OB_RS_TTL_TASK_SUSPEND));
 | 
			
		||||
 | 
			
		||||
    TESTTTLMGR.enable_ttl_ = true;
 | 
			
		||||
    ret = TESTTTLMGR.process_tenant_tasks(tenant_id);
 | 
			
		||||
    ASSERT_EQ(ret, OB_SUCCESS);
 | 
			
		||||
 | 
			
		||||
    ASSERT_EQ(rs_task.ttl_status_.status_, static_cast<ObTTLTaskStatus>(ObTTLTaskStatus::OB_RS_TTL_TASK_CREATE));
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
}  // namespace observer
 | 
			
		||||
}  // namespace oceanbase
 | 
			
		||||
 | 
			
		||||
@ -370,3 +1181,4 @@ int main(int argc, char** argv)
 | 
			
		||||
  ::testing::InitGoogleTest(&argc, argv);
 | 
			
		||||
  return RUN_ALL_TESTS();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user