Fix scan_rowkey_range's memory invalid

This commit is contained in:
obdev
2023-01-05 09:08:28 +00:00
committed by ob-robot
parent cce7bdeb9d
commit 110881e2ad
2 changed files with 8 additions and 3 deletions

View File

@ -25,7 +25,8 @@ ObMultipleSkipScanMerge::ObMultipleSkipScanMerge()
scan_rows_range_(), scan_rows_range_(),
datums_cnt_(0), datums_cnt_(0),
datums_(nullptr), datums_(nullptr),
range_allocator_("SKIP_SCAN") range_allocator_("SS_RANGE"),
rowkey_allocator_("SS_ROWKEY")
{ {
} }
@ -81,6 +82,7 @@ void ObMultipleSkipScanMerge::reset()
} }
datums_ = nullptr; datums_ = nullptr;
range_allocator_.reset(); range_allocator_.reset();
rowkey_allocator_.reset();
ObMultipleScanMerge::reset(); ObMultipleScanMerge::reset();
} }
@ -89,6 +91,7 @@ void ObMultipleSkipScanMerge::reuse()
state_ = SCAN_ROWKEY; state_ = SCAN_ROWKEY;
reuse_datums(); reuse_datums();
range_allocator_.reuse(); range_allocator_.reuse();
rowkey_allocator_.reuse();
ObMultipleScanMerge::reuse(); ObMultipleScanMerge::reuse();
} }
@ -378,6 +381,7 @@ int ObMultipleSkipScanMerge::update_scan_rows_range(blocksstable::ObDatumRow &ro
int ObMultipleSkipScanMerge::update_scan_rowkey_range() int ObMultipleSkipScanMerge::update_scan_rowkey_range()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
rowkey_allocator_.reuse();
if (OB_UNLIKELY(!scan_rows_range_.is_valid())) { if (OB_UNLIKELY(!scan_rows_range_.is_valid())) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "Unexpected scan rows range", K(ret), K(scan_rows_range_)); STORAGE_LOG(WARN, "Unexpected scan rows range", K(ret), K(scan_rows_range_));
@ -386,7 +390,7 @@ int ObMultipleSkipScanMerge::update_scan_rowkey_range()
end_key_of_scan_rowkey_range() : end_key_of_scan_rowkey_range() :
start_key_of_scan_rowkey_range(); start_key_of_scan_rowkey_range();
for (int64_t i = 0; OB_SUCC(ret) && i < ss_rowkey_prefix_cnt_; ++i) { for (int64_t i = 0; OB_SUCC(ret) && i < ss_rowkey_prefix_cnt_; ++i) {
if (OB_FAIL(rowkey_datums[i].deep_copy(scan_rows_range_.start_key_.get_datum(i), range_allocator_))) { if (OB_FAIL(rowkey_datums[i].deep_copy(scan_rows_range_.start_key_.get_datum(i), rowkey_allocator_))) {
STORAGE_LOG(WARN, "Fail to deep copy start key's datum", K(ret), K(i), K(scan_rowkey_range_)); STORAGE_LOG(WARN, "Fail to deep copy start key's datum", K(ret), K(i), K(scan_rowkey_range_));
} }
} }
@ -408,7 +412,7 @@ int ObMultipleSkipScanMerge::update_scan_rowkey_range()
if (OB_ISNULL(col_descs = access_param_->iter_param_.get_out_col_descs())) { if (OB_ISNULL(col_descs = access_param_->iter_param_.get_out_col_descs())) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
TRANS_LOG(WARN, "Unexpected null out cols", K(ret)); TRANS_LOG(WARN, "Unexpected null out cols", K(ret));
} else if (OB_FAIL(scan_rowkey_range_.prepare_memtable_readable(*col_descs, range_allocator_))) { } else if (OB_FAIL(scan_rowkey_range_.prepare_memtable_readable(*col_descs, rowkey_allocator_))) {
STORAGE_LOG(WARN, "Fail to transfer store rowkey", K(ret), K(scan_rowkey_range_)); STORAGE_LOG(WARN, "Fail to transfer store rowkey", K(ret), K(scan_rowkey_range_));
} else if (OB_FAIL(ObMultipleScanMerge::open(scan_rowkey_range_))) { } else if (OB_FAIL(ObMultipleScanMerge::open(scan_rowkey_range_))) {
STORAGE_LOG(WARN, "Fail to open scan rowkey range", K(ret), K(scan_rowkey_range_)); STORAGE_LOG(WARN, "Fail to open scan rowkey range", K(ret), K(scan_rowkey_range_));

View File

@ -81,6 +81,7 @@ private:
int64_t datums_cnt_; int64_t datums_cnt_;
blocksstable::ObStorageDatum *datums_; blocksstable::ObStorageDatum *datums_;
common::ObArenaAllocator range_allocator_; common::ObArenaAllocator range_allocator_;
common::ObArenaAllocator rowkey_allocator_;
}; };
} }