Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf91ddb7

Browse files
committed
Refactor GUC set_config_option function:
The main reason for refactoring was that set_config_option() was toooverloaded function and its behavior did not consistent. Old version ofset_config_function hides some messages. For example if you type:tcp_port = 5432.1then old implementation ignore this error without any message to logfile in the signal context (configuration reload). Main problem was thatsemantic analysis of postgresql.conf is not perform in theProcessConfigFile function, but in the set_config_options *after*context check. This skipped check for variables with PG_POSTMASTERcontext. There was request from Joachim Wieland to add more messagesabout ignored changes in the config file as well.Zdenek Kotala
1 parentc07fbcf commitf91ddb7

File tree

3 files changed

+414
-249
lines changed

3 files changed

+414
-249
lines changed

‎src/backend/utils/misc/guc-file.l

Lines changed: 55 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*
55
* Copyright (c) 2000-2006, PostgreSQL Global Development Group
66
*
7-
* $PostgreSQL: pgsql/src/backend/utils/misc/guc-file.l,v 1.38 2006/07/2708:30:41 petere Exp $
7+
* $PostgreSQL: pgsql/src/backend/utils/misc/guc-file.l,v 1.39 2006/08/11 20:08:28 momjian Exp $
88
*/
99

1010
%{
@@ -50,7 +50,8 @@ int GUC_yylex(void);
5050
staticboolParseConfigFile(constchar *config_file,constchar *calling_file,
5151
int depth, GucContext context,int elevel,
5252
structname_value_pair **head_p,
53-
structname_value_pair **tail_p);
53+
structname_value_pair **tail_p,
54+
int *varcount);
5455
staticvoidfree_name_value_list(structname_value_pair * list);
5556
staticchar *GUC_scanstr(constchar *s);
5657

@@ -114,8 +115,10 @@ STRING \'([^'\\\n]|\\.|\'\')*\'
114115
void
115116
ProcessConfigFile(GucContext context)
116117
{
117-
intelevel;
118+
intelevel, i;
118119
struct name_value_pair *item, *head, *tail;
120+
bool *apply_list = NULL;
121+
intvarcount = 0;
119122
120123
Assert(context == PGC_POSTMASTER || context == PGC_SIGHUP);
121124
@@ -134,25 +137,56 @@ ProcessConfigFile(GucContext context)
134137
135138
if (!ParseConfigFile(ConfigFileName, NULL,
136139
0, context, elevel,
137-
&head, &tail))
140+
&head, &tail, &varcount))
138141
goto cleanup_list;
139142
143+
/* Can we allocate memory here, what about leaving here prematurely? */
144+
apply_list = (bool *) palloc(sizeof(bool) * varcount);
145+
140146
/* Check if all options are valid */
141-
for (item = head; item; item = item->next)
147+
for (item = head, i = 0; item; item = item->next, i++)
142148
{
143-
if (!set_config_option(item->name, item->value, context,
144-
PGC_S_FILE, false, false))
149+
bool isEqual, isContextOk;
150+
151+
if (!verify_config_option(item->name, item->value, context,
152+
PGC_S_FILE, &isEqual, &isContextOk))
153+
{
154+
ereport(elevel,
155+
(errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
156+
errmsg("configuration file is invalid")));
145157
goto cleanup_list;
158+
}
159+
160+
if( isContextOk == false )
161+
{
162+
apply_list[i] = false;
163+
if( context == PGC_SIGHUP )
164+
{
165+
if ( isEqual == false )
166+
ereport(elevel,
167+
(errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
168+
errmsg("parameter\"%s\" cannot be changed after server start; configuration file change ignored",
169+
item->name)));
170+
}
171+
else
172+
/* if it is boot phase, context must be valid for all
173+
* configuration item. */
174+
goto cleanup_list;
175+
}
176+
else
177+
apply_list[i] = true;
146178
}
147179
148180
/* If we got here all the options checked out okay, so apply them. */
149-
for (item = head; item; item = item->next)
150-
{
151-
set_config_option(item->name, item->value, context,
152-
PGC_S_FILE, false, true);
153-
}
181+
for (item = head, i = 0; item; item = item->next, i++)
182+
if (apply_list[i])
183+
set_config_option(item->name, item->value, context,
184+
PGC_S_FILE, false, true);
185+
154186
155-
cleanup_list:
187+
cleanup_list:
188+
if (apply_list)
189+
pfree(apply_list);
156190
free_name_value_list(head);
157191
}
158192
@@ -189,13 +223,14 @@ static bool
189223
ParseConfigFile(constchar *config_file,constchar *calling_file,
190224
int depth, GucContext context,int elevel,
191225
structname_value_pair **head_p,
192-
structname_value_pair **tail_p)
226+
structname_value_pair **tail_p,
227+
int *varcount)
193228
{
194-
boolOK =true;
195-
charabs_path[MAXPGPATH];
196-
FILE *fp;
229+
boolOK =true;
230+
charabs_path[MAXPGPATH];
231+
FILE *fp;
197232
YY_BUFFER_STATE lex_buffer;
198-
inttoken;
233+
inttoken;
199234

200235
/*
201236
* Reject too-deep include nesting depth. This is just a safety check
@@ -289,7 +324,7 @@ ParseConfigFile(const char *config_file, const char *calling_file,
289324

290325
if (!ParseConfigFile(opt_value, config_file,
291326
depth +1, context, elevel,
292-
head_p, tail_p))
327+
head_p, tail_p, varcount))
293328
{
294329
pfree(opt_name);
295330
pfree(opt_value);
@@ -333,6 +368,7 @@ ParseConfigFile(const char *config_file, const char *calling_file,
333368
else
334369
(*tail_p)->next = item;
335370
*tail_p = item;
371+
(*varcount)++;
336372
}
337373

338374
/* break out of loop if read EOF, else loop for next line */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp