Use fork names instead of numbers in the file names for additional
authorHeikki Linnakangas <[email protected]>
Mon, 6 Oct 2008 14:13:17 +0000 (14:13 +0000)
committerHeikki Linnakangas <[email protected]>
Mon, 6 Oct 2008 14:13:17 +0000 (14:13 +0000)
relation forks. While the file names are not visible to users, for those
that do peek into the data directory, it's nice to have more descriptive
names. Per Greg Stark's suggestion.

contrib/pageinspect/pageinspect.sql.in
contrib/pageinspect/rawpage.c
doc/src/sgml/pageinspect.sgml
doc/src/sgml/storage.sgml
src/backend/catalog/catalog.c
src/backend/utils/adt/dbsize.c
src/include/catalog/catalog.h
src/include/catalog/catversion.h
src/include/storage/relfilenode.h

index c297d7c1d13a4d7fe5775b76b23299d1103d74c3..e320bec7e2e110fc5a63b9915e95ec3b422387d6 100644 (file)
@@ -6,14 +6,14 @@ SET search_path = public;
 --
 -- get_raw_page()
 --
-CREATE OR REPLACE FUNCTION get_raw_page(text, int4, int4)
+CREATE OR REPLACE FUNCTION get_raw_page(text, text, int4)
 RETURNS bytea
 AS 'MODULE_PATHNAME', 'get_raw_page'
 LANGUAGE C STRICT;
 
 CREATE OR REPLACE FUNCTION get_raw_page(text, int4) 
 RETURNS bytea
-AS $$ SELECT get_raw_page($1, 0, $2); $$
+AS $$ SELECT get_raw_page($1, 'main', $2); $$
 LANGUAGE SQL STRICT;
 
 --
index c97302f8a7ca63d79dc3b418f45c007f3eab5b80..feed0af90564c21c1658fc512d9996bb0b4a9537 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "access/heapam.h"
 #include "access/transam.h"
+#include "catalog/catalog.h"
 #include "catalog/namespace.h"
 #include "catalog/pg_type.h"
 #include "fmgr.h"
@@ -41,8 +42,9 @@ Datum
 get_raw_page(PG_FUNCTION_ARGS)
 {
        text       *relname = PG_GETARG_TEXT_P(0);
-       uint32          forknum = PG_GETARG_UINT32(1);
+       text       *forkname = PG_GETARG_TEXT_P(1);
        uint32          blkno = PG_GETARG_UINT32(2);
+       ForkNumber      forknum;
 
        Relation        rel;
        RangeVar   *relrv;
@@ -55,10 +57,7 @@ get_raw_page(PG_FUNCTION_ARGS)
                                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                 (errmsg("must be superuser to use raw functions"))));
 
-       if (forknum > MAX_FORKNUM)
-               ereport(ERROR,
-                               (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-                                errmsg("invalid fork number")));
+       forknum = forkname_to_number(text_to_cstring(forkname));
 
        relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname));
        rel = relation_openrv(relrv, AccessShareLock);
index 56e8a6cd19bea6be6bd418d20f63925fe5770a99..8f4094439fba23113fd55820dd969b55351c886c 100644 (file)
@@ -19,7 +19,7 @@
   <variablelist>
    <varlistentry>
     <term>
-     <function>get_raw_page(relname text, forknum int, blkno int) returns bytea</function>
+     <function>get_raw_page(relname text, fork text, blkno int) returns bytea</function>
     </term>
 
     <listitem>
@@ -27,8 +27,8 @@
       <function>get_raw_page</function> reads the specified block of the named
       table and returns a copy as a <type>bytea</> value.  This allows a
       single time-consistent copy of the block to be obtained.
-      <literal>forknum</literal> should be 0 for the main data fork, or 1 for
-      the FSM.
+      <literal>fork</literal> should be <literal>'main'</literal> for the main
+      data fork, or <literal>'fsm'</literal> for the FSM.
      </para>
     </listitem>
    </varlistentry>
