Jan Wieck wieck at lists.slony.info
Mon Jan 21 10:54:13 PST 2008
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;		}



More information about the Slony1-commit mailing list