mirror of
https://github.com/postgres/postgres.git
synced 2025-04-22 23:02:54 +03:00
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:
parent
cd740c0dbf
commit
9a3215026b
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user