diff options
author | Robert Haas | 2021-12-14 20:09:01 +0000 |
---|---|---|
committer | Robert Haas | 2021-12-14 20:09:01 +0000 |
commit | 18f5f046a90d3876ffbaee2698d7be82ce8421a7 (patch) | |
tree | 18e63b46e5fd8d3df7a3064faab7a864a9a39008 | |
parent | 6bc1c1e6f4e0075c2dbcfad3fb7faeff82509466 (diff) |
avoid stepping on memory that's still neededconveyor_old
-rw-r--r-- | src/backend/access/conveyor/cbmetapage.c | 12 | ||||
-rw-r--r-- | src/backend/access/conveyor/conveyor.c | 5 | ||||
-rw-r--r-- | src/include/access/cbmetapage.h | 4 |
3 files changed, 14 insertions, 7 deletions
diff --git a/src/backend/access/conveyor/cbmetapage.c b/src/backend/access/conveyor/cbmetapage.c index 2abf7cc650..15021e092b 100644 --- a/src/backend/access/conveyor/cbmetapage.c +++ b/src/backend/access/conveyor/cbmetapage.c @@ -403,12 +403,16 @@ cb_metapage_remove_index_entries(CBMetapageData *meta, unsigned count, } /* - * Return a pointer to the in-metapage index entries. + * Copy the indicated number of index entries out of the metapage. */ -CBSegNo * -cb_metapage_get_index_entry_pointer(CBMetapageData *meta) +void +cb_metapage_get_index_entries(CBMetapageData *meta, unsigned num_index_entries, + CBSegNo *index_entries) { - return meta->cbm_index; + Assert(num_index_entries <= cb_metapage_get_index_entries_used(meta)); + + memcpy(index_entries, meta->cbm_index, + num_index_entries * sizeof(CBSegNo)); } /* diff --git a/src/backend/access/conveyor/conveyor.c b/src/backend/access/conveyor/conveyor.c index 431a01c9f8..12a188884d 100644 --- a/src/backend/access/conveyor/conveyor.c +++ b/src/backend/access/conveyor/conveyor.c @@ -450,7 +450,7 @@ ConveyorBeltGetNewPage(ConveyorBelt *cb, CBPageNo *pageno) { unsigned pageoffset; unsigned num_index_entries; - CBSegNo *index_entries; + CBSegNo index_entries[CB_METAPAGE_INDEX_ENTRIES]; CBPageNo index_page_start; unsigned logical_pages_in_index_segments; unsigned index_entries_in_index_segments; @@ -468,7 +468,8 @@ ConveyorBeltGetNewPage(ConveyorBelt *cb, CBPageNo *pageno) num_index_entries = Min(CB_METAPAGE_INDEX_ENTRIES, CB_INDEXPAGE_INDEX_ENTRIES - pageoffset); - index_entries = cb_metapage_get_index_entry_pointer(meta); + cb_metapage_get_index_entries(meta, num_index_entries, + index_entries); index_page_start = index_metapage_start - pageoffset * cb->cb_pages_per_segment; cb_relocate_index_entries(cb->cb_insert_relfilenode, cb->cb_fork, diff --git a/src/include/access/cbmetapage.h b/src/include/access/cbmetapage.h index 490130c339..b7a65187bb 100644 --- a/src/include/access/cbmetapage.h +++ b/src/include/access/cbmetapage.h @@ -142,7 +142,9 @@ extern void cb_metapage_add_index_entry(CBMetapageData *meta, CBSegNo segno); extern void cb_metapage_remove_index_entries(CBMetapageData *meta, unsigned count, bool relocating); -extern CBSegNo *cb_metapage_get_index_entry_pointer(CBMetapageData *meta); +extern void cb_metapage_get_index_entries(CBMetapageData *meta, + unsigned num_index_entries, + CBSegNo *index_entries); extern void cb_metapage_get_critical_info(CBMetapageData *meta, uint16 *pages_per_segment, uint64 *index_segments_moved); |