|
71 | 71 | #ifdef _MSC_VER |
72 | 72 | #include <float.h> /* for _isnan */ |
73 | 73 | #endif |
| 74 | +#include <limits.h> |
74 | 75 | #include <math.h> |
75 | 76 |
|
76 | 77 | #include "access/htup_details.h" |
|
96 | 97 |
|
97 | 98 | #define LOG2(x) (log(x) / 0.693147180559945) |
98 | 99 |
|
| 100 | + |
99 | 101 | double seq_page_cost = DEFAULT_SEQ_PAGE_COST; |
100 | 102 | double random_page_cost = DEFAULT_RANDOM_PAGE_COST; |
101 | 103 | double cpu_tuple_cost = DEFAULT_CPU_TUPLE_COST; |
102 | 104 | double cpu_index_tuple_cost = DEFAULT_CPU_INDEX_TUPLE_COST; |
103 | 105 | double cpu_operator_cost = DEFAULT_CPU_OPERATOR_COST; |
104 | 106 |
|
105 | | -int effective_cache_size = -1; |
| 107 | +int effective_cache_size = -1; /* will get replaced */ |
106 | 108 |
|
107 | 109 | Cost disable_cost = 1.0e10; |
108 | 110 |
|
@@ -456,52 +458,6 @@ cost_index(IndexPath *path, PlannerInfo *root, double loop_count) |
456 | 458 | path->path.total_cost = startup_cost + run_cost; |
457 | 459 | } |
458 | 460 |
|
459 | | -void |
460 | | -set_default_effective_cache_size(void) |
461 | | -{ |
462 | | - /* |
463 | | - * If the value of effective_cache_size is -1, use the preferred |
464 | | - * auto-tune value. |
465 | | - */ |
466 | | - if (effective_cache_size == -1) |
467 | | - { |
468 | | - char buf[32]; |
469 | | - |
470 | | - snprintf(buf, sizeof(buf), "%d", NBuffers * DEFAULT_EFFECTIVE_CACHE_SIZE_MULTI); |
471 | | - SetConfigOption("effective_cache_size", buf, PGC_POSTMASTER, PGC_S_OVERRIDE); |
472 | | - } |
473 | | - Assert(effective_cache_size > 0); |
474 | | -} |
475 | | - |
476 | | -/* |
477 | | - * GUC check_hook for effective_cache_size |
478 | | - */ |
479 | | -bool |
480 | | -check_effective_cache_size(int *newval, void **extra, GucSource source) |
481 | | -{ |
482 | | - /* |
483 | | - * -1 indicates a request for auto-tune. |
484 | | - */ |
485 | | - if (*newval == -1) |
486 | | - { |
487 | | - /* |
488 | | - * If we haven't yet changed the boot_val default of -1, just let it |
489 | | - * be. We'll fix it later. |
490 | | - */ |
491 | | - if (effective_cache_size == -1) |
492 | | - return true; |
493 | | - |
494 | | - /* Otherwise, substitute the auto-tune value */ |
495 | | - *newval = NBuffers * DEFAULT_EFFECTIVE_CACHE_SIZE_MULTI; |
496 | | - } |
497 | | - |
498 | | - /* set minimum? */ |
499 | | - if (*newval < 1) |
500 | | - *newval = 1; |
501 | | - |
502 | | - return true; |
503 | | -} |
504 | | - |
505 | 461 | /* |
506 | 462 | * index_pages_fetched |
507 | 463 | * Estimate the number of pages actually fetched after accounting for |
@@ -4137,3 +4093,59 @@ page_size(double tuples, int width) |
4137 | 4093 | { |
4138 | 4094 | return ceil(relation_byte_size(tuples, width) / BLCKSZ); |
4139 | 4095 | } |
| 4096 | + |
| 4097 | +/* |
| 4098 | + * GUC check_hook for effective_cache_size |
| 4099 | + */ |
| 4100 | +bool |
| 4101 | +check_effective_cache_size(int *newval, void **extra, GucSource source) |
| 4102 | +{ |
| 4103 | + /* |
| 4104 | + * -1 is the documented way of requesting auto-tune, but we also treat |
| 4105 | + * zero as meaning that, since we don't consider zero a valid setting. |
| 4106 | + */ |
| 4107 | + if (*newval <= 0) |
| 4108 | + { |
| 4109 | + /* |
| 4110 | + * If we haven't yet changed the initial default of -1, just let it |
| 4111 | + * be. We'll fix it later on during GUC initialization, when |
| 4112 | + * set_default_effective_cache_size is called. (If we try to do it |
| 4113 | + * immediately, we may not be looking at the final value of NBuffers.) |
| 4114 | + */ |
| 4115 | + if (effective_cache_size == -1) |
| 4116 | + return true; |
| 4117 | + |
| 4118 | + /* |
| 4119 | + * Otherwise, substitute the auto-tune value, being wary of overflow. |
| 4120 | + */ |
| 4121 | + if (NBuffers < INT_MAX / 4) |
| 4122 | + *newval = NBuffers * 4; |
| 4123 | + else |
| 4124 | + *newval = INT_MAX; |
| 4125 | + } |
| 4126 | + |
| 4127 | + Assert(*newval > 0); |
| 4128 | + |
| 4129 | + return true; |
| 4130 | +} |
| 4131 | + |
| 4132 | +/* |
| 4133 | + * initialize effective_cache_size at the end of GUC startup |
| 4134 | + */ |
| 4135 | +void |
| 4136 | +set_default_effective_cache_size(void) |
| 4137 | +{ |
| 4138 | + /* |
| 4139 | + * If the value of effective_cache_size is still -1 (or zero), replace it |
| 4140 | + * with the auto-tune value. |
| 4141 | + */ |
| 4142 | + if (effective_cache_size <= 0) |
| 4143 | + { |
| 4144 | + /* disable the short-circuit in check_effective_cache_size */ |
| 4145 | + effective_cache_size = 0; |
| 4146 | + /* and let check_effective_cache_size() compute the setting */ |
| 4147 | + SetConfigOption("effective_cache_size", "-1", |
| 4148 | + PGC_POSTMASTER, PGC_S_OVERRIDE); |
| 4149 | + } |
| 4150 | + Assert(effective_cache_size > 0); |
| 4151 | +} |
0 commit comments