Mon Dec 13 22:08:54 PST 2004
- Previous message: [Slony1-commit] By darcyb: Some more minor cleanups in the build environment, make
- Next message: [Slony1-commit] By darcyb: Fix patch/diff's braindead off by 2 lines error
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Log Message:
-----------
Due to lots of SIC regarding the pg_dump safe patches, I'll commit them.
New functionality allows you to REPAIR CONFIG() a node(s) after you have used pg_dump/restore on them.
slonik has a new statement REPAIR CONFIG(), and a new event class has been created REPAIR_CONFIG.
Modified Files:
--------------
slony1-engine/doc/howto:
slonik_commands.html (r1.13 -> r1.14)
slony1-engine/src/backend:
slony1_base.sql (r1.24 -> r1.25)
slony1_funcs.sql (r1.49 -> r1.50)
slony1-engine/src/slon:
misc.c (r1.14 -> r1.15)
remote_worker.c (r1.67 -> r1.68)
slon.c (r1.38 -> r1.39)
slony1-engine/src/slonik:
parser.y (r1.21 -> r1.22)
scan.l (r1.21 -> r1.22)
slonik.c (r1.37 -> r1.38)
slonik.h (r1.21 -> r1.22)
-------------- next part --------------
Index: slonik_commands.html
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/doc/howto/slonik_commands.html,v
retrieving revision 1.13
retrieving revision 1.14
diff -Ldoc/howto/slonik_commands.html -Ldoc/howto/slonik_commands.html -u -w -r1.13 -r1.14
--- doc/howto/slonik_commands.html
+++ doc/howto/slonik_commands.html
@@ -51,6 +51,7 @@
<li><a href="#stmt_failover">FAILOVER</a>
<li><a href="#stmt_ddl_script">EXECUTE SCRIPT</a>
<li><a href="#stmt_wait_event">WAIT FOR EVENT</a>
+ <li><a href="#stmt_repair_config">REPAIR CONFIG</a>
</ul>
</ul>
</div>
@@ -1747,6 +1748,54 @@
</table>
<h3>Example:</h3>
<p>
+
+<!-- **************************************** -->
+<a name="stmt_repair_config">
+<h3>REINIT NODE</h3>
+</a>
+<div style="margin-left:40px; margin-right:0px;">
+<h3>Synopsis:</h3>
+ REPAIR CONFIG ( <options> );
+<h3>Description:</h3>
+<p>
+ Resets the name to oid mapping, usefull for restoring after a pg_dump.
+</p>
+<p>
+<table border="0" cellpadding="10">
+<tr>
+ <td align="left" valign="top" nowrap><b>SET ID = <ival></b></td>
+ <td align="left" valign="top"><p>
+ The unique, numeric ID number of the set affected by the script.
+ </p></td>
+</tr>
+<tr>
+ <td align="left" valign="top" nowrap><b>EVENT NODE = <ival></b></td>
+ <td align="left" valign="top"><p>
+ <b>(Optional)</b>
+ The ID of the current origin of the set.
+ The default value is 1.
+ </p></td>
+</tr>
+<tr>
+ <td align="left" valign="top" nowrap><b>EXECUTE ONLY ON = <ival></b></td>
+ <td align="left" valign="top"><p>
+ <b>(Optional)</b>
+ The ID of the only node to actually update the mapping on.
+ The default is to execute this on all nodes that are
+ subscribed to the set.
+ </p></td>
+</tr>
+</table>
+<h3>Example:</h3>
+<p>
+ REPAIR CONFIG (
+ <br> SET ID = 1,
+ <br> EVENT NODE = 2
+ <br>);
+</p>
+</div>
+<p align="right">Back to <a href="#index">Index</a></p>
+
WAIT FOR EVENT (
<br> ORIGIN = ALL,
<br> CONFIRMED = ALL,
Index: slony1_base.sql
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/backend/slony1_base.sql,v
retrieving revision 1.24
retrieving revision 1.25
diff -Lsrc/backend/slony1_base.sql -Lsrc/backend/slony1_base.sql -u -w -r1.24 -r1.25
--- src/backend/slony1_base.sql
+++ src/backend/slony1_base.sql
@@ -93,6 +93,8 @@
create table @NAMESPACE at .sl_table (
tab_id int4,
tab_reloid oid UNIQUE NOT NULL,
+ tab_relname name NOT NULL,
+ tab_nspname name NOT NULL,
tab_set int4,
tab_idxname name NOT NULL,
tab_altered boolean NOT NULL,
@@ -107,6 +109,8 @@
comment on table @NAMESPACE at .sl_table is 'Holds information about the tables being replicated.';
comment on column @NAMESPACE at .sl_table.tab_id is 'Unique key for Slony-I to use to identify the table';
comment on column @NAMESPACE at .sl_table.tab_reloid is 'The OID of the table in pg_catalog.pg_class.oid';
+comment on column @NAMESPACE at .sl_table.tab_relname is 'The name of the table in pg_catalog.pg_class.relname used to recover from a dump/restore cycle';
+comment on column @NAMESPACE at .sl_table.tab_nspname is 'The name of the schema in pg_catalog.pg_namespace.nspname used to recover from a dump/restore cycle';
comment on column @NAMESPACE at .sl_table.tab_set is 'ID of the replication set the table is in';
comment on column @NAMESPACE at .sl_table.tab_idxname is 'The name of the primary index of the table';
comment on column @NAMESPACE at .sl_table.tab_altered is 'Has the table been modified for replication?';
@@ -138,6 +142,8 @@
create table @NAMESPACE at .sl_sequence (
seq_id int4,
seq_reloid oid UNIQUE NOT NULL,
+ seq_relname name NOT NULL,
+ seq_nspname name NOT NULL,
seq_set int4,
seq_comment text,
@@ -150,6 +156,8 @@
comment on table @NAMESPACE at .sl_sequence is 'Similar to sl_table, each entry identifies a sequence being replicated.';
comment on column @NAMESPACE at .sl_sequence.seq_id is 'An internally-used ID for Slony-I to use in its sequencing of updates';
comment on column @NAMESPACE at .sl_sequence.seq_reloid is 'The OID of the sequence object';
+comment on column @NAMESPACE at .sl_sequence.seq_relname is 'The name of the sdequence in pg_catalog.pg_class.relname used to recover from a dump/restore cycle';
+comment on column @NAMESPACE at .sl_sequence.seq_nspname is 'The name of the schema in pg_catalog.pg_namespace.nspname used to recover from a dump/restore cycle';
comment on column @NAMESPACE at .sl_sequence.seq_set is 'Indicates which replication set the object is in';
comment on column @NAMESPACE at .sl_sequence.seq_comment is 'A human-oriented comment';
@@ -287,6 +295,7 @@
UNSUBSCRIBE_SET =
DDL_SCRIPT =
ADJUST_SEQ =
+ RESET_CONFIG =
';
comment on column @NAMESPACE at .sl_event.ev_data1 is 'Data field containing an argument needed to process the event';
comment on column @NAMESPACE at .sl_event.ev_data2 is 'Data field containing an argument needed to process the event';
Index: slony1_funcs.sql
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/backend/slony1_funcs.sql,v
retrieving revision 1.49
retrieving revision 1.50
diff -Lsrc/backend/slony1_funcs.sql -Lsrc/backend/slony1_funcs.sql -u -w -r1.49 -r1.50
--- src/backend/slony1_funcs.sql
+++ src/backend/slony1_funcs.sql
@@ -2298,6 +2298,8 @@
create or replace function @NAMESPACE at .setAddTable_int(int4, int4, text, name, text)
returns int4
as '
+ v_tab_relname name;
+ v_tab_nspname name;
declare
p_set_id alias for $1;
p_tab_id alias for $2;
@@ -2341,7 +2343,7 @@
-- ----
-- Get the tables OID and check that it is a real table
-- ----
- select PGC.oid, PGC.relkind into v_tab_reloid, v_relkind
+ select PGC.oid, PGC.relkind, PGC.relname, PGN.nspname into v_tab_reloid, v_relkind, v_tab_relname, v_tab_nspname
from "pg_catalog".pg_class PGC, "pg_catalog".pg_namespace PGN
where PGC.relnamespace = PGN.oid
and p_fqname = "pg_catalog".quote_ident(PGN.nspname) ||
@@ -2369,10 +2371,11 @@
-- Add the table to sl_table and create the trigger on it.
-- ----
insert into @NAMESPACE at .sl_table
- (tab_id, tab_reloid, tab_set, tab_idxname,
- tab_altered, tab_comment) values
- (p_tab_id, v_tab_reloid, p_set_id, p_tab_idxname,
- false, p_tab_comment);
+ (tab_id, tab_reloid, tab_relname, tab_nspname,
+ tab_set, tab_idxname, tab_altered, tab_comment)
+ values
+ (p_tab_id, v_tab_reloid, v_tab_relname, v_tab_nspname,
+ p_set_id, p_tab_idxname, false, p_tab_comment);
perform @NAMESPACE at .alterTableForReplication(p_tab_id);
return p_tab_id;
@@ -2580,6 +2583,8 @@
v_sub_provider int4;
v_relkind char;
v_seq_reloid oid;
+ v_seq_relname name;
+ v_seq_nspname name;
v_sync_row record;
begin
-- ----
@@ -2613,7 +2618,8 @@
-- ----
-- Get the sequences OID and check that it is a sequence
-- ----
- select PGC.oid, PGC.relkind into v_seq_reloid, v_relkind
+ select PGC.oid, PGC.relkind, PGC.relname, PGN.nspname
+ into v_seq_reloid, v_relkind, v_seq_relname, v_seq_nspname
from "pg_catalog".pg_class PGC, "pg_catalog".pg_namespace PGN
where PGC.relnamespace = PGN.oid
and p_fqname = "pg_catalog".quote_ident(PGN.nspname) ||
@@ -2631,8 +2637,9 @@
-- Add the sequence to sl_sequence
-- ----
insert into @NAMESPACE at .sl_sequence
- (seq_id, seq_reloid, seq_set, seq_comment) values
- (p_seq_id, v_seq_reloid, p_set_id, p_seq_comment);
+ (seq_id, seq_reloid, seq_relname, seq_nspname, seq_set, seq_comment)
+ values
+ (p_seq_id, v_seq_reloid, v_seq_relname, v_seq_nspname, p_set_id, p_seq_comment);
-- ----
-- On the set origin, fake a sl_seqlog row for the last sync event
@@ -3278,6 +3285,7 @@
-- ----
perform @NAMESPACE at .createEvent(''_ at CLUSTERNAME@'', ''SYNC'', NULL);
perform @NAMESPACE at .ddlScript_int(p_set_id, p_script, p_only_on_node);
+ perform @NAMESPACE at .updateRelname(p_set_id, p_only_on_node);
return @NAMESPACE at .createEvent(''_ at CLUSTERNAME@'', ''DDL_SCRIPT'',
p_set_id, p_script, p_only_on_node);
end;
@@ -4683,7 +4691,7 @@
else
return 0;
end if;
-END;
+end;
' language plpgsql;
comment on function @NAMESPACE at .generate_sync_event(interval) is
@@ -4713,6 +4721,138 @@
and PGA.attname = ''_Slony-I_ at CLUSTERNAME@_rowID''
and not PGA.attisdropped;
return found;
+-- FUNCTION updateRelname (set_id, only_on_node)
+--
+-- Reset the relnames
+-- ----------------------------------------------------------------------
+create or replace function @NAMESPACE at .updateRelname (int4, int4)
+returns int4
+as '
+declare
+ p_set_id alias for $1;
+ p_only_on_node alias for $2;
+ v_no_id int4;
+ v_set_origin int4;
+begin
+ -- ----
+ -- Grab the central configuration lock
+ -- ----
+ lock table @NAMESPACE at .sl_config_lock;
+
+ -- ----
+ -- Check that we either are the set origin or a current
+ -- subscriber of the set.
+ -- ----
+ v_no_id := @NAMESPACE at .getLocalNodeId(''_ at CLUSTERNAME@'');
+ select set_origin into v_set_origin
+ from @NAMESPACE at .sl_set
+ where set_id = p_set_id
+ for update;
+ if not found then
+ raise exception ''Slony-I: set % not found'', p_set_id;
+ end if;
+ if v_set_origin <> v_no_id
+ and not exists (select 1 from @NAMESPACE at .sl_subscribe
+ where sub_set = p_set_id
+ and sub_receiver = v_no_id)
+ then
+ return 0;
+ end if;
+
+ -- ----
+ -- If execution on only one node is requested, check that
+ -- we are that node.
+ -- ----
+ if p_only_on_node > 0 and p_only_on_node <> v_no_id then
+ return 0;
+ end if;
+ update @NAMESPACE at .sl_table set
+ tab_relname = PGC.relname, tab_nspname = PGN.nspname
+ from pg_catalog.pg_class PGC, pg_catalog.pg_namespace PGN
+ where @NAMESPACE at .sl_table.tab_reloid = PGC.oid
+ and PGC.relnamespace = PGN.oid;
+ update @NAMESPACE at .sl_sequence set
+ seq_relname = PGC.relname, seq_nspname = PGN.nspname
+ from pg_catalog.pg_class PGC, pg_catalog.pg_namespace PGN
+ where @NAMESPACE at .sl_sequence.seq_reloid = PGC.oid
+ and PGC.relnamespace = PGN.oid;
+ return p_set_id;
+end;
+' language plpgsql;
+comment on function @NAMESPACE at .updateRelname(int4, int4) is
+'updateRelname(set_id, only_on_node)';
+
+-- ----------------------------------------------------------------------
+-- FUNCTION updateReloid (set_id, only_on_node)
+--
+-- Reset the relnames
+-- ----------------------------------------------------------------------
+create or replace function @NAMESPACE at .updateReloid (int4, int4)
+returns int4
+as '
+declare
+ p_set_id alias for $1;
+ p_only_on_node alias for $2;
+ v_no_id int4;
+ v_set_origin int4;
+begin
+ -- ----
+ -- Grab the central configuration lock
+ -- ----
+ lock table @NAMESPACE at .sl_config_lock;
+
+ -- ----
+ -- Check that we either are the set origin or a current
+ -- subscriber of the set.
+ -- ----
+ v_no_id := @NAMESPACE at .getLocalNodeId(''_ at CLUSTERNAME@'');
+ select set_origin into v_set_origin
+ from @NAMESPACE at .sl_set
+ where set_id = p_set_id
+ for update;
+ if not found then
+ raise exception ''Slony-I: set % not found'', p_set_id;
+ end if;
+ if v_set_origin <> v_no_id
+ and not exists (select 1 from @NAMESPACE at .sl_subscribe
+ where sub_set = p_set_id
+ and sub_receiver = v_no_id)
+ then
+ return 0;
+ end if;
+
+ -- ----
+ -- If execution on only one node is requested, check that
+ -- we are that node.
+ -- ----
+ if p_only_on_node > 0 and p_only_on_node <> v_no_id then
+ return 0;
+ end if;
+ update @NAMESPACE at .sl_table set
+ tab_reloid = PGC.oid
+ from pg_catalog.pg_class PGC, pg_catalog.pg_namespace PGN
+ where pg_catalog.quote_ident(@NAMESPACE at .sl_table.tab_relname) = pg_catalog.quote_ident(PGC.relname)
+ and PGC.relnamespace = PGN.oid
+ and pg_catalog.quote_ident(PGN.nspname) = pg_catalog.quote_ident(@NAMESPACE at .sl_table.tab_nspname);
+
+ update @NAMESPACE at .sl_sequence set
+ seq_reloid = PGC.oid
+ from pg_catalog.pg_class PGC, pg_catalog.pg_namespace PGN
+ where pg_catalog.quote_ident(@NAMESPACE at .sl_sequence.seq_relname) = pg_catalog.quote_ident(PGC.relname)
+ and PGC.relnamespace = PGN.oid
+ and pg_catalog.quote_ident(PGN.nspname) = pg_catalog.quote_ident(@NAMESPACE at .sl_sequence.seq_nspname);
+
+ return @NAMESPACE at .createEvent(''_ at CLUSTERNAME@'', ''RESET_CONFIG'',
+ p_set_id, p_only_on_node);
+end;
+' language plpgsql;
+comment on function @NAMESPACE at .updateReloid(int4, int4) is
+'updateReloid(set_id, only_on_node)
+
+Updates the respective reloids in sl_table and sl_seqeunce based on
+their respective FQN';
+
+-- ----------------------------------------------------------------------
end;
' language plpgsql;
@@ -4725,12 +4865,49 @@
-- ----------------------------------------------------------------------
-- FUNCTION upgradeSchema(old_version)
+ -- upgrade sl_node
--
-- Called by slonik during the function upgrade process.
-- ----------------------------------------------------------------------
create or replace function @NAMESPACE at .upgradeSchema(text)
returns text as '
declare
+ -- upgrade sl_table
+ if p_old = ''1.0.2'' or p_old = ''1.0.5'' then
+ -- Add new column(s) sl_table.tab_relname, sl_table.tab_nspname
+ execute ''alter table @NAMESPACE at .sl_table add column tab_relname name'';
+ execute ''alter table @NAMESPACE at .sl_table add column tab_nspname name'';
+
+ -- populate the colums with data
+ update @NAMESPACE at .sl_table set
+ tab_relname = PGC.relname, tab_nspname = PGN.nspname
+ from pg_catalog.pg_class PGC, pg_catalog.pg_namespace PGN
+ where @NAMESPACE at .sl_table.tab_reloid = PGC.oid
+ and PGC.relnamespace = PGN.oid;
+
+ -- constrain the colums
+ execute ''alter table @NAMESPACE at .sl_table alter column tab_relname set NOT NULL'';
+ execute ''alter table @NAMESPACE at .sl_table alter column tab_nspname set NOT NULL'';
+
+ end if;
+
+ -- upgrade sl_sequence
+ if p_old = ''1.0.2'' or p_old = ''1.0.5'' then
+ -- Add new column(s) sl_sequence.seq_relname, sl_sequence.seq_nspname
+ execute ''alter table @NAMESPACE at .sl_sequence add column seq_relname name'';
+ execute ''alter table @NAMESPACE at .sl_sequence add column seq_nspname name'';
+
+ -- populate the columns with data
+ update @NAMESPACE at .sl_sequence set
+ seq_relname = PGC.relname, seq_nspname = PGN.nspname
+ from pg_catalog.pg_class PGC, pg_catalog.pg_namespace PGN
+ where @NAMESPACE at .sl_sequence.seq_reloid = PGC.oid
+ and PGC.relnamespace = PGN.oid;
+
+ -- constrain the data
+ execute ''alter table @NAMESPACE at .sl_sequence alter column seq_relname set NOT NULL'';
+ execute ''alter table @NAMESPACE at .sl_sequence alter column seq_nspname set NOT NULL'';
+ end if;
p_old alias for $1;
begin
-- ----
Index: remote_worker.c
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slon/remote_worker.c,v
retrieving revision 1.67
retrieving revision 1.68
diff -Lsrc/slon/remote_worker.c -Lsrc/slon/remote_worker.c -u -w -r1.67 -r1.68
--- src/slon/remote_worker.c
+++ src/slon/remote_worker.c
@@ -963,6 +963,15 @@
"select %s.ddlScript_int(%d, '%q', %d); ",
rtcfg_namespace,
ddl_setid, ddl_script, ddl_only_on_node);
+ } else if (strcmp(event->ev_type, "RESET_CONFIG") == 0)
+ {
+ int reset_config_setid = (int)strtol(event->ev_data1, NULL, 10);
+ int reset_configonly_on_node = (int)strtol(event->ev_data2, NULL, 10);
+
+ slon_appendquery(&query1,
+ "select %s.updateReloid(%d, '%q', %d); ",
+ rtcfg_namespace,
+ reset_config_setid, reset_configonly_on_node);
} else
{
printf("TODO: ********** remoteWorkerThread: node %d - EVENT %d," INT64_FORMAT " %s - unknown event type\n",
Index: slon.c
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slon/slon.c,v
retrieving revision 1.38
retrieving revision 1.39
diff -Lsrc/slon/slon.c -Lsrc/slon/slon.c -u -w -r1.38 -r1.39
--- src/slon/slon.c
+++ src/slon/slon.c
@@ -165,7 +165,6 @@
/*
* Remember the connection information for the local node.
*/
-
if (rtcfg_conninfo == NULL)
{
errors++;
Index: misc.c
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slon/misc.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -Lsrc/slon/misc.c -Lsrc/slon/misc.c -u -w -r1.14 -r1.15
--- src/slon/misc.c
+++ src/slon/misc.c
@@ -146,6 +146,7 @@
slon_abort();
}
}
+
sprintf(outbuf, "");
if (logtimestamp == true && (Use_syslog != 1))
Index: scan.l
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/scan.l,v
retrieving revision 1.21
retrieving revision 1.22
diff -Lsrc/slonik/scan.l -Lsrc/slonik/scan.l -u -w -r1.21 -r1.22
--- src/slonik/scan.l
+++ src/slonik/scan.l
@@ -44,6 +44,7 @@
client { return K_CLIENT; }
cluster { return K_CLUSTER; }
comment { return K_COMMENT; }
+config { return K_CONFIG; }
confirmed { return K_CONFIRMED; }
conninfo { return K_CONNINFO; }
connretry { return K_CONNRETRY; }
@@ -82,6 +83,7 @@
provider { return K_PROVIDER; }
qualified { return K_QUALIFIED; }
receiver { return K_RECEIVER; }
+repair { return K_REPAIR; }
restart { return K_RESTART; }
script { return K_SCRIPT; }
sequence { return K_SEQUENCE; }
Index: slonik.h
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/slonik.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -Lsrc/slonik/slonik.h -Lsrc/slonik/slonik.h -u -w -r1.21 -r1.22
--- src/slonik/slonik.h
+++ src/slonik/slonik.h
@@ -17,6 +17,7 @@
typedef struct SlonikStmt_try_s SlonikStmt_try;
typedef struct SlonikStmt_echo_s SlonikStmt_echo;
typedef struct SlonikStmt_exit_s SlonikStmt_exit;
+typedef struct SlonikStmt_repair_config_s SlonikStmt_repair_config;
typedef struct SlonikStmt_restart_node_s SlonikStmt_restart_node;
typedef struct SlonikStmt_init_cluster_s SlonikStmt_init_cluster;
typedef struct SlonikStmt_store_node_s SlonikStmt_store_node;
@@ -65,6 +66,7 @@
STMT_MERGE_SET,
STMT_MOVE_SET,
STMT_RESTART_NODE,
+ STMT_REPAIR_CONFIG,
STMT_SET_ADD_SEQUENCE,
STMT_SET_ADD_TABLE,
STMT_SET_DROP_SEQUENCE,
@@ -145,6 +147,13 @@
int no_id;
};
+struct SlonikStmt_repair_config_s {
+ SlonikStmt hdr;
+ int set_id;
+ int ev_origin;
+ int only_on_node;
+};
+
struct SlonikStmt_init_cluster_s {
SlonikStmt hdr;
Index: parser.y
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/parser.y,v
retrieving revision 1.21
retrieving revision 1.22
diff -Lsrc/slonik/parser.y -Lsrc/slonik/parser.y -u -w -r1.21 -r1.22
--- src/slonik/parser.y
+++ src/slonik/parser.y
@@ -157,6 +157,7 @@
%type <statement> stmt_move_set
%type <statement> stmt_ddl_script
%type <statement> stmt_update_functions
+%type <statement> stmt_repair_config
%type <statement> stmt_wait_event
%type <opt_list> option_list
%type <opt_list> option_list_item
@@ -178,6 +179,7 @@
%token K_CLUSTERNAME
%token K_COMMENT
%token K_CONFIRMED
+%token K_CONFIG
%token K_CONNINFO
%token K_CONNRETRY
%token K_CREATE
@@ -214,6 +216,7 @@
%token K_PROVIDER
%token K_QUALIFIED
%token K_RECEIVER
+%token K_REPAIR
%token K_RESTART
%token K_SCRIPT
%token K_SEQUENCE
@@ -467,6 +470,8 @@
| stmt_ddl_script
{ $$ = $1; }
| stmt_update_functions
+ | stmt_repair_config
+ { $$ = $1; }
{ $$ = $1; }
| stmt_wait_event
{ $$ = $1; }
@@ -1375,6 +1380,36 @@
$$ = (SlonikStmt *)new;
}
;
+stmt_repair_config : lno K_REPAIR K_CONFIG option_list
+ {
+ SlonikStmt_repair_config *new;
+ statement_option opt[] = {
+ STMT_OPTION_INT( O_SET_ID, -1 ),
+ STMT_OPTION_INT( O_EVENT_NODE, 1 ),
+ STMT_OPTION_INT( O_EXECUTE_ONLY_ON, -1 ),
+ STMT_OPTION_END
+ };
+
+ new = (SlonikStmt_repair_config *)
+ malloc(sizeof(SlonikStmt_repair_config));
+ memset(new, 0, sizeof(SlonikStmt_repair_config));
+ new->hdr.stmt_type = STMT_REPAIR_CONFIG;
+ new->hdr.stmt_filename = current_file;
+ new->hdr.stmt_lno = $1;
+
+ if (assign_options(opt, $4) == 0)
+ {
+ new->set_id = opt[0].ival;
+ new->ev_origin = opt[1].ival;
+ new->only_on_node = opt[2].ival;
+ }
+ else
+ {
+ parser_errors++;
+ }
+ $$ = (SlonikStmt *)new;
+ }
+ ;
stmt_wait_event : lno K_WAIT K_FOR K_EVENT option_list
{
Index: slonik.c
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/slonik.c,v
retrieving revision 1.37
retrieving revision 1.38
diff -Lsrc/slonik/slonik.c -Lsrc/slonik/slonik.c -u -w -r1.37 -r1.38
--- src/slonik/slonik.c
+++ src/slonik/slonik.c
@@ -245,6 +245,21 @@
}
break;
+ case STMT_REPAIR_CONFIG:
+ {
+ SlonikStmt_repair_config *stmt =
+ (SlonikStmt_repair_config *)hdr;
+ if (stmt->ev_origin < 0)
+ {
+ stmt->ev_origin = 1;
+ }
+ if (script_check_adminfo(hdr, stmt->ev_origin) < 0)
+ {
+ errors++;
+ }
+ }
+ break;
+
case STMT_ERROR:
break;
@@ -1157,6 +1172,15 @@
(SlonikStmt_init_cluster *)hdr;
if (slonik_init_cluster(stmt) < 0)
+ case STMT_REPAIR_CONFIG:
+ {
+ SlonikStmt_repair_config *stmt =
+ (SlonikStmt_repair_config *)hdr;
+
+ if (slonik_repair_config(stmt) < 0)
+ errors++;
+ }
+ break;
errors++;
}
break;
@@ -1919,6 +1943,31 @@
}
dstring_free(&query);
+}
+
+int
+slonik_repair_config(SlonikStmt_repair_config *stmt)
+{
+ SlonikAdmInfo *adminfo1;
+ SlonDString query;
+
+ adminfo1 = get_active_adminfo((SlonikStmt *)stmt, stmt->ev_origin);
+ if (adminfo1 == NULL)
+ return -1;
+
+ dstring_init(&query);
+
+ slon_mkquery(&query,
+ "select \"_%s\".updateReloid(%d, %d); ",
+ stmt->hdr.script->clustername,
+ stmt->set_id, stmt->only_on_node);
+ if (db_exec_command((SlonikStmt *)stmt, adminfo1, &query) < 0)
+ {
+ dstring_free(&query);
+ return -1;
+ }
+
+ dstring_free(&query);
return 0;
}
@@ -3814,17 +3863,8 @@
/*
* Finally restart the node.
*/
- slon_mkquery(&query,
- "notify \"_%s_Restart\"; ",
- stmt->hdr.script->clustername);
- if (db_exec_command((SlonikStmt *)stmt, adminfo, &query) < 0)
- {
- dstring_free(&query);
- return -1;
- }
- dstring_free(&query);
- return 0;
+ return slonik_restart_node((SlonikStmt_restart_node *)stmt);
}
- Previous message: [Slony1-commit] By darcyb: Some more minor cleanups in the build environment, make
- Next message: [Slony1-commit] By darcyb: Fix patch/diff's braindead off by 2 lines error
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Slony1-commit mailing list