73 #define RELMAPPER_FILENAME "pg_filenode.map" 75 #define RELMAPPER_FILEMAGIC 0x592717 77 #define MAX_MAPPINGS 62 141 bool write_wal,
bool send_sinval,
bool preserve_files,
142 Oid dbid,
Oid tsid,
const char *dbpath);
284 elog(
ERROR,
"cannot change relation mapping within subtransaction");
287 elog(
ERROR,
"cannot change relation mapping in parallel mode");
335 elog(
ERROR,
"attempt to apply a mapping to unmapped relation %u",
338 elog(
ERROR,
"ran out of space in relation map");
388 elog(
ERROR,
"could not find temporary mapping for relation %u",
444 &pending_shared_updates,
451 &pending_local_updates,
478 if (isCommit && !isParallelWorker)
530 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
531 errmsg(
"cannot PREPARE a transaction that modified relation mapping")));
587 shared_map.
magic = 0;
682 elog(
ERROR,
"parallel worker has existing mappings");
708 snprintf(mapfilename,
sizeof(mapfilename),
"global/%s",
714 snprintf(mapfilename,
sizeof(mapfilename),
"%s/%s",
724 errmsg(
"could not open file \"%s\": %m",
741 errmsg(
"could not read file \"%s\": %m", mapfilename)));
745 errmsg(
"could not read file \"%s\": read %d of %zu",
753 errmsg(
"could not close file \"%s\": %m",
761 (
errmsg(
"relation mapping file \"%s\" contains invalid data",
771 (
errmsg(
"relation mapping file \"%s\" contains incorrect checksum",
797 bool write_wal,
bool send_sinval,
bool preserve_files,
798 Oid dbid,
Oid tsid,
const char *dbpath)
809 elog(
ERROR,
"attempt to write bogus relation mapping");
821 snprintf(mapfilename,
sizeof(mapfilename),
"global/%s",
827 snprintf(mapfilename,
sizeof(mapfilename),
"%s/%s",
836 errmsg(
"could not open file \"%s\": %m",
870 errmsg(
"could not write file \"%s\": %m",
885 errmsg(
"could not fsync file \"%s\": %m",
892 errmsg(
"could not close file \"%s\": %m",
920 for (i = 0; i < newmap->num_mappings; i++)
926 rnode.
relNode = newmap->mappings[
i].mapfilenode;
936 if (realmap != newmap)
976 memcpy(&newmap, &shared_map,
sizeof(
RelMapFile));
978 memcpy(&newmap, &local_map,
sizeof(
RelMapFile));
1014 elog(
PANIC,
"relmap_redo: wrong size %u in relmap update record",
1016 memcpy(&newmap, xlrec->
data,
sizeof(newmap));
1037 elog(
PANIC,
"relmap_redo: unknown op code %u", info);
struct RelMapping RelMapping
void RelationPreserveStorage(RelFileNode rnode, bool atCommit)
void RelationMapFinishBootstrap(void)
void RelationMapInitialize(void)
static void merge_map_updates(RelMapFile *map, const RelMapFile *updates, bool add_okay)
void RelationMapInitializePhase2(void)
static RelMapFile local_map
#define END_CRIT_SECTION()
#define MinSizeOfRelmapUpdate
struct SerializedActiveRelMaps SerializedActiveRelMaps
void AtPrepare_RelationMap(void)
#define START_CRIT_SECTION()
int errcode(int sqlerrcode)
void CacheInvalidateRelmap(Oid databaseId)
static void write_relmap_file(bool shared, RelMapFile *newmap, bool write_wal, bool send_sinval, bool preserve_files, Oid dbid, Oid tsid, const char *dbpath)
void RelationMapInvalidate(bool shared)
void XLogFlush(XLogRecPtr record)
static int fd(const char *x, int i)
static RelMapFile pending_shared_updates
void LWLockRelease(LWLock *lock)
#define RELMAPPER_FILEMAGIC
void pfree(void *pointer)
bool IsInParallelMode(void)
#define XLogRecGetData(decoder)
static RelMapFile shared_map
int OpenTransientFile(const char *fileName, int fileFlags)
static void perform_relmap_update(bool shared, const RelMapFile *updates)
static RelMapFile active_local_updates
void AtCCI_RelationMap(void)
static RelMapFile pending_local_updates
int errcode_for_file_access(void)
void SerializeRelationMap(Size maxSize, char *startAddress)
RelMapping mappings[MAX_MAPPINGS]
static void pgstat_report_wait_end(void)
#define EQ_CRC32C(c1, c2)
#define XLogRecGetInfo(decoder)
char * GetDatabasePath(Oid dbNode, Oid spcNode)
#define RELMAPPER_FILENAME
static RelMapFile active_shared_updates
#define ERRCODE_DATA_CORRUPTED
static void load_relmap_file(bool shared)
int CloseTransientFile(int fd)
void XLogRegisterData(char *data, int len)
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
#define XLOG_RELMAP_UPDATE
Oid RelationMapOidToFilenode(Oid relationId, bool shared)
int data_sync_elevel(int elevel)
void relmap_redo(XLogReaderState *record)
bool allowSystemTableMods
RelMapFile active_shared_updates
#define ereport(elevel,...)
Oid RelationMapFilenodeToOid(Oid filenode, bool shared)
int GetCurrentTransactionNestLevel(void)
#define Assert(condition)
void RelationMapRemoveMapping(Oid relationId)
static void pgstat_report_wait_start(uint32 wait_event_info)
void AtEOXact_RelationMap(bool isCommit, bool isParallelWorker)
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
void CheckPointRelationMap(void)
Size EstimateRelationMapSpace(void)
#define IsBootstrapProcessingMode()
int errmsg(const char *fmt,...)
void RelationMapInvalidateAll(void)
void RestoreRelationMap(char *startAddress)
void RelationMapInitializePhase3(void)
#define XLogRecHasAnyBlockRefs(decoder)
RelMapFile active_local_updates
struct RelMapFile RelMapFile
#define COMP_CRC32C(crc, data, len)
void XLogBeginInsert(void)
char data[FLEXIBLE_ARRAY_MEMBER]
#define offsetof(type, field)
void RelationMapUpdateMap(Oid relationId, Oid fileNode, bool shared, bool immediate)
static void apply_map_update(RelMapFile *map, Oid relationId, Oid fileNode, bool add_okay)