Make min_wal_size/max_wal_size use MB internally

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
This commit is contained in:
Simon Riggs 2017-04-04 18:00:01 -04:00
parent cd740c0dbf
commit 9a3215026b
4 changed files with 30 additions and 28 deletions

View File

@ -86,8 +86,8 @@ extern uint32 bootstrap_data_checksum_version;
/* User-settable parameters */ /* User-settable parameters */
int max_wal_size = 64; /* 1 GB */ int max_wal_size_mb = 1024; /* 1 GB */
int min_wal_size = 5; /* 80 MB */ int min_wal_size_mb = 80; /* 80 MB */
int wal_keep_segments = 0; int wal_keep_segments = 0;
int XLOGbuffers = -1; int XLOGbuffers = -1;
int XLogArchiveTimeout = 0; int XLogArchiveTimeout = 0;
@ -738,6 +738,10 @@ static ControlFileData *ControlFile = NULL;
#define UsableBytesInPage (XLOG_BLCKSZ - SizeOfXLogShortPHD) #define UsableBytesInPage (XLOG_BLCKSZ - SizeOfXLogShortPHD)
#define UsableBytesInSegment ((XLOG_SEG_SIZE / XLOG_BLCKSZ) * UsableBytesInPage - (SizeOfXLogLongPHD - 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. * Private, possibly out-of-date copy of shared LogwrtResult.
* See discussion above. * 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. * checkpoint_completion_target.
*/ */
static void static void
@ -2210,14 +2214,14 @@ CalculateCheckpointSegments(void)
/*------- /*-------
* Calculate the distance at which to trigger a checkpoint, to avoid * 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. * a) we keep WAL for two checkpoint cycles, back to the "prev" checkpoint.
* b) during checkpoint, we consume checkpoint_completion_target * * b) during checkpoint, we consume checkpoint_completion_target *
* number of segments consumed between checkpoints. * 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 */ /* round down */
CheckPointSegments = (int) target; CheckPointSegments = (int) target;
@ -2229,7 +2233,7 @@ CalculateCheckpointSegments(void)
void void
assign_max_wal_size(int newval, void *extra) assign_max_wal_size(int newval, void *extra)
{ {
max_wal_size = newval; max_wal_size_mb = newval;
CalculateCheckpointSegments(); CalculateCheckpointSegments();
} }
@ -2253,12 +2257,12 @@ XLOGfileslop(XLogRecPtr PriorRedoPtr)
XLogSegNo recycleSegNo; 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 * correspond to. Always recycle enough segments to meet the minimum, and
* remove enough segments to stay below the maximum. * remove enough segments to stay below the maximum.
*/ */
minSegNo = PriorRedoPtr / XLOG_SEG_SIZE + min_wal_size - 1; minSegNo = PriorRedoPtr / XLOG_SEG_SIZE + ConvertToXSegs(min_wal_size_mb) - 1;
maxSegNo = PriorRedoPtr / XLOG_SEG_SIZE + max_wal_size - 1; maxSegNo = PriorRedoPtr / XLOG_SEG_SIZE + ConvertToXSegs(max_wal_size_mb) - 1;
/* /*
* Between those limits, recycle enough segments to get us through to the * Between those limits, recycle enough segments to get us through to the

View File

@ -729,6 +729,11 @@ static const unit_conversion memory_unit_conversion_table[] =
{"MB", GUC_UNIT_KB, 1024}, {"MB", GUC_UNIT_KB, 1024},
{"kB", GUC_UNIT_KB, 1}, {"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)}, {"TB", GUC_UNIT_BLOCKS, (1024 * 1024 * 1024) / (BLCKSZ / 1024)},
{"GB", GUC_UNIT_BLOCKS, (1024 * 1024) / (BLCKSZ / 1024)}, {"GB", GUC_UNIT_BLOCKS, (1024 * 1024) / (BLCKSZ / 1024)},
{"MB", GUC_UNIT_BLOCKS, 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)}, {"MB", GUC_UNIT_XBLOCKS, 1024 / (XLOG_BLCKSZ / 1024)},
{"kB", GUC_UNIT_XBLOCKS, -(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 */ {""} /* end of table marker */
}; };
@ -2236,10 +2236,10 @@ static struct config_int ConfigureNamesInt[] =
{"min_wal_size", PGC_SIGHUP, WAL_CHECKPOINTS, {"min_wal_size", PGC_SIGHUP, WAL_CHECKPOINTS,
gettext_noop("Sets the minimum size to shrink the WAL to."), gettext_noop("Sets the minimum size to shrink the WAL to."),
NULL, NULL,
GUC_UNIT_XSEGS GUC_UNIT_MB
}, },
&min_wal_size, &min_wal_size_mb,
5, 2, INT_MAX, 5 * (XLOG_SEG_SIZE/ (1024 * 1024)), 2, MAX_KILOBYTES,
NULL, NULL, NULL NULL, NULL, NULL
}, },
@ -2247,10 +2247,10 @@ static struct config_int ConfigureNamesInt[] =
{"max_wal_size", PGC_SIGHUP, WAL_CHECKPOINTS, {"max_wal_size", PGC_SIGHUP, WAL_CHECKPOINTS,
gettext_noop("Sets the WAL size that triggers a checkpoint."), gettext_noop("Sets the WAL size that triggers a checkpoint."),
NULL, NULL,
GUC_UNIT_XSEGS GUC_UNIT_MB
}, },
&max_wal_size, &max_wal_size_mb,
64, 2, INT_MAX, 64 * (XLOG_SEG_SIZE/ (1024 * 1024)), 2, MAX_KILOBYTES,
NULL, assign_max_wal_size, NULL NULL, assign_max_wal_size, NULL
}, },
@ -8085,6 +8085,9 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
case GUC_UNIT_KB: case GUC_UNIT_KB:
values[2] = "kB"; values[2] = "kB";
break; break;
case GUC_UNIT_MB:
values[2] = "MB";
break;
case GUC_UNIT_BLOCKS: case GUC_UNIT_BLOCKS:
snprintf(buffer, sizeof(buffer), "%dkB", BLCKSZ / 1024); snprintf(buffer, sizeof(buffer), "%dkB", BLCKSZ / 1024);
values[2] = pstrdup(buffer); values[2] = pstrdup(buffer);
@ -8093,11 +8096,6 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
snprintf(buffer, sizeof(buffer), "%dkB", XLOG_BLCKSZ / 1024); snprintf(buffer, sizeof(buffer), "%dkB", XLOG_BLCKSZ / 1024);
values[2] = pstrdup(buffer); values[2] = pstrdup(buffer);
break; break;
case GUC_UNIT_XSEGS:
snprintf(buffer, sizeof(buffer), "%dMB",
XLOG_SEG_SIZE / (1024 * 1024));
values[2] = pstrdup(buffer);
break;
case GUC_UNIT_MS: case GUC_UNIT_MS:
values[2] = "ms"; values[2] = "ms";
break; break;

