Chris Browne cbbrowne at lists.slony.info
Wed Apr 16 14:23:56 PDT 2008
Update of /home/cvsd/slony1/slony1-engine/src/backend
In directory main.slony.info:/tmp/cvs-serv2287/backend

Modified Files:
	slony1_funcs.c slony1_funcs.sql 
Log Message:
Rectify problem with DDL when hitting the following conditions:
- Running a DDL change that does updates on a replicated table
  (e.g. - such as if you add a new column, and have to populate
  it)

Error condition found:
  - The denyaccess triggers *do* fire on the replica table;
    there is nothing to suppress them

Solution:
  - Change the denyaccess() function to check the replication
    role GUC; it only needs to error out when in "origin" role;
    if in "local" role (which is what slon sets, when running
    DDL on a subscriber node), there is no problem.

- As above, when running "ONLY ON" a subscriber node

Error condition found:
  - The DDL request is run by slonik, directly, and does not
    set the session_replication_role to 'local'

Solution:
  - Change the ddlscript_prepare(), when running ONLY ON, and 
    on a non-origin node, to set the session_replication_role to 'local'


Index: slony1_funcs.c
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/backend/slony1_funcs.c,v
retrieving revision 1.64
retrieving revision 1.65
diff -C2 -d -r1.64 -r1.65
*** slony1_funcs.c	27 Mar 2008 15:01:54 -0000	1.64
--- slony1_funcs.c	16 Apr 2008 21:23:54 -0000	1.65
***************
*** 846,853 ****
  		elog(ERROR, "Slony-I: SPI_connect() failed in denyAccess()");
  
! 	elog(ERROR,
! 		 "Slony-I: Table %s is replicated and cannot be "
! 		 "modified on a subscriber node",
! 		 NameStr(tg->tg_relation->rd_rel->relname));
  
  	SPI_finish();
--- 846,860 ----
  		elog(ERROR, "Slony-I: SPI_connect() failed in denyAccess()");
  
! 	/*
! 	 * If the replication role is:
! 	 *  ORIGIN - default role --> FAIL
! 	 *  REPLICA - this trigger will not fire in --> N/A
!      *  LOCAL - role when running "local updates" --> PERMIT UPDATE
!      */
! 	if (SessionReplicationRole == SESSION_REPLICATION_ROLE_ORIGIN)
! 			elog(ERROR,
! 				 "Slony-I: Table %s is replicated and cannot be "
! 				 "modified on a subscriber node - role=%d",
! 				 NameStr(tg->tg_relation->rd_rel->relname), SessionReplicationRole);
  
  	SPI_finish();

Index: slony1_funcs.sql
===================================================================
RCS file: /home/cvsd/slony1/slony1-engine/src/backend/slony1_funcs.sql,v
retrieving revision 1.135
retrieving revision 1.136
diff -C2 -d -r1.135 -r1.136
*** slony1_funcs.sql	11 Apr 2008 15:08:19 -0000	1.135
--- slony1_funcs.sql	16 Apr 2008 21:23:54 -0000	1.136
***************
*** 3598,3601 ****
--- 3598,3608 ----
  		-- ----
  		perform @NAMESPACE at .createEvent(''_ at CLUSTERNAME@'', ''SYNC'', NULL);
+ 	else
+ 		-- If running "ONLY ON NODE", there are two possibilities:
+ 		-- 1.  Running on origin, where denyaccess() triggers are already shut off
+ 		-- 2.  Running on replica, where we need the LOCAL role to suppress denyaccess() triggers
+ 		if (v_set_origin <> @NAMESPACE at .getLocalNodeId(''_ at CLUSTERNAME@'') then
+ 			set session_replication_role to local;
+ 		end if
  	end if;
  	return 1;



More information about the Slony1-commit mailing list