Mon Jan 21 10:54:13 PST 2008
- Previous message: [Slony1-commit] slony1-engine/src/slon local_listen.c remote_worker.c
- Next message: [Slony1-commit] slony1-engine RELEASE-2.0
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Update of /home/cvsd/slony1/slony1-engine/src/slonik
In directory main.slony.info:/tmp/cvs-serv28743/slonik
Modified Files:
parser.y scan.l slonik.c slonik.h
Log Message:
New even type CLONE_NODE.
This will allow to duplicate an existing subscriber using pg_dump or
even filesystem level of copying the database cluster. See the script
src/ducttape/test_1_clonenode for an example of how this works.
Documentation still to be done.
Jan
Index: slonik.h
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/slonik/slonik.h,v
retrieving revision 1.32
retrieving revision 1.33
diff -C2 -d -r1.32 -r1.33
*** slonik.h 5 Jul 2007 18:19:04 -0000 1.32
--- slonik.h 21 Jan 2008 18:54:11 -0000 1.33
***************
*** 25,28 ****
--- 25,30 ----
typedef struct SlonikStmt_failed_node_s SlonikStmt_failed_node;
typedef struct SlonikStmt_uninstall_node_s SlonikStmt_uninstall_node;
+ typedef struct SlonikStmt_clone_prepare_s SlonikStmt_clone_prepare;
+ typedef struct SlonikStmt_clone_finish_s SlonikStmt_clone_finish;
typedef struct SlonikStmt_store_path_s SlonikStmt_store_path;
typedef struct SlonikStmt_drop_path_s SlonikStmt_drop_path;
***************
*** 53,56 ****
--- 55,60 ----
{
STMT_TRY = 1,
+ STMT_CLONE_FINISH,
+ STMT_CLONE_PREPARE,
STMT_CREATE_SET,
STMT_DDL_SCRIPT,
***************
*** 60,63 ****
--- 64,68 ----
STMT_DROP_SET,
STMT_ECHO,
+ STMT_ERROR,
STMT_EXIT,
STMT_FAILED_NODE,
***************
*** 66,71 ****
STMT_MERGE_SET,
STMT_MOVE_SET,
- STMT_RESTART_NODE,
STMT_REPAIR_CONFIG,
STMT_SET_ADD_SEQUENCE,
STMT_SET_ADD_TABLE,
--- 71,76 ----
STMT_MERGE_SET,
STMT_MOVE_SET,
STMT_REPAIR_CONFIG,
+ STMT_RESTART_NODE,
STMT_SET_ADD_SEQUENCE,
STMT_SET_ADD_TABLE,
***************
*** 74,90 ****
STMT_SET_MOVE_SEQUENCE,
STMT_SET_MOVE_TABLE,
STMT_STORE_LISTEN,
STMT_STORE_NODE,
STMT_STORE_PATH,
STMT_SUBSCRIBE_SET,
STMT_UNINSTALL_NODE,
STMT_UNLOCK_SET,
STMT_UNSUBSCRIBE_SET,
STMT_UPDATE_FUNCTIONS,
! STMT_WAIT_EVENT,
! STMT_SWITCH_LOG,
! STMT_ERROR,
! STMT_SYNC,
! STMT_SLEEP
} Slonik_stmttype;
--- 79,94 ----
STMT_SET_MOVE_SEQUENCE,
STMT_SET_MOVE_TABLE,
+ STMT_SLEEP,
STMT_STORE_LISTEN,
STMT_STORE_NODE,
STMT_STORE_PATH,
STMT_SUBSCRIBE_SET,
+ STMT_SWITCH_LOG,
+ STMT_SYNC,
STMT_UNINSTALL_NODE,
STMT_UNLOCK_SET,
STMT_UNSUBSCRIBE_SET,
STMT_UPDATE_FUNCTIONS,
! STMT_WAIT_EVENT
} Slonik_stmttype;
***************
*** 205,208 ****
--- 209,229 ----
+ struct SlonikStmt_clone_prepare_s
+ {
+ SlonikStmt hdr;
+ int no_id;
+ int no_provider;
+ char *no_comment;
+ };
+
+
+ struct SlonikStmt_clone_finish_s
+ {
+ SlonikStmt hdr;
+ int no_id;
+ int no_provider;
+ };
+
+
struct SlonikStmt_store_path_s
{
***************
*** 513,516 ****
--- 534,539 ----
extern int slonik_failed_node(SlonikStmt_failed_node * stmt);
extern int slonik_uninstall_node(SlonikStmt_uninstall_node * stmt);
+ extern int slonik_clone_prepare(SlonikStmt_clone_prepare * stmt);
+ extern int slonik_clone_finish(SlonikStmt_clone_finish * stmt);
extern int slonik_store_path(SlonikStmt_store_path * stmt);
extern int slonik_drop_path(SlonikStmt_drop_path * stmt);
Index: parser.y
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/slonik/parser.y,v
retrieving revision 1.29
retrieving revision 1.30
diff -C2 -d -r1.29 -r1.30
*** parser.y 5 Jul 2007 18:19:04 -0000 1.29
--- parser.y 21 Jan 2008 18:54:11 -0000 1.30
***************
*** 46,50 ****
O_TAB_ID,
O_TIMEOUT,
- O_TRIG_NAME,
O_USE_KEY,
O_WAIT_CONFIRMED,
--- 46,49 ----
***************
*** 135,138 ****
--- 134,139 ----
%type <statement> stmt_failed_node
%type <statement> stmt_uninstall_node
+ %type <statement> stmt_clone_prepare
+ %type <statement> stmt_clone_finish
%type <statement> stmt_store_path
%type <statement> stmt_drop_path
***************
*** 176,179 ****
--- 177,181 ----
%token K_BACKUP
%token K_CLIENT
+ %token K_CLONE
%token K_CLUSTER
%token K_CLUSTERNAME
***************
*** 193,196 ****
--- 195,199 ----
%token K_FALSE
%token K_FILENAME
+ %token K_FINISH
%token K_FOR
%token K_FORWARD
***************
*** 215,218 ****
--- 218,222 ----
%token K_ORIGIN
%token K_PATH
+ %token K_PREPARE
%token K_PROVIDER
%token K_QUALIFIED
***************
*** 429,432 ****
--- 433,440 ----
| stmt_uninstall_node
{ $$ = $1; }
+ | stmt_clone_prepare
+ { $$ = $1; }
+ | stmt_clone_finish
+ { $$ = $1; }
| stmt_store_path
{ $$ = $1; }
***************
*** 698,701 ****
--- 706,767 ----
;
+ stmt_clone_prepare : lno K_CLONE K_PREPARE option_list
+ {
+ SlonikStmt_clone_prepare *new;
+ statement_option opt[] = {
+ STMT_OPTION_INT( O_ID, -1 ),
+ STMT_OPTION_INT( O_PROVIDER, -1 ),
+ STMT_OPTION_STR( O_COMMENT, NULL ),
+ STMT_OPTION_END
+ };
+
+ new = (SlonikStmt_clone_prepare *)
+ malloc(sizeof(SlonikStmt_clone_prepare));
+ memset(new, 0, sizeof(SlonikStmt_clone_prepare));
+ new->hdr.stmt_type = STMT_CLONE_PREPARE;
+ new->hdr.stmt_filename = current_file;
+ new->hdr.stmt_lno = $1;
+
+ if (assign_options(opt, $4) == 0)
+ {
+ new->no_id = opt[0].ival;
+ new->no_provider = opt[1].ival;
+ new->no_comment = opt[2].str;
+ }
+ else
+ parser_errors++;
+
+ $$ = (SlonikStmt *)new;
+ }
+ ;
+
+ stmt_clone_finish : lno K_CLONE K_FINISH option_list
+ {
+ SlonikStmt_clone_finish *new;
+ statement_option opt[] = {
+ STMT_OPTION_INT( O_ID, -1 ),
+ STMT_OPTION_INT( O_PROVIDER, -1 ),
+ STMT_OPTION_END
+ };
+
+ new = (SlonikStmt_clone_finish *)
+ malloc(sizeof(SlonikStmt_clone_finish));
+ memset(new, 0, sizeof(SlonikStmt_clone_finish));
+ new->hdr.stmt_type = STMT_CLONE_FINISH;
+ new->hdr.stmt_filename = current_file;
+ new->hdr.stmt_lno = $1;
+
+ if (assign_options(opt, $4) == 0)
+ {
+ new->no_id = opt[0].ival;
+ new->no_provider = opt[1].ival;
+ }
+ else
+ parser_errors++;
+
+ $$ = (SlonikStmt *)new;
+ }
+ ;
+
stmt_store_path : lno K_STORE K_PATH option_list
{
Index: slonik.c
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/slonik/slonik.c,v
retrieving revision 1.84
retrieving revision 1.85
diff -C2 -d -r1.84 -r1.85
*** slonik.c 8 Jan 2008 20:43:24 -0000 1.84
--- slonik.c 21 Jan 2008 18:54:11 -0000 1.85
***************
*** 380,383 ****
--- 380,411 ----
break;
+ case STMT_CLONE_PREPARE:
+ {
+ SlonikStmt_clone_prepare *stmt =
+ (SlonikStmt_clone_prepare *) hdr;
+
+ if (stmt->no_id < 0)
+ {
+ printf("%s:%d: Error: "
+ "new node ID must be specified\n",
+ hdr->stmt_filename, hdr->stmt_lno);
+ errors++;
+ }
+
+ if (script_check_adminfo(hdr, stmt->no_provider) < 0)
+ errors++;
+ }
+ break;
+
+ case STMT_CLONE_FINISH:
+ {
+ SlonikStmt_clone_finish *stmt =
+ (SlonikStmt_clone_finish *) hdr;
+
+ if (script_check_adminfo(hdr, stmt->no_id) < 0)
+ errors++;
+ }
+ break;
+
case STMT_STORE_PATH:
{
***************
*** 1212,1215 ****
--- 1240,1263 ----
break;
+ case STMT_CLONE_PREPARE:
+ {
+ SlonikStmt_clone_prepare *stmt =
+ (SlonikStmt_clone_prepare *) hdr;
+
+ if (slonik_clone_prepare(stmt) < 0)
+ errors++;
+ }
+ break;
+
+ case STMT_CLONE_FINISH:
+ {
+ SlonikStmt_clone_finish *stmt =
+ (SlonikStmt_clone_finish *) hdr;
+
+ if (slonik_clone_finish(stmt) < 0)
+ errors++;
+ }
+ break;
+
case STMT_STORE_PATH:
{
***************
*** 1871,1874 ****
--- 1919,1923 ----
}
+
static int
slonik_repair_config(SlonikStmt_repair_config * stmt)
***************
*** 2873,2876 ****
--- 2922,2987 ----
int
+ slonik_clone_prepare(SlonikStmt_clone_prepare * stmt)
+ {
+ SlonikAdmInfo *adminfo1;
+ SlonDString query;
+
+ adminfo1 = get_active_adminfo((SlonikStmt *) stmt, stmt->no_provider);
+ if (adminfo1 == NULL)
+ return -1;
+
+ dstring_init(&query);
+
+ if (stmt->no_comment == NULL)
+ slon_mkquery(&query,
+ "select \"_%s\".cloneNodePrepare(%d, %d, 'Node %d'); ",
+ stmt->hdr.script->clustername,
+ stmt->no_id, stmt->no_provider,
+ stmt->no_id);
+ else
+ slon_mkquery(&query,
+ "select \"_%s\".cloneNodePrepare(%d, %d, '%q'); ",
+ stmt->hdr.script->clustername,
+ stmt->no_id, stmt->no_provider,
+ stmt->no_comment);
+ if (db_exec_evcommand((SlonikStmt *) stmt, adminfo1, &query) < 0)
+ {
+ dstring_free(&query);
+ return -1;
+ }
+
+ dstring_free(&query);
+ return 0;
+ }
+
+
+ int
+ slonik_clone_finish(SlonikStmt_clone_finish * stmt)
+ {
+ SlonikAdmInfo *adminfo1;
+ SlonDString query;
+
+ adminfo1 = get_active_adminfo((SlonikStmt *) stmt, stmt->no_id);
+ if (adminfo1 == NULL)
+ return -1;
+
+ dstring_init(&query);
+
+ slon_mkquery(&query,
+ "select \"_%s\".cloneNodeFinish(%d, %d); ",
+ stmt->hdr.script->clustername,
+ stmt->no_id, stmt->no_provider);
+ if (db_exec_command((SlonikStmt *) stmt, adminfo1, &query) < 0)
+ {
+ dstring_free(&query);
+ return -1;
+ }
+
+ dstring_free(&query);
+ return 0;
+ }
+
+
+ int
slonik_store_path(SlonikStmt_store_path * stmt)
{
Index: scan.l
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/slonik/scan.l,v
retrieving revision 1.28
retrieving revision 1.29
diff -C2 -d -r1.28 -r1.29
*** scan.l 5 Jul 2007 18:19:04 -0000 1.28
--- scan.l 21 Jan 2008 18:54:11 -0000 1.29
***************
*** 72,75 ****
--- 72,76 ----
backup { return K_BACKUP; }
client { return K_CLIENT; }
+ clone { return K_CLONE; }
cluster { return K_CLUSTER; }
comment { return K_COMMENT; }
***************
*** 88,91 ****
--- 89,93 ----
false { return K_FALSE; }
filename { return K_FILENAME; }
+ finish { return K_FINISH; }
for { return K_FOR; }
forward { return K_FORWARD; }
***************
*** 111,114 ****
--- 113,117 ----
origin { return K_ORIGIN; }
path { return K_PATH; }
+ prepare { return K_PREPARE; }
provider { return K_PROVIDER; }
qualified { return K_QUALIFIED; }
- Previous message: [Slony1-commit] slony1-engine/src/slon local_listen.c remote_worker.c
- Next message: [Slony1-commit] slony1-engine RELEASE-2.0
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Slony1-commit mailing list