index 58f25db2a29ae54f2ab2f0f40b688d5c5da710e6..777f81a066a5e90d61bdf84a16346f51db2da0a6 100644 (file)
@@ -134,8 +134,7 @@ or index's <firstterm>filenode</> number, which can be found in
 main file (aka. main fork), a <firstterm>free space map</> (see
 <xref linkend="storage-fsm">) that stores information about free space
 available in the relation, is stored in a file named after the filenode
-number, with the the _1 suffix. For example, if the table's filenode number
-is 12345, the FSM file is named <filename>12345_1</>.
+number, with the the <literal>_fsm</> suffix.
 </para>
 
 <caution>
@@ -385,9 +384,9 @@ comparison table, in which all the HTML pages were cut down to 7 kB to fit.
 A Free Space Map is stored with every heap and index relation, except for
 hash indexes, to keep track of available space in the relation. It's stored
 along the main relation data, in a separate FSM relation fork, named after
-relfilenode of the relation, but with a <literal>_1</> suffix. For example,
+relfilenode of the relation, but with a <literal>_fsm</> suffix. For example,
 if the relfilenode of a relation is 12345, the FSM is stored in a file called
-<filename>12345_1</>, in the same directory as the main relation file.
+<filename>12345_fsm</>, in the same directory as the main relation file.
 </para>
 
 <para>
index b2595fbd8fc3164e4d19a7b6439536cec837347f..5559cbbb8fcaf02ad08efefc7025c7ab3245a744 100644 (file)
 
 
 #define OIDCHARS               10                      /* max chars printed by %u */
-#define FORKNUMCHARS   1                       /* max chars for a fork number */
+#define FORKNAMECHARS  4                       /* max chars for a fork name */
 
+/*
+ * Lookup table of fork name by fork number.
+ *
+ * If you add a new entry, remember to update the errhint below, and the
+ * documentation for pg_relation_size(). Also keep FORKNAMECHARS above
+ * up-to-date.
+ */
+const char *forkNames[] = {
+       "main", /* MAIN_FORKNUM */
+       "fsm"   /* FSM_FORKNUM */
+};
+
+/*
+ * forkname_to_number - look up fork number by name
+ */
+ForkNumber
+forkname_to_number(char *forkName)
+{
+       ForkNumber forkNum;
+
+       for (forkNum = 0; forkNum <= MAX_FORKNUM; forkNum++)
+               if (strcmp(forkNames[forkNum], forkName) == 0)
+                       return forkNum;
+
+       ereport(ERROR,
+                       (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+                        errmsg("invalid fork name"),
+                        errhint("Valid fork names are 'main' and 'fsm'")));
+       return InvalidForkNumber; /* keep compiler quiet */
+}
 
 /*
  * relpath                     - construct path to a relation's file
@@ -61,22 +91,22 @@ relpath(RelFileNode rnode, ForkNumber forknum)
        {
                /* Shared system relations live in {datadir}/global */
                Assert(rnode.dbNode == 0);
-               pathlen = 7 + OIDCHARS + 1 + FORKNUMCHARS + 1;
+               pathlen = 7 + OIDCHARS + 1 + FORKNAMECHARS + 1;
                path = (char *) palloc(pathlen);
                if (forknum != MAIN_FORKNUM)
