mirror of
https://github.com/postgres/postgres.git
synced 2025-07-07 00:36:50 +03:00
Code review for auto-tuned effective_cache_size.
Fix integer overflow issue noted by Magnus Hagander, as well as a bunch
of other infelicities in commit ee1e5662d8
and its unreasonably large number of followups.
This commit is contained in:
@ -71,6 +71,7 @@
|
||||
#ifdef _MSC_VER
|
||||
#include <float.h> /* for _isnan */
|
||||
#endif
|
||||
#include <limits.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "access/htup_details.h"
|
||||
@ -96,13 +97,14 @@
|
||||
|
||||
#define LOG2(x) (log(x) / 0.693147180559945)
|
||||
|
||||
|
||||
double seq_page_cost = DEFAULT_SEQ_PAGE_COST;
|
||||
double random_page_cost = DEFAULT_RANDOM_PAGE_COST;
|
||||
double cpu_tuple_cost = DEFAULT_CPU_TUPLE_COST;
|
||||
double cpu_index_tuple_cost = DEFAULT_CPU_INDEX_TUPLE_COST;
|
||||
double cpu_operator_cost = DEFAULT_CPU_OPERATOR_COST;
|
||||
|
||||
int effective_cache_size = -1;
|
||||
int effective_cache_size = -1; /* will get replaced */
|
||||
|
||||
Cost disable_cost = 1.0e10;
|
||||
|
||||
@ -456,52 +458,6 @@ cost_index(IndexPath *path, PlannerInfo *root, double loop_count)
|
||||
path->path.total_cost = startup_cost + run_cost;
|
||||
}
|
||||
|
||||
void
|
||||
set_default_effective_cache_size(void)
|
||||
{
|
||||
/*
|
||||
* If the value of effective_cache_size is -1, use the preferred
|
||||
* auto-tune value.
|
||||
*/
|
||||
if (effective_cache_size == -1)
|
||||
{
|
||||
char buf[32];
|
||||
|
||||
snprintf(buf, sizeof(buf), "%d", NBuffers * DEFAULT_EFFECTIVE_CACHE_SIZE_MULTI);
|
||||
SetConfigOption("effective_cache_size", buf, PGC_POSTMASTER, PGC_S_OVERRIDE);
|
||||
}
|
||||
Assert(effective_cache_size > 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* GUC check_hook for effective_cache_size
|
||||
*/
|
||||
bool
|
||||
check_effective_cache_size(int *newval, void **extra, GucSource source)
|
||||
{
|
||||
/*
|
||||
* -1 indicates a request for auto-tune.
|
||||
*/
|
||||
if (*newval == -1)
|
||||
{
|
||||
/*
|
||||
* If we haven't yet changed the boot_val default of -1, just let it
|
||||
* be. We'll fix it later.
|
||||
*/
|
||||
if (effective_cache_size == -1)
|
||||
return true;
|
||||
|
||||
/* Otherwise, substitute the auto-tune value */
|
||||
*newval = NBuffers * DEFAULT_EFFECTIVE_CACHE_SIZE_MULTI;
|
||||
}
|
||||
|
||||
/* set minimum? */
|
||||
if (*newval < 1)
|
||||
*newval = 1;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* index_pages_fetched
|
||||
* Estimate the number of pages actually fetched after accounting for
|
||||
@ -4137,3 +4093,59 @@ page_size(double tuples, int width)
|
||||
{
|
||||
return ceil(relation_byte_size(tuples, width) / BLCKSZ);
|
||||
}
|
||||
|
||||
/*
|
||||
* GUC check_hook for effective_cache_size
|
||||
*/
|
||||
bool
|
||||
check_effective_cache_size(int *newval, void **extra, GucSource source)
|
||||
{
|
||||
/*
|
||||
* -1 is the documented way of requesting auto-tune, but we also treat
|
||||
* zero as meaning that, since we don't consider zero a valid setting.
|
||||
*/
|
||||
if (*newval <= 0)
|
||||
{
|
||||
/*
|
||||
* If we haven't yet changed the initial default of -1, just let it
|
||||
* be. We'll fix it later on during GUC initialization, when
|
||||
* set_default_effective_cache_size is called. (If we try to do it
|
||||
* immediately, we may not be looking at the final value of NBuffers.)
|
||||
*/
|
||||
if (effective_cache_size == -1)
|
||||
return true;
|
||||
|
||||
/*
|
||||
* Otherwise, substitute the auto-tune value, being wary of overflow.
|
||||
*/
|
||||
if (NBuffers < INT_MAX / 4)
|
||||
*newval = NBuffers * 4;
|
||||
else
|
||||
*newval = INT_MAX;
|
||||
}
|
||||
|
||||
Assert(*newval > 0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* initialize effective_cache_size at the end of GUC startup
|
||||
*/
|
||||
void
|
||||
set_default_effective_cache_size(void)
|
||||
{
|
||||
/*
|
||||
* If the value of effective_cache_size is still -1 (or zero), replace it
|
||||
* with the auto-tune value.
|
||||
*/
|
||||
if (effective_cache_size <= 0)
|
||||
{
|
||||
/* disable the short-circuit in check_effective_cache_size */
|
||||
effective_cache_size = 0;
|
||||
/* and let check_effective_cache_size() compute the setting */
|
||||
SetConfigOption("effective_cache_size", "-1",
|
||||
PGC_POSTMASTER, PGC_S_OVERRIDE);
|
||||
}
|
||||
Assert(effective_cache_size > 0);
|
||||
}
|
||||
|
Reference in New Issue
Block a user