PostgreSQL Source Code  git master
storage_xlog.h File Reference
Include dependency graph for storage_xlog.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  xl_smgr_create
 
struct  xl_smgr_truncate
 

Macros

#define XLOG_SMGR_CREATE   0x10
 
#define XLOG_SMGR_TRUNCATE   0x20
 
#define SMGR_TRUNCATE_HEAP   0x0001
 
#define SMGR_TRUNCATE_VM   0x0002
 
#define SMGR_TRUNCATE_FSM   0x0004
 
#define SMGR_TRUNCATE_ALL    (SMGR_TRUNCATE_HEAP|SMGR_TRUNCATE_VM|SMGR_TRUNCATE_FSM)
 

Typedefs

typedef struct xl_smgr_create xl_smgr_create
 
typedef struct xl_smgr_truncate xl_smgr_truncate
 

Functions

void log_smgrcreate (const RelFileLocator *rlocator, ForkNumber forkNum)
 
void smgr_redo (XLogReaderState *record)
 
void smgr_desc (StringInfo buf, XLogReaderState *record)
 
const char * smgr_identify (uint8 info)
 

Macro Definition Documentation

◆ SMGR_TRUNCATE_ALL

#define SMGR_TRUNCATE_ALL    (SMGR_TRUNCATE_HEAP|SMGR_TRUNCATE_VM|SMGR_TRUNCATE_FSM)

Definition at line 43 of file storage_xlog.h.

◆ SMGR_TRUNCATE_FSM

#define SMGR_TRUNCATE_FSM   0x0004

Definition at line 42 of file storage_xlog.h.

◆ SMGR_TRUNCATE_HEAP

#define SMGR_TRUNCATE_HEAP   0x0001

Definition at line 40 of file storage_xlog.h.

◆ SMGR_TRUNCATE_VM

#define SMGR_TRUNCATE_VM   0x0002

Definition at line 41 of file storage_xlog.h.

◆ XLOG_SMGR_CREATE

#define XLOG_SMGR_CREATE   0x10

Definition at line 30 of file storage_xlog.h.

◆ XLOG_SMGR_TRUNCATE

#define XLOG_SMGR_TRUNCATE   0x20

Definition at line 31 of file storage_xlog.h.

Typedef Documentation

◆ xl_smgr_create

◆ xl_smgr_truncate

Function Documentation

◆ log_smgrcreate()

void log_smgrcreate ( const RelFileLocator rlocator,
ForkNumber  forkNum 
)

Definition at line 186 of file storage.c.

187 {
188  xl_smgr_create xlrec;
189 
190  /*
191  * Make an XLOG entry reporting the file creation.
192  */
193  xlrec.rlocator = *rlocator;
194  xlrec.forkNum = forkNum;
195 
196  XLogBeginInsert();
197  XLogRegisterData((char *) &xlrec, sizeof(xlrec));
199 }
#define XLOG_SMGR_CREATE
Definition: storage_xlog.h:30
ForkNumber forkNum
Definition: storage_xlog.h:36
RelFileLocator rlocator
Definition: storage_xlog.h:35
void XLogRegisterData(char *data, uint32 len)
Definition: xloginsert.c:364
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
Definition: xloginsert.c:474
void XLogBeginInsert(void)
Definition: xloginsert.c:149
#define XLR_SPECIAL_REL_UPDATE
Definition: xlogrecord.h:82

References xl_smgr_create::forkNum, xl_smgr_create::rlocator, XLOG_SMGR_CREATE, XLogBeginInsert(), XLogInsert(), XLogRegisterData(), and XLR_SPECIAL_REL_UPDATE.

Referenced by CreateAndCopyRelationData(), fill_seq_with_data(), heapam_relation_copy_data(), heapam_relation_set_new_filelocator(), index_build(), index_copy_data(), and RelationCreateStorage().

◆ smgr_desc()

void smgr_desc ( StringInfo  buf,
XLogReaderState record 
)

Definition at line 21 of file smgrdesc.c.

22 {
23  char *rec = XLogRecGetData(record);
24  uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
25 
26  if (info == XLOG_SMGR_CREATE)
27  {
28  xl_smgr_create *xlrec = (xl_smgr_create *) rec;
29  char *path = relpathperm(xlrec->rlocator, xlrec->forkNum);
30 
32  pfree(path);
33  }
34  else if (info == XLOG_SMGR_TRUNCATE)
35  {
36  xl_smgr_truncate *xlrec = (xl_smgr_truncate *) rec;
37  char *path = relpathperm(xlrec->rlocator, MAIN_FORKNUM);
38 
39  appendStringInfo(buf, "%s to %u blocks flags %d", path,
40  xlrec->blkno, xlrec->flags);
41  pfree(path);
42  }
43 }
unsigned char uint8
Definition: c.h:504
void pfree(void *pointer)
Definition: mcxt.c:1520
static char * buf
Definition: pg_test_fsync.c:73
@ MAIN_FORKNUM
Definition: relpath.h:50
#define relpathperm(rlocator, forknum)
Definition: relpath.h:90
#define XLOG_SMGR_TRUNCATE
Definition: storage_xlog.h:31
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:97
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:182
RelFileLocator rlocator
Definition: storage_xlog.h:49
BlockNumber blkno
Definition: storage_xlog.h:48
#define XLogRecGetInfo(decoder)
Definition: xlogreader.h:410
#define XLogRecGetData(decoder)
Definition: xlogreader.h:415
#define XLR_INFO_MASK
Definition: xlogrecord.h:62

