|
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