404 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			404 lines
		
	
	
		
			9.9 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.
 | 
						|
 */
 | 
						|
 | 
						|
#define USING_LOG_PREFIX SHARE_PT
 | 
						|
 | 
						|
#include <gtest/gtest.h>
 | 
						|
#include "share/client_feedback/ob_client_feedback_manager.h"
 | 
						|
#include "share/partition_table/ob_partition_location.h"
 | 
						|
 | 
						|
namespace oceanbase
 | 
						|
{
 | 
						|
namespace share
 | 
						|
{
 | 
						|
using namespace common;
 | 
						|
using namespace obmysql;
 | 
						|
using namespace std;
 | 
						|
 | 
						|
#define AS ASSERT_EQ(OB_SUCCESS, ret)
 | 
						|
#define AF(x) ASSERT_EQ(x, ret)
 | 
						|
 | 
						|
TEST(ObPartitionInfo, common)
 | 
						|
{
 | 
						|
  ObFollowerFirstFeedback fff;
 | 
						|
  fff.set_value(1000);
 | 
						|
 | 
						|
  const int64_t LEN = 100;
 | 
						|
  char buf[LEN];
 | 
						|
  int64_t pos = 0;
 | 
						|
 | 
						|
  INIT_SUCC(ret);
 | 
						|
  pos = 0;
 | 
						|
  ret = fff.serialize(buf, 2, pos);
 | 
						|
  AF(OB_SIZE_OVERFLOW);
 | 
						|
  ASSERT_EQ(0, pos);
 | 
						|
 | 
						|
  pos = 0;
 | 
						|
  ret = fff.serialize(buf, LEN, pos);
 | 
						|
  AS;
 | 
						|
  ASSERT_TRUE(pos > 0);
 | 
						|
 | 
						|
  ObFollowerFirstFeedback fff2;
 | 
						|
  pos = 0;
 | 
						|
  ret = fff2.deserialize(buf, LEN, pos);
 | 
						|
  AS;
 | 
						|
  ASSERT_EQ(fff2.get_value(), fff.get_value());
 | 
						|
  ASSERT_EQ(fff2.get_type(), fff.get_type());
 | 
						|
}
 | 
						|
 | 
						|
TEST(ObFeedbackPartitionLocation, common)
 | 
						|
{
 | 
						|
  ObFeedbackPartitionLocation fpl;
 | 
						|
  fpl.set_table_id(1);
 | 
						|
  fpl.set_partition_id(1);
 | 
						|
  fpl.set_schema_version(1);
 | 
						|
 | 
						|
  const int64_t LEN = 100;
 | 
						|
  char buf[LEN];
 | 
						|
  int64_t pos = 0;
 | 
						|
 | 
						|
  INIT_SUCC(ret);
 | 
						|
  pos = 0;
 | 
						|
  ret = fpl.serialize(buf, 2, pos);
 | 
						|
  AF(OB_SIZE_OVERFLOW);
 | 
						|
  ASSERT_EQ(0, pos);
 | 
						|
 | 
						|
  pos = 0;
 | 
						|
  ret = fpl.serialize(buf, LEN, pos);
 | 
						|
  AS;
 | 
						|
  ASSERT_TRUE(pos > 0);
 | 
						|
 | 
						|
  ObFeedbackPartitionLocation fpl2;
 | 
						|
  pos = 0;
 | 
						|
  ret = fpl2.deserialize(buf, LEN, pos);
 | 
						|
  AS;
 | 
						|
  ASSERT_EQ(fpl2, fpl);
 | 
						|
 | 
						|
 | 
						|
  fpl.reset();
 | 
						|
  fpl.set_table_id(1);
 | 
						|
  fpl.set_partition_id(1);
 | 
						|
  fpl.set_schema_version(1);
 | 
						|
 | 
						|
  ObFeedbackReplicaLocation replica;
 | 
						|
  replica.role_ = LEADER;
 | 
						|
  replica.replica_type_ = REPLICA_TYPE_FULL;
 | 
						|
  replica.server_.set_ip_addr("1.1.1.1", 111);
 | 
						|
 | 
						|
  ret = fpl.add_replica(replica);
 | 
						|
  AS;
 | 
						|
 | 
						|
  replica.role_ = FOLLOWER;
 | 
						|
  replica.replica_type_ = REPLICA_TYPE_BACKUP;
 | 
						|
  replica.server_.set_ip_addr("2.2.2.2", 2222);
 | 
						|
  ret = fpl.add_replica(replica);
 | 
						|
  AS;
 | 
						|
  pos = 0;
 | 
						|
  ret = fpl.serialize(buf, LEN, pos);
 | 
						|
  AS;
 | 
						|
  ASSERT_TRUE(pos > 0);
 | 
						|
 | 
						|
  pos = 0;
 | 
						|
  ret =  fpl2.deserialize(buf, LEN, pos);
 | 
						|
  AS;
 | 
						|
 | 
						|
  ASSERT_EQ(fpl2, fpl);
 | 
						|
}
 | 
						|
 | 
						|
TEST(ObFeedbackManager, common)
 | 
						|
{
 | 
						|
  INIT_SUCC(ret);
 | 
						|
  ObFeedbackManager fbm;
 | 
						|
 | 
						|
  ObFeedbackPartitionLocation fpl;
 | 
						|
  fpl.set_table_id(1);
 | 
						|
  fpl.set_partition_id(1);
 | 
						|
  fpl.set_schema_version(4);
 | 
						|
  ObFeedbackReplicaLocation replica;
 | 
						|
  replica.role_ = LEADER;
 | 
						|
  replica.replica_type_ = REPLICA_TYPE_FULL;
 | 
						|
  replica.server_.set_ip_addr("1.1.1.1", 111);
 | 
						|
  ret = fpl.add_replica(replica);
 | 
						|
  AS;
 | 
						|
  replica.role_ = FOLLOWER;
 | 
						|
  replica.replica_type_ = REPLICA_TYPE_BACKUP;
 | 
						|
  replica.server_.set_ip_addr("2.2.2.2", 2222);
 | 
						|
  ret = fpl.add_replica(replica);
 | 
						|
  AS;
 | 
						|
 | 
						|
  ObPartitionLocation pl;
 | 
						|
  pl.set_table_id(1);
 | 
						|
  pl.set_partition_id(1);
 | 
						|
  ObReplicaLocation replica2;
 | 
						|
  replica2.role_ = LEADER;
 | 
						|
  replica2.replica_type_ = REPLICA_TYPE_FULL;
 | 
						|
  replica2.server_.set_ip_addr("1.1.1.1", 111);
 | 
						|
  replica2.sql_port_ = 111;
 | 
						|
  ret = pl.add(replica2);
 | 
						|
  AS;
 | 
						|
  replica2.role_ = FOLLOWER;
 | 
						|
  replica2.replica_type_ = REPLICA_TYPE_BACKUP;
 | 
						|
  replica2.server_.set_ip_addr("2.2.2.2", 2222);
 | 
						|
  replica2.sql_port_ = 222;
 | 
						|
  ret = pl.add(replica2);
 | 
						|
  AS;
 | 
						|
 | 
						|
  ObFBPartitionParam param;
 | 
						|
  param.schema_version_ = 1;
 | 
						|
  param.original_partition_id_ = 111111;
 | 
						|
  param.pl_.assign(pl);
 | 
						|
  ret = fbm.add_partition_fb_info(param);
 | 
						|
  AS;
 | 
						|
  param.schema_version_ = 2;
 | 
						|
  ret = fbm.add_partition_fb_info(param); // override
 | 
						|
  AS;
 | 
						|
  param.schema_version_ = 3;
 | 
						|
  ret = fbm.add_partition_fb_info(param); // override
 | 
						|
  AS;
 | 
						|
  param.schema_version_ = 4;
 | 
						|
  ret = fbm.add_partition_fb_info(param); // override
 | 
						|
  AS;
 | 
						|
 | 
						|
  ret = fbm.add_follower_first_fb_info(FFF_HIT_LEADER);
 | 
						|
  AS;
 | 
						|
  ret = fbm.add_follower_first_fb_info(FFF_HIT_LEADER); // override
 | 
						|
  AS;
 | 
						|
  ret = fbm.add_follower_first_fb_info(FFF_HIT_LEADER); // override
 | 
						|
  AS;
 | 
						|
  ret = fbm.add_follower_first_fb_info(FFF_HIT_LEADER); // override
 | 
						|
  AS;
 | 
						|
  ret = fbm.add_follower_first_fb_info(FFF_HIT_LEADER); // override
 | 
						|
  AS;
 | 
						|
 | 
						|
  const int64_t LEN = 100;
 | 
						|
  char buf[LEN];
 | 
						|
  int64_t pos = 0;
 | 
						|
 | 
						|
  ret = fbm.serialize(buf, 10, pos);
 | 
						|
  AF(OB_SIZE_OVERFLOW);
 | 
						|
  ASSERT_EQ(0, pos);
 | 
						|
 | 
						|
  pos = 0;
 | 
						|
  ret = fbm.serialize(buf, LEN, pos);
 | 
						|
  AS;
 | 
						|
  ASSERT_TRUE(pos > 0);
 | 
						|
  int64_t seri_len = pos;
 | 
						|
 | 
						|
  ObFeedbackManager fbm2;
 | 
						|
  pos = 0;
 | 
						|
 | 
						|
  ret = fbm2.deserialize(buf, 10, pos);
 | 
						|
  AF(OB_INVALID_DATA);
 | 
						|
  ASSERT_EQ(0, pos);
 | 
						|
 | 
						|
  ret = fbm2.deserialize(buf, 9, pos);
 | 
						|
  AF(OB_INVALID_DATA);
 | 
						|
  ASSERT_EQ(0, pos);
 | 
						|
 | 
						|
  ret = fbm2.deserialize(buf, 8, pos);
 | 
						|
  AF(OB_INVALID_DATA);
 | 
						|
  ASSERT_EQ(0, pos);
 | 
						|
 | 
						|
  ret = fbm2.deserialize(buf, 7, pos);
 | 
						|
  AF(OB_INVALID_DATA);
 | 
						|
  ASSERT_EQ(0, pos);
 | 
						|
 | 
						|
  ret = fbm2.deserialize(buf, 6, pos);
 | 
						|
  AF(OB_INVALID_DATA);
 | 
						|
  ASSERT_EQ(0, pos);
 | 
						|
 | 
						|
  ret = fbm2.deserialize(buf, 5, pos);
 | 
						|
  AF(OB_INVALID_DATA);
 | 
						|
  ASSERT_EQ(0, pos);
 | 
						|
 | 
						|
  ret = fbm2.deserialize(buf, 4, pos);
 | 
						|
  AF(OB_SIZE_OVERFLOW);
 | 
						|
  ASSERT_EQ(0, pos);
 | 
						|
 | 
						|
  // just right deseri FollowerFirstFeedback
 | 
						|
  ret = fbm2.deserialize(buf, 3, pos);
 | 
						|
  AS;
 | 
						|
  ASSERT_TRUE(pos > 0);
 | 
						|
  pos = 0;
 | 
						|
 | 
						|
  ret = fbm2.deserialize(buf, 2, pos);
 | 
						|
  AF(OB_INVALID_DATA);
 | 
						|
  ASSERT_EQ(0, pos);
 | 
						|
 | 
						|
  ret = fbm2.deserialize(buf, 1, pos);
 | 
						|
  AF(OB_SIZE_OVERFLOW);
 | 
						|
  ASSERT_EQ(0, pos);
 | 
						|
 | 
						|
  ret = fbm2.deserialize(buf, 0, pos);
 | 
						|
  AF(OB_INVALID_ARGUMENT);
 | 
						|
  ASSERT_EQ(0, pos);
 | 
						|
 | 
						|
  ret = fbm2.deserialize(buf, seri_len, pos);
 | 
						|
  AS;
 | 
						|
 | 
						|
  ASSERT_EQ(*(fbm2.get_follower_first_feedback()), *(fbm.get_follower_first_feedback()));
 | 
						|
  ASSERT_EQ(*(fbm2.get_pl_feedback()), *(fbm.get_pl_feedback()));
 | 
						|
}
 | 
						|
 | 
						|
class ObForwardCompatibilityFeedbackPartitionLocation : public ObAbstractFeedbackObject<ObForwardCompatibilityFeedbackPartitionLocation>
 | 
						|
{
 | 
						|
public:
 | 
						|
  ObForwardCompatibilityFeedbackPartitionLocation() : ObAbstractFeedbackObject<ObForwardCompatibilityFeedbackPartitionLocation>(PARTITION_LOCATION_FB_ELE)
 | 
						|
  {}
 | 
						|
  virtual ~ObForwardCompatibilityFeedbackPartitionLocation() {}
 | 
						|
  FB_OBJ_DEFINE_METHOD;
 | 
						|
 | 
						|
public:
 | 
						|
  uint64_t table_id_;
 | 
						|
  int64_t partition_id_;
 | 
						|
};
 | 
						|
 | 
						|
int ObForwardCompatibilityFeedbackPartitionLocation::serialize_struct_content(char *buf, const int64_t len, int64_t &pos) const
 | 
						|
{
 | 
						|
  OB_FB_SER_START;
 | 
						|
  OB_FB_ENCODE_INT(table_id_);
 | 
						|
  OB_FB_ENCODE_INT(partition_id_);
 | 
						|
  OB_FB_SER_END;
 | 
						|
}
 | 
						|
 | 
						|
inline bool ObForwardCompatibilityFeedbackPartitionLocation::is_valid_obj() const
 | 
						|
{
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
int ObForwardCompatibilityFeedbackPartitionLocation::deserialize_struct_content(char *buf, const int64_t len, int64_t &pos)
 | 
						|
{
 | 
						|
  UNUSED(buf);
 | 
						|
  UNUSED(len);
 | 
						|
  UNUSED(pos);
 | 
						|
  return OB_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
TEST(ObFeedbackPartitionLocation, forward_compatibility)
 | 
						|
{
 | 
						|
  ObForwardCompatibilityFeedbackPartitionLocation fcfpl;
 | 
						|
  fcfpl.table_id_ = 2;
 | 
						|
  fcfpl.partition_id_ = 3;
 | 
						|
 | 
						|
  INIT_SUCC(ret);
 | 
						|
  const int64_t LEN = 100;
 | 
						|
  char buf[LEN];
 | 
						|
  int64_t pos = 0;
 | 
						|
  ret = fcfpl.serialize(buf, LEN, pos);
 | 
						|
  AS;
 | 
						|
 | 
						|
  ObFeedbackPartitionLocation fpl;
 | 
						|
  int64_t pos2 = 0;
 | 
						|
  ret = fpl.deserialize(buf, LEN, pos2);
 | 
						|
  AS;
 | 
						|
 | 
						|
  ASSERT_EQ(pos, pos2);
 | 
						|
 | 
						|
  ASSERT_EQ(fcfpl.table_id_, fpl.get_table_id());
 | 
						|
  ASSERT_EQ(fcfpl.partition_id_, fpl.get_partition_id());
 | 
						|
  ASSERT_EQ(fpl.get_schema_version(), 0);
 | 
						|
  ASSERT_EQ(fpl.get_replica_array()->count(), 0);
 | 
						|
}
 | 
						|
 | 
						|
class ObBackwardCompatibilityFeedbackPartitionLocation : public ObAbstractFeedbackObject<ObBackwardCompatibilityFeedbackPartitionLocation>
 | 
						|
{
 | 
						|
public:
 | 
						|
  ObBackwardCompatibilityFeedbackPartitionLocation() : ObAbstractFeedbackObject<ObBackwardCompatibilityFeedbackPartitionLocation>(PARTITION_LOCATION_FB_ELE)
 | 
						|
  {}
 | 
						|
  virtual ~ObBackwardCompatibilityFeedbackPartitionLocation() {}
 | 
						|
  FB_OBJ_DEFINE_METHOD;
 | 
						|
 | 
						|
public:
 | 
						|
  typedef common::ObSEArray<ObFeedbackReplicaLocation, 5> ObTestFeedbackReplicaLocationArray;
 | 
						|
  uint64_t table_id_;
 | 
						|
  int64_t partition_id_;
 | 
						|
  int64_t schema_version_;
 | 
						|
  ObTestFeedbackReplicaLocationArray replicas_;
 | 
						|
  int64_t test_1_;
 | 
						|
  int64_t test_2_;
 | 
						|
};
 | 
						|
 | 
						|
int ObBackwardCompatibilityFeedbackPartitionLocation::serialize_struct_content(char *buf, const int64_t len, int64_t &pos) const
 | 
						|
{
 | 
						|
  OB_FB_SER_START;
 | 
						|
  OB_FB_ENCODE_INT(table_id_);
 | 
						|
  OB_FB_ENCODE_INT(partition_id_);
 | 
						|
  OB_FB_ENCODE_INT(schema_version_);
 | 
						|
  OB_FB_ENCODE_STRUCT_ARRAY(replicas_, replicas_.count());
 | 
						|
  OB_FB_ENCODE_INT(test_1_);
 | 
						|
  OB_FB_ENCODE_INT(test_2_);
 | 
						|
  OB_FB_SER_END;
 | 
						|
}
 | 
						|
 | 
						|
inline bool ObBackwardCompatibilityFeedbackPartitionLocation::is_valid_obj() const
 | 
						|
{
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
int ObBackwardCompatibilityFeedbackPartitionLocation::deserialize_struct_content(char *buf, const int64_t len, int64_t &pos)
 | 
						|
{
 | 
						|
  UNUSED(buf);
 | 
						|
  UNUSED(len);
 | 
						|
  UNUSED(pos);
 | 
						|
  return OB_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
TEST(ObFeedbackPartitionLocation, backward_compatibility)
 | 
						|
{
 | 
						|
  ObBackwardCompatibilityFeedbackPartitionLocation bcfpl;
 | 
						|
  bcfpl.table_id_ = 22222222;
 | 
						|
  bcfpl.partition_id_ = 33333333;
 | 
						|
  bcfpl.schema_version_ = 55555555;
 | 
						|
  bcfpl.test_1_ = 66666;
 | 
						|
  bcfpl.test_2_ = 77777;
 | 
						|
 | 
						|
  ObFeedbackReplicaLocation replica;
 | 
						|
  replica.role_ = LEADER;
 | 
						|
  replica.replica_type_ = REPLICA_TYPE_FULL;
 | 
						|
  replica.server_.set_ip_addr("1.1.1.1", 111);
 | 
						|
  INIT_SUCC(ret);
 | 
						|
  ret = bcfpl.replicas_.push_back(replica);
 | 
						|
  AS;
 | 
						|
  replica.role_ = FOLLOWER;
 | 
						|
  replica.replica_type_ = REPLICA_TYPE_BACKUP;
 | 
						|
  replica.server_.set_ip_addr("2.2.2.2", 2222);
 | 
						|
  ret = bcfpl.replicas_.push_back(replica);
 | 
						|
  AS;
 | 
						|
 | 
						|
  const int64_t LEN = 100;
 | 
						|
  char buf[LEN];
 | 
						|
  int64_t pos = 0;
 | 
						|
  ret = bcfpl.serialize(buf, LEN, pos);
 | 
						|
  AS;
 | 
						|
 | 
						|
  ObFeedbackPartitionLocation fpl;
 | 
						|
  int64_t pos2 = 0;
 | 
						|
  ret = fpl.deserialize(buf, LEN, pos2);
 | 
						|
  AS;
 | 
						|
 | 
						|
  ASSERT_EQ(pos, pos2);
 | 
						|
 | 
						|
  ASSERT_EQ(bcfpl.table_id_, fpl.get_table_id());
 | 
						|
  ASSERT_EQ(bcfpl.partition_id_, fpl.get_partition_id());
 | 
						|
  ASSERT_EQ(bcfpl.schema_version_, fpl.get_schema_version());
 | 
						|
  ASSERT_EQ(bcfpl.replicas_.count(), fpl.get_replica_array()->count());
 | 
						|
}
 | 
						|
 | 
						|
} // end namespace share
 | 
						|
} // end namespace oceanbase
 | 
						|
 | 
						|
int main(int argc, char **argv)
 | 
						|
{
 | 
						|
  testing::InitGoogleTest(&argc, argv);
 | 
						|
  return RUN_ALL_TESTS();
 | 
						|
}
 |