]> granicus.if.org Git - postgresql/commitdiff
Make min_wal_size/max_wal_size use MB internally
authorSimon Riggs <simon@2ndQuadrant.com>
Tue, 4 Apr 2017 22:00:01 +0000 (18:00 -0400)
committerSimon Riggs <simon@2ndQuadrant.com>
Tue, 4 Apr 2017 22:00:01 +0000 (18:00 -0400)
Previously they were defined using multiples of XLogSegSize.
Remove GUC_UNIT_XSEGS. Introduce GUC_UNIT_MB

Extracted from patch series on XLogSegSize infrastructure.

Beena Emerson

src/backend/access/transam/xlog.c
src/backend/utils/misc/guc.c
src/include/access/xlog.h
src/include/utils/guc.h

index 287b3b13799dd5e9c9bddf24553b28c87950c146..45ed58ea3431574e425988a340111379f3ed8da8 100644 (file)
@@ -86,8 +86,8 @@ extern uint32 bootstrap_data_checksum_version;
 
 
 /* User-settable parameters */
-int                    max_wal_size = 64;      /* 1 GB */
-int                    min_wal_size = 5;       /* 80 MB */
+int                    max_wal_size_mb = 1024;         /* 1 GB */
+int                    min_wal_size_mb = 80;           /* 80 MB */
 int                    wal_keep_segments = 0;
 int                    XLOGbuffers = -1;
 int                    XLogArchiveTimeout = 0;
@@ -738,6 +738,10 @@ static ControlFileData *ControlFile = NULL;
 #define UsableBytesInPage (XLOG_BLCKSZ - SizeOfXLogShortPHD)
 #define UsableBytesInSegment ((XLOG_SEG_SIZE / XLOG_BLCKSZ) * UsableBytesInPage - (SizeOfXLogLongPHD - SizeOfXLogShortPHD))
 
+/* Convert min_wal_size_mb and max wal_size_mb to equivalent segment count */
+#define ConvertToXSegs(x)      \
+       (x / (XLOG_SEG_SIZE / (1024 * 1024)))
+
 /*
  * Private, possibly out-of-date copy of shared LogwrtResult.
  * See discussion above.
@@ -2200,7 +2204,7 @@ AdvanceXLInsertBuffer(XLogRecPtr upto, bool opportunistic)
 }
 
 /*
- * Calculate CheckPointSegments based on max_wal_size and
+ * Calculate CheckPointSegments based on max_wal_size_mb and
  * checkpoint_completion_target.
  */
 static void
@@ -2210,14 +2214,14 @@ CalculateCheckpointSegments(void)
 
        /*-------
         * Calculate the distance at which to trigger a checkpoint, to avoid
-        * exceeding max_wal_size. This is based on two assumptions:
+        * exceeding max_wal_size_mb. This is based on two assumptions:
         *
         * a) we keep WAL for two checkpoint cycles, back to the "prev" checkpoint.
         * b) during checkpoint, we consume checkpoint_completion_target *
         *        number of segments consumed between checkpoints.
         *-------
         */
-       target = (double) max_wal_size / (2.0 + CheckPointCompletionTarget);
+       target = (double) ConvertToXSegs(max_wal_size_mb) / (2.0 + CheckPointCompletionTarget);
 
        /* round down */
        CheckPointSegments = (int) target;
@@ -2229,7 +2233,7 @@ CalculateCheckpointSegments(void)
 void
 assign_max_wal_size(int newval, void *extra)
 {
-       max_wal_size = newval;
+       max_wal_size_mb = newval;
        CalculateCheckpointSegments();
 }
 
@@ -2253,12 +2257,12 @@ XLOGfileslop(XLogRecPtr PriorRedoPtr)
        XLogSegNo       recycleSegNo;
 
        /*
-        * Calculate the segment numbers that min_wal_size and max_wal_size
+        * Calculate the segment numbers that min_wal_size_mb and max_wal_size_mb
         * correspond to. Always recycle enough segments to meet the minimum, and
         * remove enough segments to stay below the maximum.
         */
