diff --git a/datapagemap.h b/datapagemap.h index 455705f..9b730da 100644 --- a/datapagemap.h +++ b/datapagemap.h @@ -9,7 +9,6 @@ #ifndef DATAPAGEMAP_H #define DATAPAGEMAP_H -#include "storage/relfilenode.h" #include "storage/block.h" struct datapagemap diff --git a/engine.c b/engine.c index ff4588e..2cd1908 100644 --- a/engine.c +++ b/engine.c @@ -516,22 +516,22 @@ ptrack_mark_file(Oid dbOid, Oid tablespaceOid, /* Mark of non-temporary relation */ rnode.backend = InvalidBackendId; - rnode.node.dbNode = dbOid; - rnode.node.spcNode = tablespaceOid; + nodeDb(nodeOf(rnode)) = dbOid; + nodeSpc(nodeOf(rnode)) = tablespaceOid; if (!parse_filename_for_nontemp_relation(filename, &oidchars, &forknum)) return; memcpy(oidbuf, filename, oidchars); oidbuf[oidchars] = '\0'; - rnode.node.relNode = atooid(oidbuf); + nodeRel(nodeOf(rnode)) = atooid(oidbuf); /* Compute number of blocks based on file size */ if (stat(filepath, &stat_buf) == 0) nblocks = stat_buf.st_size / BLCKSZ; elog(DEBUG1, "ptrack_mark_file %s, nblocks %u rnode db %u spc %u rel %u, forknum %d", - filepath, nblocks, rnode.node.dbNode, rnode.node.spcNode, rnode.node.relNode, forknum); + filepath, nblocks, nodeDb(nodeOf(rnode)), nodeSpc(nodeOf(rnode)), nodeRel(nodeOf(rnode)), forknum); for (blkno = 0; blkno < nblocks; blkno++) ptrack_mark_block(rnode, forknum, blkno); @@ -612,7 +612,7 @@ ptrack_mark_block(RelFileNodeBackend smgr_rnode, * relations */ return; - bid.relnode = smgr_rnode.node; + bid.relnode = nodeOf(smgr_rnode); bid.forknum = forknum; bid.blocknum = blocknum; diff --git a/patches/master-ptrack-core.diff b/patches/master-ptrack-core.diff index 20316e5..f1371a6 100644 --- a/patches/master-ptrack-core.diff +++ b/patches/master-ptrack-core.diff @@ -1,7 +1,7 @@ -diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c -index 5244823ff85..160889b4a04 100644 ---- a/src/backend/replication/basebackup.c -+++ b/src/backend/replication/basebackup.c +diff --git a/src/backend/backup/basebackup.c b/src/backend/backup/basebackup.c +index 715428029b3..81f3218540a 100644 +--- a/src/backend/backup/basebackup.c ++++ b/src/backend/backup/basebackup.c @@ -197,6 +197,13 @@ static const struct exclude_list_item excludeFiles[] = {"postmaster.pid", false}, {"postmaster.opts", false}, @@ -52,7 +52,7 @@ index 658fd95ba95..eee38eba176 100644 * Be paranoid here and fsync all files to ensure the copy is really done. * But if fsync is disabled, we're done. diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c -index 43edaf5d873..bbaf7500944 100644 +index 3deac496eed..07c4ee2ba03 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -87,6 +87,8 @@ typedef struct _MdfdVec @@ -63,29 +63,29 @@ index 43edaf5d873..bbaf7500944 100644 +mdwrite_hook_type mdwrite_hook = NULL; /* Populate a file tag describing an md.c segment file. */ - #define INIT_MD_FILETAG(a,xx_rnode,xx_forknum,xx_segno) \ -@@ -467,6 +469,9 @@ mdextend(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, + #define INIT_MD_FILETAG(a,xx_rlocator,xx_forknum,xx_segno) \ +@@ -484,6 +486,9 @@ mdextend(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, register_dirty_segment(reln, forknum, v); Assert(_mdnblocks(reln, forknum, v) <= ((BlockNumber) RELSEG_SIZE)); + + if (mdextend_hook) -+ mdextend_hook(reln->smgr_rnode, forknum, blocknum); ++ mdextend_hook(reln->smgr_rlocator, forknum, blocknum); } /* -@@ -756,6 +761,9 @@ mdwrite(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, +@@ -773,6 +778,9 @@ mdwrite(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, if (!skipFsync && !SmgrIsTemp(reln)) register_dirty_segment(reln, forknum, v); + + if (mdwrite_hook) -+ mdwrite_hook(reln->smgr_rnode, forknum, blocknum); ++ mdwrite_hook(reln->smgr_rlocator, forknum, blocknum); } /* diff --git a/src/backend/storage/sync/sync.c b/src/backend/storage/sync/sync.c -index e1fb6310038..76d75680b31 100644 +index 9d6a9e91090..990d0722229 100644 --- a/src/backend/storage/sync/sync.c +++ b/src/backend/storage/sync/sync.c @@ -81,6 +81,8 @@ static MemoryContext pendingOpsCxt; /* context for the above */ @@ -108,7 +108,7 @@ index e1fb6310038..76d75680b31 100644 sync_in_progress = false; } diff --git a/src/bin/pg_checksums/pg_checksums.c b/src/bin/pg_checksums/pg_checksums.c -index 21dfe1b6ee5..266ac1ef40a 100644 +index 324ccf77834..e82cae5f325 100644 --- a/src/bin/pg_checksums/pg_checksums.c +++ b/src/bin/pg_checksums/pg_checksums.c @@ -118,6 +118,11 @@ static const struct exclude_list_item skip[] = { @@ -186,7 +186,7 @@ index d4772a29650..3318f64359d 100644 /* * Write an empty XLOG file, containing only the checkpoint record diff --git a/src/bin/pg_rewind/filemap.c b/src/bin/pg_rewind/filemap.c -index 62529310415..b496f54fb06 100644 +index 269ed6446e6..6318a8c1f55 100644 --- a/src/bin/pg_rewind/filemap.c +++ b/src/bin/pg_rewind/filemap.c @@ -157,6 +157,10 @@ static const struct exclude_list_item excludeFiles[] = @@ -228,17 +228,17 @@ index 50a26edeb06..af1602f5154 100644 extern void copy_file(char *fromfile, char *tofile); diff --git a/src/include/storage/md.h b/src/include/storage/md.h -index ffffa40db71..3ff98e0bf01 100644 +index 10aa1b0109b..1415675824e 100644 --- a/src/include/storage/md.h +++ b/src/include/storage/md.h @@ -19,6 +19,13 @@ #include "storage/smgr.h" #include "storage/sync.h" -+typedef void (*mdextend_hook_type) (RelFileNodeBackend smgr_rnode, ++typedef void (*mdextend_hook_type) (RelFileLocatorBackend smgr_rlocator, + ForkNumber forknum, BlockNumber blocknum); +extern PGDLLIMPORT mdextend_hook_type mdextend_hook; -+typedef void (*mdwrite_hook_type) (RelFileNodeBackend smgr_rnode, ++typedef void (*mdwrite_hook_type) (RelFileLocatorBackend smgr_rlocator, + ForkNumber forknum, BlockNumber blocknum); +extern PGDLLIMPORT mdwrite_hook_type mdwrite_hook; + @@ -246,7 +246,7 @@ index ffffa40db71..3ff98e0bf01 100644 extern void mdinit(void); extern void mdopen(SMgrRelation reln); diff --git a/src/include/storage/sync.h b/src/include/storage/sync.h -index 9737e1eb67c..914ad86328f 100644 +index 049af878dec..7689d49a24e 100644 --- a/src/include/storage/sync.h +++ b/src/include/storage/sync.h @@ -55,6 +55,9 @@ typedef struct FileTag diff --git a/ptrack.c b/ptrack.c index c81eb17..d0cbb4a 100644 --- a/ptrack.c +++ b/ptrack.c @@ -38,8 +38,9 @@ #include "nodes/pg_list.h" #ifdef PGPRO_EE /* For file_is_in_cfs_tablespace() only. */ -#include "replication/basebackup.h" +#include "common/cfs_common.h" #endif +#include "port/pg_crc32c.h" #include "storage/copydir.h" #include "storage/ipc.h" #include "storage/lmgr.h" @@ -53,8 +54,8 @@ #include "utils/pg_lsn.h" #include "datapagemap.h" -#include "engine.h" #include "ptrack.h" +#include "engine.h" PG_MODULE_MAGIC; @@ -356,16 +357,16 @@ ptrack_gather_filelist(List **filelist, char *path, Oid spcOid, Oid dbOid) memcpy(oidbuf, de->d_name, oidchars); oidbuf[oidchars] = '\0'; - pfl->relnode.relNode = atooid(oidbuf); - pfl->relnode.dbNode = dbOid; - pfl->relnode.spcNode = spcOid == InvalidOid ? DEFAULTTABLESPACE_OID : spcOid; - pfl->path = GetRelationPath(dbOid, pfl->relnode.spcNode, - pfl->relnode.relNode, InvalidBackendId, pfl->forknum); + nodeRel(pfl->relnode) = atooid(oidbuf); + nodeDb(pfl->relnode) = dbOid; + nodeSpc(pfl->relnode) = spcOid == InvalidOid ? DEFAULTTABLESPACE_OID : spcOid; + pfl->path = GetRelationPath(dbOid, nodeSpc(pfl->relnode), + nodeRel(pfl->relnode), InvalidBackendId, pfl->forknum); *filelist = lappend(*filelist, pfl); elog(DEBUG3, "ptrack: added file %s of rel %u to file list", - pfl->path, pfl->relnode.relNode); + pfl->path, nodeRel(pfl->relnode)); } } else if (S_ISDIR(fst.st_mode)) @@ -426,9 +427,9 @@ ptrack_filelist_getnext(PtScanCtx * ctx) ctx->relpath = pfl->path; } - ctx->bid.relnode.spcNode = pfl->relnode.spcNode; - ctx->bid.relnode.dbNode = pfl->relnode.dbNode; - ctx->bid.relnode.relNode = pfl->relnode.relNode; + nodeSpc(ctx->bid.relnode) = nodeSpc(pfl->relnode); + nodeDb(ctx->bid.relnode) = nodeDb(pfl->relnode); + nodeRel(ctx->bid.relnode) = nodeRel(pfl->relnode); ctx->bid.forknum = pfl->forknum; ctx->bid.blocknum = 0; diff --git a/ptrack.h b/ptrack.h index a5c1f01..e42bfb8 100644 --- a/ptrack.h +++ b/ptrack.h @@ -18,7 +18,11 @@ #include "access/xlogdefs.h" #include "storage/block.h" #include "storage/buf.h" +#if PG_VERSION_NUM >= 160000 +#include "storage/relfilelocator.h" +#else #include "storage/relfilenode.h" +#endif #include "storage/smgr.h" #include "utils/relcache.h" @@ -29,6 +33,20 @@ /* Last ptrack version that changed map file format */ #define PTRACK_MAP_FILE_VERSION_NUM 220 +#if PG_VERSION_NUM >= 160000 +#define RelFileNode RelFileLocator +#define RelFileNodeBackend RelFileLocatorBackend +#define nodeDb(node) (node).dbOid +#define nodeSpc(node) (node).spcOid +#define nodeRel(node) (node).relNumber +#define nodeOf(ndbck) (ndbck).locator +#else +#define nodeDb(node) (node).dbNode +#define nodeSpc(node) (node).spcNode +#define nodeRel(node) (node).relNode +#define nodeOf(ndbck) (ndbck).node +#endif + /* * Structure identifying block on the disk. */