avoid stepping on memory that's still needed conveyor_old
authorRobert Haas <[email protected]>
Tue, 14 Dec 2021 20:09:01 +0000 (15:09 -0500)
committerRobert Haas <[email protected]>
Tue, 14 Dec 2021 20:09:01 +0000 (15:09 -0500)
src/backend/access/conveyor/cbmetapage.c
src/backend/access/conveyor/conveyor.c
src/include/access/cbmetapage.h

index 2abf7cc650f08d4ea61c5ecc8a700f74c4a65e47..15021e092be44d54e1bd62ab4bbcddd263feab9e 100644 (file)
@@ -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));
 }
 
 /*
index 431a01c9f844e29363589316c10ee0b92f6bcd34..12a188884d8b5b402d9e59473e7d06660f94ba53 100644 (file)
@@ -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,
index 490130c339253161cf55dfbc201557a8bf868016..b7a65187bb5bd6ce8c5c50b5c3aadecea02f10f8 100644 (file)
@@ -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);