CVS User Account cvsuser
Fri Oct 22 15:46:11 PDT 2004
Log Message:
-----------
Prevent mergeSet(), setMoveTable() and setMoveSequence()
to work while pending subscriptions exist. This prevents
breaking of replication as reported per bug #896.

Jan

Tags:
----
REL_1_0_STABLE

Modified Files:
--------------
    slony1-engine/src/backend:
        slony1_funcs.sql (r1.15.2.8 -> r1.15.2.9)
    slony1-engine/src/slonik:
        slonik.c (r1.27.2.5 -> r1.27.2.6)

-------------- next part --------------
Index: slony1_funcs.sql
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/backend/slony1_funcs.sql,v
retrieving revision 1.15.2.8
retrieving revision 1.15.2.9
diff -Lsrc/backend/slony1_funcs.sql -Lsrc/backend/slony1_funcs.sql -u -w -r1.15.2.8 -r1.15.2.9
--- src/backend/slony1_funcs.sql
+++ src/backend/slony1_funcs.sql
@@ -1947,6 +1947,42 @@
 	end if;
 
 	-- ----
+	-- Also check that there are no unconfirmed enable subscriptions
+	-- still lingering (prevents bug 896)
+	-- ----
+	if exists (select true from @NAMESPACE at .sl_event
+				where ev_origin = v_origin
+				and ev_type = ''ENABLE_SUBSCRIPTION''
+				and ev_data1 = p_set_id
+				and ev_seqno > (select min(max_con_seqno) from
+					(select con_received, max(con_seqno) as max_con_seqno
+							from @NAMESPACE at .sl_confirm
+							where con_origin = v_origin
+							group by con_received) as CON
+					)
+				)
+	then
+		raise exception ''Slony-I: set % cannot be merged because of pending subscription'',
+				p_set_id;
+	end if;
+
+	if exists (select true from @NAMESPACE at .sl_event
+				where ev_origin = v_origin
+				and ev_type = ''ENABLE_SUBSCRIPTION''
+				and ev_data1 = p_add_id
+				and ev_seqno > (select min(max_con_seqno) from
+					(select con_received, max(con_seqno) as max_con_seqno
+							from @NAMESPACE at .sl_confirm
+							where con_origin = v_origin
+							group by con_received) as CON
+					)
+				)
+	then
+		raise exception ''Slony-I: set % cannot be merged because of pending subscription'',
+				p_add_id;
+	end if;
+
+	-- ----
 	-- Create a SYNC event, merge the sets, create a MERGE_SET event
 	-- ----
 	perform @NAMESPACE at .createEvent(''_ at CLUSTERNAME@'', ''SYNC'', NULL);
@@ -2606,6 +2642,40 @@
 	end if;
 
 	-- ----
+	-- Also check that there are no unconfirmed enable subscriptions
+	-- still lingering (prevents bug 896)
+	-- ----
+	if exists (select true from @NAMESPACE at .sl_event
+				where ev_origin = v_origin
+				and ev_type = ''ENABLE_SUBSCRIPTION''
+				and ev_data1 = v_old_set_id
+				and ev_seqno > (select min(max_con_seqno) from
+					(select con_received, max(con_seqno) as max_con_seqno
+							from @NAMESPACE at .sl_confirm
+							where con_origin = v_origin
+							group by con_received) as CON
+					)
+				)
+	then
+		raise exception ''Slony-I: table cannot be moved because of pending subscription'';
+	end if;
+
+	if exists (select true from @NAMESPACE at .sl_event
+				where ev_origin = v_origin
+				and ev_type = ''ENABLE_SUBSCRIPTION''
+				and ev_data1 = p_new_set_id
+				and ev_seqno > (select min(max_con_seqno) from
+					(select con_received, max(con_seqno) as max_con_seqno
+							from @NAMESPACE at .sl_confirm
+							where con_origin = v_origin
+							group by con_received) as CON
+					)
+				)
+	then
+		raise exception ''Slony-I: table cannot be moved because of pending subscription'';
+	end if;
+
+	-- ----
 	-- Change the set the table belongs to
 	-- ----
 	perform @NAMESPACE at .createEvent(''_ at CLUSTERNAME@'', ''SYNC'', NULL);
@@ -2723,6 +2793,40 @@
 	end if;
 
 	-- ----
+	-- Also check that there are no unconfirmed enable subscriptions
+	-- still lingering (prevents bug 896)
+	-- ----
+	if exists (select true from @NAMESPACE at .sl_event
+				where ev_origin = v_origin
+				and ev_type = ''ENABLE_SUBSCRIPTION''
+				and ev_data1 = v_old_set_id
+				and ev_seqno > (select min(max_con_seqno) from
+					(select con_received, max(con_seqno) as max_con_seqno
+							from @NAMESPACE at .sl_confirm
+							where con_origin = v_origin
+							group by con_received) as CON
+					)
+				)
+	then
+		raise exception ''Slony-I: sequence cannot be moved because of pending subscription'';
+	end if;
+
+	if exists (select true from @NAMESPACE at .sl_event
+				where ev_origin = v_origin
+				and ev_type = ''ENABLE_SUBSCRIPTION''
+				and ev_data1 = p_new_set_id
+				and ev_seqno > (select min(max_con_seqno) from
+					(select con_received, max(con_seqno) as max_con_seqno
+							from @NAMESPACE at .sl_confirm
+							where con_origin = v_origin
+							group by con_received) as CON
+					)
+				)
+	then
+		raise exception ''Slony-I: sequence cannot be moved because of pending subscription'';
+	end if;
+
+	-- ----
 	-- Change the set the sequence belongs to
 	-- ----
 	perform @NAMESPACE at .setMoveSequence_int(p_seq_id, p_new_set_id);
Index: slonik.c
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/slonik.c,v
retrieving revision 1.27.2.5
retrieving revision 1.27.2.6
diff -Lsrc/slonik/slonik.c -Lsrc/slonik/slonik.c -u -w -r1.27.2.5 -r1.27.2.6
--- src/slonik/slonik.c
+++ src/slonik/slonik.c
@@ -1861,6 +1861,22 @@
 			}
 			break;
 
+		case 8:
+			switch (adminfo->version_minor)
+			{
+				case 0:
+					use_major = 7;
+					use_minor = 4;
+					break;
+
+				default:
+					printf("%s:%d: unsupported PostgreSQL "
+							"version %d.%d\n",
+							stmt->stmt_filename, stmt->stmt_lno,
+							adminfo->version_major, adminfo->version_minor);
+			}
+			break;
+
 		default:
 			printf("%s:%d: unsupported PostgreSQL "
 					"version %d.%d\n",


More information about the Slony1-commit mailing list