[BUGFIX] fix allocator not reuse when refresh full table schema

This commit is contained in:
obdev
2024-05-30 11:58:48 +00:00
committed by ob-robot
parent 01b518b9c7
commit a4945c7460
2 changed files with 61 additions and 19 deletions

View File

@ -112,18 +112,36 @@ public:
index_(0), index_(0),
table_(&table), table_(&table),
tmp_table_(NULL), tmp_table_(NULL),
table_array_(NULL) table_array_(NULL),
current_allocator_("ScheRetri"),
another_allocator_("ScheRetri"),
current_schema_(&current_allocator_),
another_schema_(&another_allocator_)
{} {}
ObSchemaRetrieveHelper(common::ObArray<TABLE_SCHEMA *> &tables) ObSchemaRetrieveHelper(common::ObArray<TABLE_SCHEMA *> &tables)
: mode_(Mode::MULTIPLE_TABLE), : mode_(Mode::MULTIPLE_TABLE),
index_(0), index_(0),
table_(NULL), table_(NULL),
tmp_table_(NULL), tmp_table_(NULL),
table_array_(&tables) table_array_(&tables),
current_allocator_("ScheRetri"),
another_allocator_("ScheRetri"),
current_schema_(&current_allocator_),
another_schema_(&another_allocator_)
{} {}
~ObSchemaRetrieveHelper() {} ~ObSchemaRetrieveHelper() {}
SCHEMA &get_current() { return schemas_[index_]; } SCHEMA &get_and_reset_current()
{
if (0 == index_) {
current_schema_.reset();
current_allocator_.reuse();
} else {
another_schema_.reset();
another_allocator_.reuse();
}
return 0 == index_ ? current_schema_ : another_schema_;
}
int64_t get_curr_schema_id(); int64_t get_curr_schema_id();
void rotate() { index_ = 1 - index_; } void rotate() { index_ = 1 - index_; }
int get_table(const uint64_t table_id, TABLE_SCHEMA *&table); int get_table(const uint64_t table_id, TABLE_SCHEMA *&table);
@ -142,7 +160,10 @@ private:
//for multi table //for multi table
TABLE_SCHEMA *tmp_table_; TABLE_SCHEMA *tmp_table_;
ObArray<TABLE_SCHEMA *> *table_array_; ObArray<TABLE_SCHEMA *> *table_array_;
SCHEMA schemas_[2]; ObArenaAllocator current_allocator_;
ObArenaAllocator another_allocator_;
SCHEMA current_schema_;
SCHEMA another_schema_;
}; };
@ -163,7 +184,11 @@ public:
tmp_table_(NULL), tmp_table_(NULL),
table_array_(NULL), table_array_(NULL),
partition_(NULL), partition_(NULL),
is_subpart_template_(is_subpart_template) is_subpart_template_(is_subpart_template),
current_allocator_("SubScheRetri"),
another_allocator_("SubScheRetri"),
current_schema_(&current_allocator_),
another_schema_(&another_allocator_)
{} {}
ObSubPartSchemaRetrieveHelper(common::ObArray<TABLE_SCHEMA *> &tables, ObSubPartSchemaRetrieveHelper(common::ObArray<TABLE_SCHEMA *> &tables,
const bool is_subpart_template = true) const bool is_subpart_template = true)
@ -173,11 +198,25 @@ public:
tmp_table_(NULL), tmp_table_(NULL),
table_array_(&tables), table_array_(&tables),
partition_(NULL), partition_(NULL),
is_subpart_template_(is_subpart_template) is_subpart_template_(is_subpart_template),
current_allocator_("SubScheRetri"),
another_allocator_("SubScheRetri"),
current_schema_(&current_allocator_),
another_schema_(&another_allocator_)
{} {}
~ObSubPartSchemaRetrieveHelper() {} ~ObSubPartSchemaRetrieveHelper() {}
ObSubPartition &get_current() { return schemas_[index_]; } ObSubPartition &get_and_reset_current()
{
if (0 == index_) {
current_schema_.reset();
current_allocator_.reuse();
} else {
another_schema_.reset();
another_allocator_.reuse();
}
return 0 == index_ ? current_schema_ : another_schema_;
}
int64_t get_curr_schema_id(); int64_t get_curr_schema_id();
void rotate() { index_ = 1 - index_; } void rotate() { index_ = 1 - index_; }
int get_table(const uint64_t table_id, TABLE_SCHEMA *&table); int get_table(const uint64_t table_id, TABLE_SCHEMA *&table);
@ -197,10 +236,13 @@ private:
//for multi table //for multi table
TABLE_SCHEMA *tmp_table_; TABLE_SCHEMA *tmp_table_;
ObArray<TABLE_SCHEMA *> *table_array_; ObArray<TABLE_SCHEMA *> *table_array_;
ObSubPartition schemas_[2];
// for is_subpart_template = false // for is_subpart_template = false
ObPartition *partition_; ObPartition *partition_;
bool is_subpart_template_; bool is_subpart_template_;
ObArenaAllocator current_allocator_;
ObArenaAllocator another_allocator_;
ObSubPartition current_schema_;
ObSubPartition another_schema_;
}; };
struct VersionHisVal; struct VersionHisVal;