-                       snprintf(path, pathlen, "global/%u_%u",
-                                        rnode.relNode, forknum);
+                       snprintf(path, pathlen, "global/%u_%s",
+                                        rnode.relNode, forkNames[forknum]);
                else
                        snprintf(path, pathlen, "global/%u", rnode.relNode);
        }
        else if (rnode.spcNode == DEFAULTTABLESPACE_OID)
        {
                /* The default tablespace is {datadir}/base */
-               pathlen = 5 + OIDCHARS + 1 + OIDCHARS + 1 + FORKNUMCHARS + 1;
+               pathlen = 5 + OIDCHARS + 1 + OIDCHARS + 1 + FORKNAMECHARS + 1;
                path = (char *) palloc(pathlen);
                if (forknum != MAIN_FORKNUM)
-                       snprintf(path, pathlen, "base/%u/%u_%u",
-                                        rnode.dbNode, rnode.relNode, forknum);
+                       snprintf(path, pathlen, "base/%u/%u_%s",
+                                        rnode.dbNode, rnode.relNode, forkNames[forknum]);
                else
                        snprintf(path, pathlen, "base/%u/%u",
                                         rnode.dbNode, rnode.relNode);
@@ -85,11 +115,12 @@ relpath(RelFileNode rnode, ForkNumber forknum)
        {
                /* All other tablespaces are accessed via symlinks */
                pathlen = 10 + OIDCHARS + 1 + OIDCHARS + 1 + OIDCHARS + 1
-                       + FORKNUMCHARS + 1;
+                       + FORKNAMECHARS + 1;
                path = (char *) palloc(pathlen);
                if (forknum != MAIN_FORKNUM)
-                       snprintf(path, pathlen, "pg_tblspc/%u/%u/%u_%u",
-                                        rnode.spcNode, rnode.dbNode, rnode.relNode, forknum);
+                       snprintf(path, pathlen, "pg_tblspc/%u/%u/%u_%s",
+                                        rnode.spcNode, rnode.dbNode, rnode.relNode,
+                                        forkNames[forknum]);
                else
                        snprintf(path, pathlen, "pg_tblspc/%u/%u/%u",
                                         rnode.spcNode, rnode.dbNode, rnode.relNode);
index 613cbc6a17ace6e16f8d083597ef66b331e0327c..e4dedde67c3b6ca597193b48deca38d2cca6790b 100644 (file)
@@ -283,35 +283,6 @@ calculate_relation_size(RelFileNode *rfn, ForkNumber forknum)
        return totalsize;
 }
 
-
-/*
- * XXX: Consider making this global and moving elsewhere. But currently
- * there's no other users for this.
- *
- * Remember to also update the errhint below if you add entries, and the
- * documentation for pg_relation_size().
- */
-static char *forkNames[] = {
-       "main", /* MAIN_FORKNUM */
-       "fsm"   /* FSM_FORKNUM */
-};
-
-static ForkNumber
-forkname_to_number(char *forkName)
-{
-       ForkNumber forkNum;
-
-       for (forkNum = 0; forkNum <= MAX_FORKNUM; forkNum++)
-               if (strcmp(forkNames[forkNum], forkName) == 0)
-                       return forkNum;
-
-       ereport(ERROR,
-                       (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-                        errmsg("invalid fork name"),
-                        errhint("Valid fork names are 'main' and 'fsm'")));
-       return InvalidForkNumber; /* keep compiler quiet */
-}
-
 Datum
 pg_relation_size(PG_FUNCTION_ARGS)
 {
index 5a8401b686163ce8bd889833fb3cb020e79a6b4f..167983376065d1905cfea705e8fd0a71038a6cd2 100644 (file)
@@ -19,6 +19,9 @@
 #include "utils/relcache.h"
 
 
+extern const char *forkNames[];
+extern ForkNumber forkname_to_number(char *forkName);
+
 extern char *relpath(RelFileNode rnode, ForkNumber forknum);
 extern char *GetDatabasePath(Oid dbNode, Oid spcNode);
 
index 5a15056d51aecac4b72ef4b70338a97830eed5c0..8eb31ff37cdd7e70df099c5d65def8d7c74ff452 100644 (file)
@@ -53,6 +53,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     200810061
+#define CATALOG_VERSION_NO     200810062
 
 #endif
index 595a7352b16d5a0a075373220fecba23d70ed7a6..cb0d44ef3105db02fe655ef7409147dd6fcaef46 100644 (file)
@@ -27,7 +27,7 @@ typedef enum ForkNumber
        FSM_FORKNUM
        /*
         * NOTE: if you add a new fork, change MAX_FORKNUM below and update the
-        * name to number mapping in utils/adt/dbsize.c
+        * forkNames array in catalog.c
         */
 } ForkNumber;