summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/access/nbtree/nbtinsert.c49
-rw-r--r--src/backend/commands/publicationcmds.c4
-rw-r--r--src/backend/nls.mk2
-rw-r--r--src/backend/postmaster/launch_backend.c32
-rw-r--r--src/backend/utils/init/miscinit.c59
5 files changed, 38 insertions, 108 deletions
diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c
index be60781fc98..85d97a970ac 100644
--- a/src/backend/access/nbtree/nbtinsert.c
+++ b/src/backend/access/nbtree/nbtinsert.c
@@ -1473,6 +1473,8 @@ _bt_split(Relation rel, Relation heaprel, BTScanInsert itup_key, Buffer buf,
Page origpage;
Page leftpage,
rightpage;
+ PGAlignedBlock leftpage_buf,
+ rightpage_buf;
BlockNumber origpagenumber,
rightpagenumber;
BTPageOpaque ropaque,
@@ -1543,8 +1545,8 @@ _bt_split(Relation rel, Relation heaprel, BTScanInsert itup_key, Buffer buf,
firstrightoff = _bt_findsplitloc(rel, origpage, newitemoff, newitemsz,
newitem, &newitemonleft);
- /* Allocate temp buffer for leftpage */
- leftpage = PageGetTempPage(origpage);
+ /* Use temporary buffer for leftpage */
+ leftpage = leftpage_buf.data;
_bt_pageinit(leftpage, BufferGetPageSize(buf));
lopaque = BTPageGetOpaque(leftpage);
@@ -1707,19 +1709,23 @@ _bt_split(Relation rel, Relation heaprel, BTScanInsert itup_key, Buffer buf,
/*
* Acquire a new right page to split into, now that left page has a new
- * high key. From here on, it's not okay to throw an error without
- * zeroing rightpage first. This coding rule ensures that we won't
- * confuse future VACUUM operations, which might otherwise try to re-find
- * a downlink to a leftover junk page as the page undergoes deletion.
+ * high key.
*
- * It would be reasonable to start the critical section just after the new
- * rightpage buffer is acquired instead; that would allow us to avoid
- * leftover junk pages without bothering to zero rightpage. We do it this
- * way because it avoids an unnecessary PANIC when either origpage or its
- * existing sibling page are corrupt.
+ * To not confuse future VACUUM operations, we zero the right page and
+ * work on an in-memory copy of it before writing WAL, then copy its
+ * contents back to the actual page once we start the critical section
+ * work. This simplifies the split work, so as there is no need to zero
+ * the right page before throwing an error.
*/
rbuf = _bt_allocbuf(rel, heaprel);
- rightpage = BufferGetPage(rbuf);
+ rightpage = rightpage_buf.data;
+
+ /*
+ * Copy the contents of the right page into its temporary location, and
+ * zero the original space.
+ */
+ memcpy(rightpage, BufferGetPage(rbuf), BLCKSZ);
+ memset(BufferGetPage(rbuf), 0, BLCKSZ);
rightpagenumber = BufferGetBlockNumber(rbuf);
/* rightpage was initialized by _bt_allocbuf */
ropaque = BTPageGetOpaque(rightpage);
@@ -1768,7 +1774,6 @@ _bt_split(Relation rel, Relation heaprel, BTScanInsert itup_key, Buffer buf,
if (PageAddItem(rightpage, (Item) righthighkey, itemsz, afterrightoff,
false, false) == InvalidOffsetNumber)
{
- memset(rightpage, 0, BufferGetPageSize(rbuf));
elog(ERROR, "failed to add high key to the right sibling"
" while splitting block %u of index \"%s\"",
origpagenumber, RelationGetRelationName(rel));
@@ -1816,7 +1821,6 @@ _bt_split(Relation rel, Relation heaprel, BTScanInsert itup_key, Buffer buf,
if (!_bt_pgaddtup(leftpage, newitemsz, newitem, afterleftoff,
false))
{
- memset(rightpage, 0, BufferGetPageSize(rbuf));
elog(ERROR, "failed to add new item to the left sibling"
" while splitting block %u of index \"%s\"",
origpagenumber, RelationGetRelationName(rel));
@@ -1829,7 +1833,6 @@ _bt_split(Relation rel, Relation heaprel, BTScanInsert itup_key, Buffer buf,
if (!_bt_pgaddtup(rightpage, newitemsz, newitem, afterrightoff,
afterrightoff == minusinfoff))
{
- memset(rightpage, 0, BufferGetPageSize(rbuf));
elog(ERROR, "failed to add new item to the right sibling"
" while splitting block %u of index \"%s\"",
origpagenumber, RelationGetRelationName(rel));
@@ -1843,7 +1846,6 @@ _bt_split(Relation rel, Relation heaprel, BTScanInsert itup_key, Buffer buf,
{
if (!_bt_pgaddtup(leftpage, itemsz, dataitem, afterleftoff, false))
{
- memset(rightpage, 0, BufferGetPageSize(rbuf));
elog(ERROR, "failed to add old item to the left sibling"
" while splitting block %u of index \"%s\"",
origpagenumber, RelationGetRelationName(rel));
@@ -1855,7 +1857,6 @@ _bt_split(Relation rel, Relation heaprel, BTScanInsert itup_key, Buffer buf,
if (!_bt_pgaddtup(rightpage, itemsz, dataitem, afterrightoff,
afterrightoff == minusinfoff))
{
- memset(rightpage, 0, BufferGetPageSize(rbuf));
elog(ERROR, "failed to add old item to the right sibling"
" while splitting block %u of index \"%s\"",
origpagenumber, RelationGetRelationName(rel));
@@ -1876,7 +1877,6 @@ _bt_split(Relation rel, Relation heaprel, BTScanInsert itup_key, Buffer buf,
if (!_bt_pgaddtup(rightpage, newitemsz, newitem, afterrightoff,
afterrightoff == minusinfoff))
{
- memset(rightpage, 0, BufferGetPageSize(rbuf));
elog(ERROR, "failed to add new item to the right sibling"
" while splitting block %u of index \"%s\"",
origpagenumber, RelationGetRelationName(rel));
@@ -1896,7 +1896,6 @@ _bt_split(Relation rel, Relation heaprel, BTScanInsert itup_key, Buffer buf,
sopaque = BTPageGetOpaque(spage);
if (sopaque->btpo_prev != origpagenumber)
{
- memset(rightpage, 0, BufferGetPageSize(rbuf));
ereport(ERROR,
(errcode(ERRCODE_INDEX_CORRUPTED),
errmsg_internal("right sibling's left-link doesn't match: "
@@ -1939,9 +1938,19 @@ _bt_split(Relation rel, Relation heaprel, BTScanInsert itup_key, Buffer buf,
* original. We need to do this before writing the WAL record, so that
* XLogInsert can WAL log an image of the page if necessary.
*/
- PageRestoreTempPage(leftpage, origpage);
+ memcpy(origpage, leftpage, BLCKSZ);
/* leftpage, lopaque must not be used below here */
+ /*
+ * Move the contents of the right page from its temporary location to the
+ * destination buffer, before writing the WAL record. Unlike the left
+ * page, the right page and its opaque area are still needed to complete
+ * the update of the page, so reinitialize them.
+ */
+ rightpage = BufferGetPage(rbuf);
+ memcpy(rightpage, rightpage_buf.data, BLCKSZ);
+ ropaque = BTPageGetOpaque(rightpage);
+
MarkBufferDirty(buf);
MarkBufferDirty(rbuf);
diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c
index 3de5687461c..f4fc17acbe1 100644
--- a/src/backend/commands/publicationcmds.c
+++ b/src/backend/commands/publicationcmds.c
@@ -1855,8 +1855,6 @@ PublicationAddTables(Oid pubid, List *rels, bool if_not_exists,
{
ListCell *lc;
- Assert(!stmt || !stmt->for_all_tables);
-
foreach(lc, rels)
{
PublicationRelInfo *pub_rel = (PublicationRelInfo *) lfirst(lc);
@@ -1934,8 +1932,6 @@ PublicationAddSchemas(Oid pubid, List *schemas, bool if_not_exists,
{
ListCell *lc;
- Assert(!stmt || !stmt->for_all_tables);
-
foreach(lc, schemas)
{
Oid schemaid = lfirst_oid(lc);
diff --git a/src/backend/nls.mk b/src/backend/nls.mk
index b7d5dd46e45..698b1083f4b 100644
--- a/src/backend/nls.mk
+++ b/src/backend/nls.mk
@@ -28,7 +28,7 @@ GETTEXT_FLAGS = $(BACKEND_COMMON_GETTEXT_FLAGS) \
error_cb:2:c-format
gettext-files: generated-parser-sources generated-headers
- find $(srcdir) $(srcdir)/../common $(srcdir)/../port -name '*.c' -print | LC_ALL=C sort >$@
+ find $(srcdir) $(srcdir)/../common $(srcdir)/../port $(srcdir)/../include/ \( -name '*.c' -o -name "proctypelist.h" \) -print | LC_ALL=C sort >$@
my-clean:
rm -f gettext-files
diff --git a/src/backend/postmaster/launch_backend.c b/src/backend/postmaster/launch_backend.c
index 79708e59259..976638a58ac 100644
--- a/src/backend/postmaster/launch_backend.c
+++ b/src/backend/postmaster/launch_backend.c
@@ -179,34 +179,10 @@ typedef struct
} child_process_kind;
static child_process_kind child_process_kinds[] = {
- [B_INVALID] = {"invalid", NULL, false},
-
- [B_BACKEND] = {"backend", BackendMain, true},
- [B_DEAD_END_BACKEND] = {"dead-end backend", BackendMain, true},
- [B_AUTOVAC_LAUNCHER] = {"autovacuum launcher", AutoVacLauncherMain, true},
- [B_AUTOVAC_WORKER] = {"autovacuum worker", AutoVacWorkerMain, true},
- [B_BG_WORKER] = {"bgworker", BackgroundWorkerMain, true},
-
- /*
- * WAL senders start their life as regular backend processes, and change
- * their type after authenticating the client for replication. We list it
- * here for PostmasterChildName() but cannot launch them directly.
- */
- [B_WAL_SENDER] = {"wal sender", NULL, true},
- [B_SLOTSYNC_WORKER] = {"slot sync worker", ReplSlotSyncWorkerMain, true},
-
- [B_STANDALONE_BACKEND] = {"standalone backend", NULL, false},
-
- [B_ARCHIVER] = {"archiver", PgArchiverMain, true},
- [B_BG_WRITER] = {"bgwriter", BackgroundWriterMain, true},
- [B_CHECKPOINTER] = {"checkpointer", CheckpointerMain, true},
- [B_IO_WORKER] = {"io_worker", IoWorkerMain, true},
- [B_STARTUP] = {"startup", StartupProcessMain, true},
- [B_WAL_RECEIVER] = {"wal_receiver", WalReceiverMain, true},
- [B_WAL_SUMMARIZER] = {"wal_summarizer", WalSummarizerMain, true},
- [B_WAL_WRITER] = {"wal_writer", WalWriterMain, true},
-
- [B_LOGGER] = {"syslogger", SysLoggerMain, false},
+#define PG_PROCTYPE(bktype, description, main_func, shmem_attach) \
+ [bktype] = {description, main_func, shmem_attach},
+#include "postmaster/proctypelist.h"
+#undef PG_PROCTYPE
};
const char *
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c
index 545d1e90fbd..fec79992c8d 100644
--- a/src/backend/utils/init/miscinit.c
+++ b/src/backend/utils/init/miscinit.c
@@ -266,62 +266,11 @@ GetBackendTypeDesc(BackendType backendType)
switch (backendType)
{
- case B_INVALID:
- backendDesc = gettext_noop("not initialized");
- break;
- case B_ARCHIVER:
- backendDesc = gettext_noop("archiver");
- break;
- case B_AUTOVAC_LAUNCHER:
- backendDesc = gettext_noop("autovacuum launcher");
- break;
- case B_AUTOVAC_WORKER:
- backendDesc = gettext_noop("autovacuum worker");
- break;
- case B_BACKEND:
- backendDesc = gettext_noop("client backend");
- break;
- case B_DEAD_END_BACKEND:
- backendDesc = gettext_noop("dead-end client backend");
- break;
- case B_BG_WORKER:
- backendDesc = gettext_noop("background worker");
- break;
- case B_BG_WRITER:
- backendDesc = gettext_noop("background writer");
- break;
- case B_CHECKPOINTER:
- backendDesc = gettext_noop("checkpointer");
- break;
- case B_IO_WORKER:
- backendDesc = gettext_noop("io worker");
- break;
- case B_LOGGER:
- backendDesc = gettext_noop("logger");
- break;
- case B_SLOTSYNC_WORKER:
- backendDesc = gettext_noop("slotsync worker");
- break;
- case B_STANDALONE_BACKEND:
- backendDesc = gettext_noop("standalone backend");
- break;
- case B_STARTUP:
- backendDesc = gettext_noop("startup");
- break;
- case B_WAL_RECEIVER:
- backendDesc = gettext_noop("walreceiver");
- break;
- case B_WAL_SENDER:
- backendDesc = gettext_noop("walsender");
- break;
- case B_WAL_SUMMARIZER:
- backendDesc = gettext_noop("walsummarizer");
- break;
- case B_WAL_WRITER:
- backendDesc = gettext_noop("walwriter");
- break;
+#define PG_PROCTYPE(bktype, description, main_func, shmem_attach) \
+ case bktype: backendDesc = description; break;
+#include "postmaster/proctypelist.h"
+#undef PG_PROCTYPE
}
-
return backendDesc;
}