-       minSegNo = PriorRedoPtr / XLOG_SEG_SIZE + min_wal_size - 1;
-       maxSegNo = PriorRedoPtr / XLOG_SEG_SIZE + max_wal_size - 1;
+       minSegNo = PriorRedoPtr / XLOG_SEG_SIZE + ConvertToXSegs(min_wal_size_mb) - 1;
+       maxSegNo = PriorRedoPtr / XLOG_SEG_SIZE + ConvertToXSegs(max_wal_size_mb) - 1;
 
        /*
         * Between those limits, recycle enough segments to get us through to the
index 8b5f064d4ebc1ff3817af9e2155a8cbba7c25c61..a57b175b2d3267cecdc3a756bc9e87a447e38adb 100644 (file)
@@ -729,6 +729,11 @@ static const unit_conversion memory_unit_conversion_table[] =
        {"MB", GUC_UNIT_KB, 1024},
        {"kB", GUC_UNIT_KB, 1},
 
+       {"TB", GUC_UNIT_MB, 1024 * 1024},
+       {"GB", GUC_UNIT_MB, 1024},
+       {"MB", GUC_UNIT_MB, 1},
+       {"kB", GUC_UNIT_MB, -1024},
+
        {"TB", GUC_UNIT_BLOCKS, (1024 * 1024 * 1024) / (BLCKSZ / 1024)},
        {"GB", GUC_UNIT_BLOCKS, (1024 * 1024) / (BLCKSZ / 1024)},
        {"MB", GUC_UNIT_BLOCKS, 1024 / (BLCKSZ / 1024)},
@@ -739,11 +744,6 @@ static const unit_conversion memory_unit_conversion_table[] =
        {"MB", GUC_UNIT_XBLOCKS, 1024 / (XLOG_BLCKSZ / 1024)},
        {"kB", GUC_UNIT_XBLOCKS, -(XLOG_BLCKSZ / 1024)},
 
-       {"TB", GUC_UNIT_XSEGS, (1024 * 1024 * 1024) / (XLOG_SEG_SIZE / 1024)},
-       {"GB", GUC_UNIT_XSEGS, (1024 * 1024) / (XLOG_SEG_SIZE / 1024)},
-       {"MB", GUC_UNIT_XSEGS, -(XLOG_SEG_SIZE / (1024 * 1024))},
-       {"kB", GUC_UNIT_XSEGS, -(XLOG_SEG_SIZE / 1024)},
-
        {""}                                            /* end of table marker */
 };
 
@@ -2236,10 +2236,10 @@ static struct config_int ConfigureNamesInt[] =
                {"min_wal_size", PGC_SIGHUP, WAL_CHECKPOINTS,
                        gettext_noop("Sets the minimum size to shrink the WAL to."),
                        NULL,
-                       GUC_UNIT_XSEGS
+                       GUC_UNIT_MB
                },
-               &min_wal_size,
-               5, 2, INT_MAX,
+               &min_wal_size_mb,
+               5 * (XLOG_SEG_SIZE/ (1024 * 1024)), 2, MAX_KILOBYTES,
                NULL, NULL, NULL
        },
 
@@ -2247,10 +2247,10 @@ static struct config_int ConfigureNamesInt[] =
                {"max_wal_size", PGC_SIGHUP, WAL_CHECKPOINTS,
                        gettext_noop("Sets the WAL size that triggers a checkpoint."),
                        NULL,
-                       GUC_UNIT_XSEGS
+                       GUC_UNIT_MB
                },
-               &max_wal_size,
-               64, 2, INT_MAX,
+               &max_wal_size_mb,
+               64 * (XLOG_SEG_SIZE/ (1024 * 1024)), 2, MAX_KILOBYTES,
                NULL, assign_max_wal_size, NULL
        },
 
@@ -8085,6 +8085,9 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
                        case GUC_UNIT_KB:
                                values[2] = "kB";
                                break;
+                       case GUC_UNIT_MB:
+                               values[2] = "MB";
+                               break;
                        case GUC_UNIT_BLOCKS:
                                snprintf(buffer, sizeof(buffer), "%dkB", BLCKSZ / 1024);
                                values[2] = pstrdup(buffer);
@@ -8093,11 +8096,6 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
                                snprintf(buffer, sizeof(buffer), "%dkB", XLOG_BLCKSZ / 1024);
                                values[2] = pstrdup(buffer);
                                break;
-                       case GUC_UNIT_XSEGS:
-                               snprintf(buffer, sizeof(buffer), "%dMB",
-                                                XLOG_SEG_SIZE / (1024 * 1024));
-                               values[2] = pstrdup(buffer);
-                               break;
                        case GUC_UNIT_MS:
                                values[2] = "ms";
                                break;
index d4abf948628a37427b674657247e1780826ed467..d23aab589e379336c082a5cdc9dcca6936c38042 100644 (file)
@@ -94,8 +94,8 @@ extern PGDLLIMPORT XLogRecPtr XactLastCommitEnd;
 extern bool reachedConsistency;
 
 /* these variables are GUC parameters related to XLOG */
-extern int     min_wal_size;
-extern int     max_wal_size;
+extern int     min_wal_size_mb;
+extern int     max_wal_size_mb;
 extern int     wal_keep_segments;
 extern int     XLOGbuffers;
 extern int     XLogArchiveTimeout;
index 7dd378026a604f96ff191887cc7545955f806cba..87d07410845a70d28da2a87e3bc361c8a15b93a0 100644 (file)
@@ -218,7 +218,7 @@ typedef enum
 #define GUC_UNIT_KB                            0x1000  /* value is in kilobytes */
 #define GUC_UNIT_BLOCKS                        0x2000  /* value is in blocks */
 #define GUC_UNIT_XBLOCKS               0x3000  /* value is in xlog blocks */
-#define GUC_UNIT_XSEGS                 0x4000  /* value is in xlog segments */
+#define GUC_UNIT_MB                            0x4000  /* value is in megabytes */
 #define GUC_UNIT_MEMORY                        0xF000  /* mask for size-related units */
 
 #define GUC_UNIT_MS                       0x10000      /* value is in milliseconds */