View File

@ -139,8 +139,7 @@ int ObSchemaRetrieveUtils::retrieve_schema(
ObSchemaRetrieveHelper<TABLE_SCHEMA, SCHEMA> helper(table_schema_array); ObSchemaRetrieveHelper<TABLE_SCHEMA, SCHEMA> helper(table_schema_array);
while (OB_SUCC(ret) && common::OB_SUCCESS == (ret = result.next())) { while (OB_SUCC(ret) && common::OB_SUCCESS == (ret = result.next())) {
bool is_deleted = false; bool is_deleted = false;
SCHEMA &current = helper.get_current(); SCHEMA &current = helper.get_and_reset_current();
current.reset();
if (OB_FAIL(helper.fill_current(tenant_id, check_deleted, result, current, is_deleted))) { if (OB_FAIL(helper.fill_current(tenant_id, check_deleted, result, current, is_deleted))) {
SHARE_SCHEMA_LOG(WARN, "fill schema failed", K(ret)); SHARE_SCHEMA_LOG(WARN, "fill schema failed", K(ret));
} else if (current.get_table_id() == last_table_id } else if (current.get_table_id() == last_table_id
@ -213,13 +212,17 @@ int ObSchemaRetrieveUtils::retrieve_column_group_schema(const uint64_t tenant_id
// store current_schema and last_schema // store current_schema and last_schema
bool is_last_deleted = false; bool is_last_deleted = false;
ObColumnGroupSchema *last_schema = NULL; ObColumnGroupSchema *last_schema = NULL;
ObColumnGroupSchema tmp_schemas[2]; // to avoid full copy ObArenaAllocator current_allocator("ColGroScheRetri");
ObArenaAllocator another_allocator("ColGroScheRetri");
ObColumnGroupSchema tmp_schemas[2] = {ObColumnGroupSchema(&current_allocator),
ObColumnGroupSchema(&another_allocator)};
int64_t tmp_idx = 0; int64_t tmp_idx = 0;
while (OB_SUCC(ret) && OB_SUCC(result.next())) { while (OB_SUCC(ret) && OB_SUCC(result.next())) {
bool is_deleted = false; bool is_deleted = false;
uint64_t cur_table_id = common::OB_INVALID_ID; uint64_t cur_table_id = common::OB_INVALID_ID;
ObColumnGroupSchema &current = tmp_schemas[tmp_idx]; ObColumnGroupSchema &current = tmp_schemas[tmp_idx];
current.reset(); current.reset();
0 == tmp_idx ? current_allocator.reuse() : another_allocator.reuse();
if (OB_FAIL(ObSchemaRetrieveUtils::fill_column_group_info(check_deleted, result, current, cur_table_id, is_deleted))) { if (OB_FAIL(ObSchemaRetrieveUtils::fill_column_group_info(check_deleted, result, current, cur_table_id, is_deleted))) {
SHARE_SCHEMA_LOG(WARN, "fail to fill column_group schema", KR(ret)); SHARE_SCHEMA_LOG(WARN, "fail to fill column_group schema", KR(ret));
@ -586,7 +589,7 @@ int ObSubPartSchemaRetrieveHelper<TABLE_SCHEMA>::add(ObSubPartition &p)
template<typename TABLE_SCHEMA> template<typename TABLE_SCHEMA>
int64_t ObSubPartSchemaRetrieveHelper<TABLE_SCHEMA>::get_curr_schema_id() int64_t ObSubPartSchemaRetrieveHelper<TABLE_SCHEMA>::get_curr_schema_id()
{ {
return schemas_[index_].get_sub_part_id(); return index_ == 0 ? current_schema_.get_sub_part_id() : another_schema_.get_sub_part_id();
} }
template<typename TABLE_SCHEMA> template<typename TABLE_SCHEMA>
@ -665,7 +668,7 @@ int ObSchemaRetrieveHelper<TABLE_SCHEMA, SCHEMA>::add(SCHEMA &p)
template<typename TABLE_SCHEMA, typename SCHEMA> template<typename TABLE_SCHEMA, typename SCHEMA>
int64_t ObSchemaRetrieveHelper<TABLE_SCHEMA, SCHEMA>::get_curr_schema_id() int64_t ObSchemaRetrieveHelper<TABLE_SCHEMA, SCHEMA>::get_curr_schema_id()
{ {
return ObSchemaRetrieveHelperBase<TABLE_SCHEMA, SCHEMA>::get_schema_id(schemas_[index_]); return ObSchemaRetrieveHelperBase<TABLE_SCHEMA, SCHEMA>::get_schema_id(index_ == 0 ? current_schema_ : another_schema_);
} }
template<typename TABLE_SCHEMA, typename SCHEMA> template<typename TABLE_SCHEMA, typename SCHEMA>
@ -698,8 +701,7 @@ int ObSchemaRetrieveUtils::retrieve_schema(const uint64_t tenant_id,
ObSchemaRetrieveHelper<TABLE_SCHEMA, SCHEMA> helper(*table_schema); ObSchemaRetrieveHelper<TABLE_SCHEMA, SCHEMA> helper(*table_schema);
while (OB_SUCC(ret) && common::OB_SUCCESS == (ret = result.next())) { while (OB_SUCC(ret) && common::OB_SUCCESS == (ret = result.next())) {
bool is_deleted = false; bool is_deleted = false;
SCHEMA &current = helper.get_current(); SCHEMA &current = helper.get_and_reset_current();
current.reset();
if (OB_FAIL(helper.fill_current(tenant_id, check_deleted, result, current, is_deleted))) { if (OB_FAIL(helper.fill_current(tenant_id, check_deleted, result, current, is_deleted))) {
SHARE_SCHEMA_LOG(WARN, "fill schema fail", K(ret)); SHARE_SCHEMA_LOG(WARN, "fill schema fail", K(ret));
} else if (table_id != current.get_table_id()) { } else if (table_id != current.get_table_id()) {
@ -839,8 +841,7 @@ int ObSchemaRetrieveUtils::retrieve_subpart_schema(
is_subpart_template); is_subpart_template);
while (OB_SUCC(ret) && OB_SUCC(result.next())) { while (OB_SUCC(ret) && OB_SUCC(result.next())) {
bool is_deleted = false; bool is_deleted = false;
ObSubPartition &current = helper.get_current(); ObSubPartition &current = helper.get_and_reset_current();
current.reset();
if (OB_FAIL(helper.fill_current(tenant_id, check_deleted, if (OB_FAIL(helper.fill_current(tenant_id, check_deleted,
result, current, is_deleted))) { result, current, is_deleted))) {
SHARE_SCHEMA_LOG(WARN, "fill schema fail", K(ret)); SHARE_SCHEMA_LOG(WARN, "fill schema fail", K(ret));
@ -889,8 +890,7 @@ int ObSchemaRetrieveUtils::retrieve_subpart_schema(
is_subpart_template); is_subpart_template);
while (OB_SUCC(ret) && OB_SUCC(result.next())) { while (OB_SUCC(ret) && OB_SUCC(result.next())) {
bool is_deleted = false; bool is_deleted = false;
ObSubPartition &current = helper.get_current(); ObSubPartition &current = helper.get_and_reset_current();
current.reset();
if (OB_FAIL(helper.fill_current(tenant_id, check_deleted, if (OB_FAIL(helper.fill_current(tenant_id, check_deleted,
result, current, is_deleted))) { result, current, is_deleted))) {
SHARE_SCHEMA_LOG(WARN, "fill schema fail", K(ret)); SHARE_SCHEMA_LOG(WARN, "fill schema fail", K(ret));