View File

@ -94,8 +94,8 @@ extern PGDLLIMPORT XLogRecPtr XactLastCommitEnd;
extern bool reachedConsistency; extern bool reachedConsistency;
/* these variables are GUC parameters related to XLOG */ /* these variables are GUC parameters related to XLOG */
extern int min_wal_size; extern int min_wal_size_mb;
extern int max_wal_size; extern int max_wal_size_mb;
extern int wal_keep_segments; extern int wal_keep_segments;
extern int XLOGbuffers; extern int XLOGbuffers;
extern int XLogArchiveTimeout; extern int XLogArchiveTimeout;

View File

@ -218,7 +218,7 @@ typedef enum
#define GUC_UNIT_KB 0x1000 /* value is in kilobytes */ #define GUC_UNIT_KB 0x1000 /* value is in kilobytes */
#define GUC_UNIT_BLOCKS 0x2000 /* value is in blocks */ #define GUC_UNIT_BLOCKS 0x2000 /* value is in blocks */
#define GUC_UNIT_XBLOCKS 0x3000 /* value is in xlog 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_MEMORY 0xF000 /* mask for size-related units */
#define GUC_UNIT_MS 0x10000 /* value is in milliseconds */ #define GUC_UNIT_MS 0x10000 /* value is in milliseconds */