Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Support TB (terabyte) memory unit in GUC variables.
authorFujii Masao <fujii@postgresql.org>
Wed, 19 Jun 2013 23:17:14 +0000 (08:17 +0900)
committerFujii Masao <fujii@postgresql.org>
Wed, 19 Jun 2013 23:17:14 +0000 (08:17 +0900)
Patch by Simon Riggs, reviewed by Jeff Janes and me.

doc/src/sgml/config.sgml
src/backend/utils/misc/guc.c
src/backend/utils/misc/postgresql.conf.sample

index c7d84b59ce2b6213f453a8b0118f21ca11ee3c87..940ed6ef58b8fd8794ae00674e3f2fc7a2d5b9f5 100644 (file)
@@ -39,7 +39,7 @@
      For convenience,
      a different unit can also be specified explicitly.  Valid memory units
      are <literal>kB</literal> (kilobytes), <literal>MB</literal>
-     (megabytes), and <literal>GB</literal> (gigabytes); valid time units
+     (megabytes), <literal>GB</literal> (gigabytes), and <literal>TB</literal> (terabytes); valid time units
      are <literal>ms</literal> (milliseconds), <literal>s</literal>
      (seconds), <literal>min</literal> (minutes), <literal>h</literal>
      (hours), and <literal>d</literal> (days).  Note that the multiplier
index ea16c64619f76636ba8e2de5c2def6bb02079872..3a7653698d35864d2f4851e55acdb84ba3d271d3 100644 (file)
 
 #define KB_PER_MB (1024)
 #define KB_PER_GB (1024*1024)
+#define KB_PER_TB (1024*1024*1024)
 
 #define MS_PER_S 1000
 #define S_PER_MIN 60
@@ -4837,7 +4838,7 @@ parse_int(const char *value, int *result, int flags, const char **hintmsg)
        {
            /* Set hint for use if no match or trailing garbage */
            if (hintmsg)
-               *hintmsg = gettext_noop("Valid units for this parameter are \"kB\", \"MB\", and \"GB\".");
+               *hintmsg = gettext_noop("Valid units for this parameter are \"kB\", \"MB\", \"GB\", and \"TB\".");
 
 #if BLCKSZ < 1024 || BLCKSZ > (1024*1024)
 #error BLCKSZ must be between 1KB and 1MB
@@ -4891,6 +4892,22 @@ parse_int(const char *value, int *result, int flags, const char **hintmsg)
                        break;
                }
            }
+           else if (strncmp(endptr, "TB", 2) == 0)
+           {
+               endptr += 2;
+               switch (flags & GUC_UNIT_MEMORY)
+               {
+                   case GUC_UNIT_KB:
+                       val *= KB_PER_TB;
+                       break;
+                   case GUC_UNIT_BLOCKS:
+                       val *= KB_PER_TB / (BLCKSZ / 1024);
+                       break;
+                   case GUC_UNIT_XBLOCKS:
+                       val *= KB_PER_TB / (XLOG_BLCKSZ / 1024);
+                       break;
+               }
+           }
        }
        else if (flags & GUC_UNIT_TIME)
        {
@@ -7384,7 +7401,12 @@ _ShowOption(struct config_generic * record, bool use_units)
                                break;
                        }
 
-                       if (result % KB_PER_GB == 0)
+                       if (result % KB_PER_TB == 0)
+                       {
+                           result /= KB_PER_TB;
+                           unit = "TB";
+                       }
+                       else if (result % KB_PER_GB == 0)
                        {
                            result /= KB_PER_GB;
                            unit = "GB";
index 0303ac78c5fdb173232ebe2c85ca3039547c20b8..0d7249f4dbd7421d1184cbfaffb9d384071da5fe 100644 (file)
@@ -27,7 +27,7 @@
 # Memory units:  kB = kilobytes        Time units:  ms  = milliseconds
 #                MB = megabytes                     s   = seconds
 #                GB = gigabytes                     min = minutes
-#                                                   h   = hours
+#                TB = terabytes                     h   = hours
 #                                                   d   = days