Thu Dec 2 21:43:24 PST 2004
- Previous message: [Slony1-commit] By cbbrowne: Added overview of what the components of slon do
- Next message: [Slony1-commit] By cbbrowne: Remove unnecessary UNLOCK SET from move set script
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Log Message: ----------- Added option "spoolnode = yes/no" to "store node" command. If spoolnode=yes is specified, the sl_node entry will have no_spool=true and slonik does not attempt to initialize a database for it. Jan Modified Files: -------------- slony1-engine/src/backend: slony1_funcs.sql (r1.47 -> r1.48) slony1-engine/src/slon: remote_worker.c (r1.66 -> r1.67) slony1-engine/src/slonik: parser.y (r1.20 -> r1.21) scan.l (r1.20 -> r1.21) slonik.c (r1.34 -> r1.35) slonik.h (r1.20 -> r1.21) -------------- next part -------------- Index: slony1_funcs.sql =================================================================== RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/backend/slony1_funcs.sql,v retrieving revision 1.47 retrieving revision 1.48 diff -Lsrc/backend/slony1_funcs.sql -Lsrc/backend/slony1_funcs.sql -u -w -r1.47 -r1.48 --- src/backend/slony1_funcs.sql +++ src/backend/slony1_funcs.sql @@ -350,7 +350,7 @@ perform setval(''@NAMESPACE at .sl_local_node_id'', p_local_node_id); perform setval(''@NAMESPACE at .sl_rowid_seq'', p_local_node_id::int8 * ''1000000000000000''::int8); - perform @NAMESPACE at .storeNode_int (p_local_node_id, p_comment); + perform @NAMESPACE at .storeNode_int (p_local_node_id, p_comment, false); return p_local_node_id; end; @@ -364,41 +364,50 @@ -- ---------------------------------------------------------------------- --- FUNCTION storeNode (no_id, no_comment) +-- FUNCTION storeNode (no_id, no_comment, no_spool) -- -- Generate the STORE_NODE event. -- ---------------------------------------------------------------------- -create or replace function @NAMESPACE at .storeNode (int4, text) +create or replace function @NAMESPACE at .storeNode (int4, text, boolean) returns bigint as ' declare p_no_id alias for $1; p_no_comment alias for $2; + p_no_spool alias for $3; + v_no_spool_txt text; begin - perform @NAMESPACE at .storeNode_int (p_no_id, p_no_comment); + if p_no_spool then + v_no_spool_txt = ''t''; + else + v_no_spool_txt = ''f''; + end if; + perform @NAMESPACE at .storeNode_int (p_no_id, p_no_comment, p_no_spool); return @NAMESPACE at .createEvent(''_ at CLUSTERNAME@'', ''STORE_NODE'', - p_no_id, p_no_comment); + p_no_id, p_no_comment, v_no_spool_txt); end; ' language plpgsql called on null input; -comment on function @NAMESPACE at .storeNode(int4, text) is +comment on function @NAMESPACE at .storeNode(int4, text, boolean) is 'no_id - Node ID # no_comment - Human-oriented comment +no_spool - Flag for virtual spool nodes Generate the STORE_NODE event for node no_id'; -- ---------------------------------------------------------------------- --- FUNCTION storeNode_int (no_id, no_comment) +-- FUNCTION storeNode_int (no_id, no_comment, no_spool) -- -- Process the STORE_NODE event. -- ---------------------------------------------------------------------- -create or replace function @NAMESPACE at .storeNode_int (int4, text) +create or replace function @NAMESPACE at .storeNode_int (int4, text, boolean) returns int4 as ' declare p_no_id alias for $1; p_no_comment alias for $2; + p_no_spool alias for $3; v_old_row record; begin -- ---- @@ -418,24 +427,26 @@ -- Node exists, update the existing row. -- ---- update @NAMESPACE at .sl_node - set no_comment = p_no_comment + set no_comment = p_no_comment, + no_spool = p_no_spool where no_id = p_no_id; else -- ---- -- New node, insert the sl_node row -- ---- insert into @NAMESPACE at .sl_node - (no_id, no_active, no_comment) values - (p_no_id, ''f'', p_no_comment); + (no_id, no_active, no_comment, no_spool) values + (p_no_id, ''f'', p_no_comment, p_no_spool); end if; return p_no_id; end; ' language plpgsql; -comment on function @NAMESPACE at .storeNode_int(int4, text) is +comment on function @NAMESPACE at .storeNode_int(int4, text, boolean) is 'no_id - Node ID # no_comment - Human-oriented comment +no_spool - Flag for virtual spool nodes Internal function to process the STORE_NODE event for node no_id'; Index: remote_worker.c =================================================================== RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slon/remote_worker.c,v retrieving revision 1.66 retrieving revision 1.67 diff -Lsrc/slon/remote_worker.c -Lsrc/slon/remote_worker.c -u -w -r1.66 -r1.67 --- src/slon/remote_worker.c +++ src/slon/remote_worker.c @@ -519,14 +519,15 @@ { int no_id = (int)strtol(event->ev_data1, NULL, 10); char *no_comment = event->ev_data2; + char *no_spool = event->ev_data3; if (no_id != rtcfg_nodeid) rtcfg_storeNode(no_id, no_comment); slon_appendquery(&query1, - "select %s.storeNode_int(%d, '%q'); ", + "select %s.storeNode_int(%d, '%q', '%s'); ", rtcfg_namespace, - no_id, no_comment); + no_id, no_comment, no_spool); need_reloadListen = true; } else if (strcmp(event->ev_type, "ENABLE_NODE") == 0) Index: scan.l =================================================================== RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/scan.l,v retrieving revision 1.20 retrieving revision 1.21 diff -Lsrc/slonik/scan.l -Lsrc/slonik/scan.l -u -w -r1.20 -r1.21 --- src/slonik/scan.l +++ src/slonik/scan.l @@ -88,6 +88,7 @@ serial { return K_SERIAL; } server { return K_SERVER; } set { return K_SET; } +spoolnode { return K_SPOOLNODE; } store { return K_STORE; } subscribe { return K_SUBSCRIBE; } success { return K_SUCCESS; } Index: slonik.h =================================================================== RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/slonik.h,v retrieving revision 1.20 retrieving revision 1.21 diff -Lsrc/slonik/slonik.h -Lsrc/slonik/slonik.h -u -w -r1.20 -r1.21 --- src/slonik/slonik.h +++ src/slonik/slonik.h @@ -157,6 +157,7 @@ SlonikStmt hdr; int no_id; char *no_comment; + int no_spool; int ev_origin; }; Index: parser.y =================================================================== RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/parser.y,v retrieving revision 1.20 retrieving revision 1.21 diff -Lsrc/slonik/parser.y -Lsrc/slonik/parser.y -u -w -r1.20 -r1.21 --- src/slonik/parser.y +++ src/slonik/parser.y @@ -42,6 +42,7 @@ O_SERVER, O_SER_KEY, O_SET_ID, + O_SPOOLNODE, O_TAB_ID, O_TIMEOUT, O_TRIG_NAME, @@ -77,7 +78,7 @@ } statement_option; #define STMT_OPTION_INT(_code,_dfl) {_code, -1, _dfl, NULL} #define STMT_OPTION_STR(_code,_dfl) {_code, -1, -1, _dfl} -#define STMT_OPTION_YN(_code,_dfl) {_code, -1, -1, _dfl} +#define STMT_OPTION_YN(_code,_dfl) {_code, -1, _dfl, NULL} #define STMT_OPTION_END {END_OF_OPTIONS, -1, -1, NULL} @@ -219,6 +220,7 @@ %token K_SERIAL %token K_SERVER %token K_SET +%token K_SPOOLNODE %token K_STORE %token K_SUBSCRIBE %token K_SUCCESS @@ -579,6 +581,7 @@ statement_option opt[] = { STMT_OPTION_INT( O_ID, -1 ), STMT_OPTION_STR( O_COMMENT, NULL ), + STMT_OPTION_YN( O_SPOOLNODE, 0 ), STMT_OPTION_INT( O_EVENT_NODE, 1 ), STMT_OPTION_END }; @@ -594,7 +597,8 @@ { new->no_id = opt[0].ival; new->no_comment = opt[1].str; - new->ev_origin = opt[2].ival; + new->no_spool = opt[2].ival; + new->ev_origin = opt[3].ival; } else parser_errors++; @@ -1590,6 +1594,11 @@ $5->opt_code = O_EXECUTE_ONLY_ON; $$ = $5; } + | K_SPOOLNODE '=' option_item_yn + { + $3->opt_code = O_SPOOLNODE; + $$ = $3; + } ; option_item_id : id @@ -1726,6 +1735,7 @@ case O_SERVER: return "server"; case O_SER_KEY: return "key"; case O_SET_ID: return "set id"; + case O_SPOOLNODE: return "spoolnode"; case O_TAB_ID: return "table id"; case O_TIMEOUT: return "timeout"; case O_TRIG_NAME: return "trigger name"; Index: slonik.c =================================================================== RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/slonik.c,v retrieving revision 1.34 retrieving revision 1.35 diff -Lsrc/slonik/slonik.c -Lsrc/slonik/slonik.c -u -w -r1.34 -r1.35 --- src/slonik/slonik.c +++ src/slonik/slonik.c @@ -278,8 +278,11 @@ hdr->stmt_filename, hdr->stmt_lno); } + if (!stmt->no_spool) + { if (script_check_adminfo(hdr, stmt->no_id) < 0) errors++; + } if (script_check_adminfo(hdr, stmt->ev_origin) < 0) errors++; } @@ -1958,7 +1961,7 @@ int slonik_store_node(SlonikStmt_store_node *stmt) { - SlonikAdmInfo *adminfo1; + SlonikAdmInfo *adminfo1 = NULL; SlonikAdmInfo *adminfo2; SlonDString query; int rc; @@ -1966,26 +1969,39 @@ int ntuples; int tupno; + if (!stmt->no_spool) + { adminfo1 = get_active_adminfo((SlonikStmt *)stmt, stmt->no_id); if (adminfo1 == NULL) return -1; + } adminfo2 = get_checked_adminfo((SlonikStmt *)stmt, stmt->ev_origin); if (adminfo2 == NULL) return -1; - if (db_begin_xact((SlonikStmt *)stmt, adminfo1) < 0) - return -1; if (db_begin_xact((SlonikStmt *)stmt, adminfo2) < 0) return -1; + dstring_init(&query); + + if (!stmt->no_spool) + { + if (db_begin_xact((SlonikStmt *)stmt, adminfo1) < 0) + { + dstring_free(&query); + return -1; + } + /* Load the slony base tables */ rc = load_slony_base((SlonikStmt *)stmt, stmt->no_id); if (rc < 0) + { + dstring_free(&query); return -1; + } /* call initializeLocalNode() and enableNode_int() */ - dstring_init(&query); slon_mkquery(&query, "select \"_%s\".initializeLocalNode(%d, '%q'); " "select \"_%s\".enableNode_int(%d); ", @@ -2001,7 +2017,7 @@ * Duplicate the content of sl_node */ slon_mkquery(&query, - "select no_id, no_active, no_comment " + "select no_id, no_active, no_comment, no_spool " "from \"_%s\".sl_node; ", stmt->hdr.script->clustername); res = db_exec_select((SlonikStmt *)stmt, adminfo2, &query); @@ -2016,10 +2032,11 @@ char *no_id = PQgetvalue(res, tupno, 0); char *no_active = PQgetvalue(res, tupno, 1); char *no_comment = PQgetvalue(res, tupno, 2); + char *no_spool = PQgetvalue(res, tupno, 3); slon_mkquery(&query, - "select \"_%s\".storeNode_int(%s, '%q'); ", - stmt->hdr.script->clustername, no_id, no_comment); + "select \"_%s\".storeNode_int(%s, '%q', '%s'); ", + stmt->hdr.script->clustername, no_id, no_comment, no_spool); if (*no_active == 't') { slon_appendquery(&query, @@ -2259,12 +2276,14 @@ } } PQclear(res); + } /* On the existing node, call storeNode() and enableNode() */ slon_mkquery(&query, - "select \"_%s\".storeNode(%d, '%q'); " + "select \"_%s\".storeNode(%d, '%q', '%s'); " "select \"_%s\".enableNode(%d); ", stmt->hdr.script->clustername, stmt->no_id, stmt->no_comment, + (stmt->no_spool != 0) ? "t" : "f", stmt->hdr.script->clustername, stmt->no_id); if (db_exec_evcommand((SlonikStmt *)stmt, adminfo2, &query) < 0) {
- Previous message: [Slony1-commit] By cbbrowne: Added overview of what the components of slon do
- Next message: [Slony1-commit] By cbbrowne: Remove unnecessary UNLOCK SET from move set script
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Slony1-commit mailing list