summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Haas2021-12-14 20:09:01 +0000
committerRobert Haas2021-12-14 20:09:01 +0000
commit18f5f046a90d3876ffbaee2698d7be82ce8421a7 (patch)
tree18e63b46e5fd8d3df7a3064faab7a864a9a39008
parent6bc1c1e6f4e0075c2dbcfad3fb7faeff82509466 (diff)
avoid stepping on memory that's still neededconveyor_old
-rw-r--r--src/backend/access/conveyor/cbmetapage.c12
-rw-r--r--src/backend/access/conveyor/conveyor.c5
-rw-r--r--src/include/access/cbmetapage.h4
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);