References appendStringInfo(), appendStringInfoString(), xl_smgr_truncate::blkno, buf, xl_smgr_truncate::flags, xl_smgr_create::forkNum, MAIN_FORKNUM, pfree(), relpathperm, xl_smgr_create::rlocator, xl_smgr_truncate::rlocator, XLOG_SMGR_CREATE, XLOG_SMGR_TRUNCATE, XLogRecGetData, XLogRecGetInfo, and XLR_INFO_MASK.

◆ smgr_identify()

const char* smgr_identify ( uint8  info)

Definition at line 46 of file smgrdesc.c.

47 {
48  const char *id = NULL;
49 
50  switch (info & ~XLR_INFO_MASK)
51  {
52  case XLOG_SMGR_CREATE:
53  id = "CREATE";
54  break;
55  case XLOG_SMGR_TRUNCATE:
56  id = "TRUNCATE";
57  break;
58  }
59 
60  return id;
61 }

References XLOG_SMGR_CREATE, XLOG_SMGR_TRUNCATE, and XLR_INFO_MASK.

◆ smgr_redo()

void smgr_redo ( XLogReaderState record)

Definition at line 940 of file storage.c.

941 {
942  XLogRecPtr lsn = record->EndRecPtr;
943  uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
944 
945  /* Backup blocks are not used in smgr records */
946  Assert(!XLogRecHasAnyBlockRefs(record));
947 
948  if (info == XLOG_SMGR_CREATE)
949  {
950  xl_smgr_create *xlrec = (xl_smgr_create *) XLogRecGetData(record);
951  SMgrRelation reln;
952 
953  reln = smgropen(xlrec->rlocator, INVALID_PROC_NUMBER);
954  smgrcreate(reln, xlrec->forkNum, true);
955  }
956  else if (info == XLOG_SMGR_TRUNCATE)
957  {
958  xl_smgr_truncate *xlrec = (xl_smgr_truncate *) XLogRecGetData(record);
959  SMgrRelation reln;
960  Relation rel;
961  ForkNumber forks[MAX_FORKNUM];
962  BlockNumber blocks[MAX_FORKNUM];
963  int nforks = 0;
964  bool need_fsm_vacuum = false;
965 
966  reln = smgropen(xlrec->rlocator, INVALID_PROC_NUMBER);
967 
968  /*
969  * Forcibly create relation if it doesn't exist (which suggests that
970  * it was dropped somewhere later in the WAL sequence). As in
971  * XLogReadBufferForRedo, we prefer to recreate the rel and replay the
972  * log as best we can until the drop is seen.
973  */
974  smgrcreate(reln, MAIN_FORKNUM, true);
975 
976  /*
977  * Before we perform the truncation, update minimum recovery point to
978  * cover this WAL record. Once the relation is truncated, there's no
979  * going back. The buffer manager enforces the WAL-first rule for
980  * normal updates to relation files, so that the minimum recovery
981  * point is always updated before the corresponding change in the data
982  * file is flushed to disk. We have to do the same manually here.
983  *
984  * Doing this before the truncation means that if the truncation fails
985  * for some reason, you cannot start up the system even after restart,
986  * until you fix the underlying situation so that the truncation will
987  * succeed. Alternatively, we could update the minimum recovery point
988  * after truncation, but that would leave a small window where the
989  * WAL-first rule could be violated.
990  */
991  XLogFlush(lsn);
992 
993  /* Prepare for truncation of MAIN fork */
994  if ((xlrec->flags & SMGR_TRUNCATE_HEAP) != 0)
995  {
996  forks[nforks] = MAIN_FORKNUM;
997  blocks[nforks] = xlrec->blkno;
998  nforks++;
999 
1000  /* Also tell xlogutils.c about it */
1002  }
1003 
1004  /* Prepare for truncation of FSM and VM too */
1005  rel = CreateFakeRelcacheEntry(xlrec->rlocator);
1006 
1007  if ((xlrec->flags & SMGR_TRUNCATE_FSM) != 0 &&
1008  smgrexists(reln, FSM_FORKNUM))
1009  {
1010  blocks[nforks] = FreeSpaceMapPrepareTruncateRel(rel, xlrec->blkno);
1011  if (BlockNumberIsValid(blocks[nforks]))
1012  {
1013  forks[nforks] = FSM_FORKNUM;
1014  nforks++;
1015  need_fsm_vacuum = true;
1016  }
1017  }
1018  if ((xlrec->flags & SMGR_TRUNCATE_VM) != 0 &&
1020  {
1021  blocks[nforks] = visibilitymap_prepare_truncate(rel, xlrec->blkno);
1022  if (BlockNumberIsValid(blocks[nforks]))
1023  {
1024  forks[nforks] = VISIBILITYMAP_FORKNUM;
1025  nforks++;
1026  }
1027  }
1028 
1029  /* Do the real work to truncate relation forks */
1030  if (nforks > 0)
1031  smgrtruncate(reln, forks, nforks, blocks);
1032 
1033  /*
1034  * Update upper-level FSM pages to account for the truncation. This is
1035  * important because the just-truncated pages were likely marked as
1036  * all-free, and would be preferentially selected.
1037  */
1038  if (need_fsm_vacuum)
1039  FreeSpaceMapVacuumRange(rel, xlrec->blkno,
1041 
1042  FreeFakeRelcacheEntry(rel);
1043  }
1044  else
1045  elog(PANIC, "smgr_redo: unknown op code %u", info);
1046 }
uint32 BlockNumber
Definition: block.h:31
#define InvalidBlockNumber
Definition: block.h:33
static bool BlockNumberIsValid(BlockNumber blockNumber)
Definition: block.h:71
#define Assert(condition)
Definition: c.h:858
#define PANIC
Definition: elog.h:42
#define elog(elevel,...)
Definition: elog.h:224
void FreeSpaceMapVacuumRange(Relation rel, BlockNumber start, BlockNumber end)
Definition: freespace.c:377
BlockNumber FreeSpaceMapPrepareTruncateRel(Relation rel, BlockNumber nblocks)
Definition: freespace.c:275
#define INVALID_PROC_NUMBER
Definition: procnumber.h:26
ForkNumber
Definition: relpath.h:48
@ FSM_FORKNUM
Definition: relpath.h:51
@ VISIBILITYMAP_FORKNUM
Definition: relpath.h:52
#define MAX_FORKNUM
Definition: relpath.h:62
SMgrRelation smgropen(RelFileLocator rlocator, ProcNumber backend)
Definition: smgr.c:198
void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo)
Definition: smgr.c:411
void smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, BlockNumber *nblocks)
Definition: smgr.c:703
bool smgrexists(SMgrRelation reln, ForkNumber forknum)
Definition: smgr.c:398
#define SMGR_TRUNCATE_VM
Definition: storage_xlog.h:41
#define SMGR_TRUNCATE_HEAP
Definition: storage_xlog.h:40
#define SMGR_TRUNCATE_FSM
Definition: storage_xlog.h:42
XLogRecPtr EndRecPtr
Definition: xlogreader.h:207
BlockNumber visibilitymap_prepare_truncate(Relation rel, BlockNumber nheapblocks)
void XLogFlush(XLogRecPtr record)
Definition: xlog.c:2791
uint64 XLogRecPtr
Definition: xlogdefs.h:21
#define XLogRecHasAnyBlockRefs(decoder)
Definition: xlogreader.h:417
void FreeFakeRelcacheEntry(Relation fakerel)
Definition: xlogutils.c:629
void XLogTruncateRelation(RelFileLocator rlocator, ForkNumber forkNum, BlockNumber nblocks)
Definition: xlogutils.c:671
Relation CreateFakeRelcacheEntry(RelFileLocator rlocator)
Definition: xlogutils.c:582

References Assert, xl_smgr_truncate::blkno, BlockNumberIsValid(), CreateFakeRelcacheEntry(), elog, XLogReaderState::EndRecPtr, xl_smgr_truncate::flags, xl_smgr_create::forkNum, FreeFakeRelcacheEntry(), FreeSpaceMapPrepareTruncateRel(), FreeSpaceMapVacuumRange(), FSM_FORKNUM, INVALID_PROC_NUMBER, InvalidBlockNumber, MAIN_FORKNUM, MAX_FORKNUM, PANIC, xl_smgr_create::rlocator, xl_smgr_truncate::rlocator, SMGR_TRUNCATE_FSM, SMGR_TRUNCATE_HEAP, SMGR_TRUNCATE_VM, smgrcreate(), smgrexists(), smgropen(), smgrtruncate(), VISIBILITYMAP_FORKNUM, visibilitymap_prepare_truncate(), XLOG_SMGR_CREATE, XLOG_SMGR_TRUNCATE, XLogFlush(), XLogRecGetData, XLogRecGetInfo, XLogRecHasAnyBlockRefs, XLogTruncateRelation(), and XLR_INFO_MASK.