From 78b1e22f67020f20215a17f12abb5d493d8b16f4 Mon Sep 17 00:00:00 2001 From: Dilip Kumar Date: Thu, 28 Jul 2022 14:20:04 +0530 Subject: [PATCH v14 1/3] Fixup:Oid to RelfileNumber In commit b0a55e43299c4ea2a9a8c757f9c26352407d0ccc, some of the Oid references got missed where it should have been renamed to relfilenumber. --- src/backend/commands/dbcommands.c | 4 ++-- src/backend/commands/tablespace.c | 3 ++- src/backend/replication/basebackup.c | 13 +++++----- src/backend/storage/file/reinit.c | 46 ++++++++++++++++++------------------ src/include/common/relpath.h | 3 +++ src/include/storage/reinit.h | 3 ++- 6 files changed, 39 insertions(+), 33 deletions(-) diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index 099d369..d09168d 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -250,7 +250,7 @@ ScanSourceDatabasePgClass(Oid tbid, Oid dbid, char *srcpath) BlockNumber nblocks; BlockNumber blkno; Buffer buf; - Oid relfilenumber; + RelFileNumber relfilenumber; Page page; List *rlocatorlist = NIL; LockRelId relid; @@ -397,7 +397,7 @@ ScanSourceDatabasePgClassTuple(HeapTupleData *tuple, Oid tbid, Oid dbid, { CreateDBRelInfo *relinfo; Form_pg_class classForm; - Oid relfilenumber = InvalidRelFileNumber; + RelFileNumber relfilenumber = InvalidRelFileNumber; classForm = (Form_pg_class) GETSTRUCT(tuple); diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c index cb7d460..66edc64 100644 --- a/src/backend/commands/tablespace.c +++ b/src/backend/commands/tablespace.c @@ -290,7 +290,8 @@ CreateTableSpace(CreateTableSpaceStmt *stmt) * parts. */ if (strlen(location) + 1 + strlen(TABLESPACE_VERSION_DIRECTORY) + 1 + - OIDCHARS + 1 + OIDCHARS + 1 + FORKNAMECHARS + 1 + OIDCHARS > MAXPGPATH) + OIDCHARS + 1 + RELNUMBERCHARS + 1 + FORKNAMECHARS + 1 + OIDCHARS > + MAXPGPATH) ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("tablespace location \"%s\" is too long", diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index 637c0ce..4de249b 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -1172,7 +1172,8 @@ sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly, int excludeIdx; bool excludeFound; ForkNumber relForkNum; /* Type of fork if file is a relation */ - int relOidChars; /* Chars in filename that are the rel oid */ + int relnumchars; /* Chars in filename that are the + * relnumber */ /* Skip special stuff */ if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) @@ -1222,23 +1223,23 @@ sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly, /* Exclude all forks for unlogged tables except the init fork */ if (isDbDir && - parse_filename_for_nontemp_relation(de->d_name, &relOidChars, + parse_filename_for_nontemp_relation(de->d_name, &relnumchars, &relForkNum)) { /* Never exclude init forks */ if (relForkNum != INIT_FORKNUM) { char initForkFile[MAXPGPATH]; - char relOid[OIDCHARS + 1]; + char relNumber[RELNUMBERCHARS + 1]; /* * If any other type of fork, check if there is an init fork * with the same OID. If so, the file can be excluded. */ - memcpy(relOid, de->d_name, relOidChars); - relOid[relOidChars] = '\0'; + memcpy(relNumber, de->d_name, relnumchars); + relNumber[relnumchars] = '\0'; snprintf(initForkFile, sizeof(initForkFile), "%s/%s_init", - path, relOid); + path, relNumber); if (lstat(initForkFile, &statbuf) == 0) { diff --git a/src/backend/storage/file/reinit.c b/src/backend/storage/file/reinit.c index f053fe0..a4bae7c 100644 --- a/src/backend/storage/file/reinit.c +++ b/src/backend/storage/file/reinit.c @@ -195,11 +195,11 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op) while ((de = ReadDir(dbspace_dir, dbspacedirname)) != NULL) { ForkNumber forkNum; - int oidchars; + int relnumchars; unlogged_relation_entry ent; /* Skip anything that doesn't look like a relation data file. */ - if (!parse_filename_for_nontemp_relation(de->d_name, &oidchars, + if (!parse_filename_for_nontemp_relation(de->d_name, &relnumchars, &forkNum)) continue; @@ -235,11 +235,11 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op) while ((de = ReadDir(dbspace_dir, dbspacedirname)) != NULL) { ForkNumber forkNum; - int oidchars; + int relnumchars; unlogged_relation_entry ent; /* Skip anything that doesn't look like a relation data file. */ - if (!parse_filename_for_nontemp_relation(de->d_name, &oidchars, + if (!parse_filename_for_nontemp_relation(de->d_name, &relnumchars, &forkNum)) continue; @@ -285,13 +285,13 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op) while ((de = ReadDir(dbspace_dir, dbspacedirname)) != NULL) { ForkNumber forkNum; - int oidchars; - char oidbuf[OIDCHARS + 1]; + int relnumchars; + char relnumbuf[RELNUMBERCHARS + 1]; char srcpath[MAXPGPATH * 2]; char dstpath[MAXPGPATH]; /* Skip anything that doesn't look like a relation data file. */ - if (!parse_filename_for_nontemp_relation(de->d_name, &oidchars, + if (!parse_filename_for_nontemp_relation(de->d_name, &relnumchars, &forkNum)) continue; @@ -304,10 +304,10 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op) dbspacedirname, de->d_name); /* Construct destination pathname. */ - memcpy(oidbuf, de->d_name, oidchars); - oidbuf[oidchars] = '\0'; + memcpy(relnumbuf, de->d_name, relnumchars); + relnumbuf[relnumchars] = '\0'; snprintf(dstpath, sizeof(dstpath), "%s/%s%s", - dbspacedirname, oidbuf, de->d_name + oidchars + 1 + + dbspacedirname, relnumbuf, de->d_name + relnumchars + 1 + strlen(forkNames[INIT_FORKNUM])); /* OK, we're ready to perform the actual copy. */ @@ -328,12 +328,12 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op) while ((de = ReadDir(dbspace_dir, dbspacedirname)) != NULL) { ForkNumber forkNum; - int oidchars; - char oidbuf[OIDCHARS + 1]; + int relnumchars; + char relnumbuf[RELNUMBERCHARS + 1]; char mainpath[MAXPGPATH]; /* Skip anything that doesn't look like a relation data file. */ - if (!parse_filename_for_nontemp_relation(de->d_name, &oidchars, + if (!parse_filename_for_nontemp_relation(de->d_name, &relnumchars, &forkNum)) continue; @@ -342,10 +342,10 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op) continue; /* Construct main fork pathname. */ - memcpy(oidbuf, de->d_name, oidchars); - oidbuf[oidchars] = '\0'; + memcpy(relnumbuf, de->d_name, relnumchars); + relnumbuf[relnumchars] = '\0'; snprintf(mainpath, sizeof(mainpath), "%s/%s%s", - dbspacedirname, oidbuf, de->d_name + oidchars + 1 + + dbspacedirname, relnumbuf, de->d_name + relnumchars + 1 + strlen(forkNames[INIT_FORKNUM])); fsync_fname(mainpath, false); @@ -372,13 +372,13 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op) * for a non-temporary relation and false otherwise. * * NB: If this function returns true, the caller is entitled to assume that - * *oidchars has been set to the a value no more than OIDCHARS, and thus - * that a buffer of OIDCHARS+1 characters is sufficient to hold the OID - * portion of the filename. This is critical to protect against a possible - * buffer overrun. + * *relnumchars has been set to a value no more than RELNUMBERCHARS, and thus + * that a buffer of RELNUMBERCHARS+1 characters is sufficient to hold the + * RelFileNumber portion of the filename. This is critical to protect against + * a possible buffer overrun. */ bool -parse_filename_for_nontemp_relation(const char *name, int *oidchars, +parse_filename_for_nontemp_relation(const char *name, int *relnumchars, ForkNumber *fork) { int pos; @@ -386,9 +386,9 @@ parse_filename_for_nontemp_relation(const char *name, int *oidchars, /* Look for a non-empty string of digits (that isn't too long). */ for (pos = 0; isdigit((unsigned char) name[pos]); ++pos) ; - if (pos == 0 || pos > OIDCHARS) + if (pos == 0 || pos > RELNUMBERCHARS) return false; - *oidchars = pos; + *relnumchars = pos; /* Check for a fork name. */ if (name[pos] != '_') diff --git a/src/include/common/relpath.h b/src/include/common/relpath.h index 3ab7132..785c3f6 100644 --- a/src/include/common/relpath.h +++ b/src/include/common/relpath.h @@ -29,6 +29,9 @@ /* Characters to allow for an OID in a relation path */ #define OIDCHARS 10 /* max chars printed by %u */ +/* Characters to allow for an RelFileNumber in a relation path */ +#define RELNUMBERCHARS OIDCHARS /* same as OIDCHARS */ + /* * Stuff for fork names. * diff --git a/src/include/storage/reinit.h b/src/include/storage/reinit.h index bf2c10d..b990d28 100644 --- a/src/include/storage/reinit.h +++ b/src/include/storage/reinit.h @@ -20,7 +20,8 @@ extern void ResetUnloggedRelations(int op); extern bool parse_filename_for_nontemp_relation(const char *name, - int *oidchars, ForkNumber *fork); + int *relnumchars, + ForkNumber *fork); #define UNLOGGED_RELATION_CLEANUP 0x0001 #define UNLOGGED_RELATION_INIT 0x0002 -- 1.8.3.1