Fix ddl_kvs_ inc ref twice when tiny tablet deserialization.
This commit is contained in:
@ -1452,15 +1452,20 @@ int ObTablet::deserialize(
|
|||||||
start_pos += rowkey_read_info_->get_deep_copy_size();
|
start_pos += rowkey_read_info_->get_deep_copy_size();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// `pull_memtables` pulls ddl kvs into `ddl_kvs_addr` array which allocated by `allocator`.
|
||||||
|
// tiny tablet needs to deep copy `ddl_kvs_addr` array to `tablet_buf + start_pos`, and CANNOT additionally
|
||||||
|
// inc ref count. Cause `pull_memtables` already done this.
|
||||||
if (OB_NOT_NULL(ddl_kvs_addr)) {
|
if (OB_NOT_NULL(ddl_kvs_addr)) {
|
||||||
const int64_t ddl_kv_size = sizeof(ObITable*) * DDL_KV_ARRAY_SIZE;
|
const int64_t ddl_kv_size = sizeof(ObITable*) * DDL_KV_ARRAY_SIZE;
|
||||||
if (remain < ddl_kv_size) {
|
if (remain < ddl_kv_size) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("fail to deep copy ddl kv to tablet", K(ret), K(remain), K(ddl_kv_size), K(ddl_kv_count));
|
LOG_WARN("fail to deep copy ddl kv to tablet", K(ret), K(remain), K(ddl_kv_size), K(ddl_kv_count));
|
||||||
} else {
|
} else {
|
||||||
|
ddl_kv_count_ = ddl_kv_count;
|
||||||
ddl_kvs_ = reinterpret_cast<ObITable**>(tablet_buf + start_pos);
|
ddl_kvs_ = reinterpret_cast<ObITable**>(tablet_buf + start_pos);
|
||||||
if (OB_FAIL(assign_ddl_kvs(ddl_kvs_addr, ddl_kv_count))) {
|
if (OB_ISNULL(MEMCPY(ddl_kvs_, ddl_kvs_addr, ddl_kv_size))) {
|
||||||
LOG_WARN("fail to assign ddl_kvs", K(ret), KP(ddl_kvs_addr), K(ddl_kv_count), KP(tablet_buf), K(start_pos));
|
ret = OB_ERR_UNEXPECTED;
|
||||||
|
LOG_WARN("fail to memcpy ddl_kvs", K(ret), KP(ddl_kvs_), KP(ddl_kvs_addr), K(ddl_kv_count_));
|
||||||
} else {
|
} else {
|
||||||
start_pos += ddl_kv_size;
|
start_pos += ddl_kv_size;
|
||||||
remain -= ddl_kv_size;
|
remain -= ddl_kv_size;
|
||||||
|
|||||||
Reference in New Issue
Block a user