CVS User Account cvsuser
Wed Aug 17 15:42:52 PDT 2005
Log Message:
-----------
Add "lag_interval" option to slon

This allows a slon to have, passed to it, a time interval.  The slon
will then ignore events until they have become older than that interval.

This allows the Gentle User to set up a subscriber that will steadily
lag by 1 hour, so you could query an old state of the database.

Modified Files:
--------------
    slony1-engine/doc/adminguide:
        slon.sgml (r1.17 -> r1.18)
        slonconf.sgml (r1.9 -> r1.10)
    slony1-engine/src/slon:
        confoptions.h (r1.24 -> r1.25)
        remote_listen.c (r1.21 -> r1.22)
        slon.c (r1.56 -> r1.57)

-------------- next part --------------
Index: slonconf.sgml
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/doc/adminguide/slonconf.sgml,v
retrieving revision 1.9
retrieving revision 1.10
diff -Ldoc/adminguide/slonconf.sgml -Ldoc/adminguide/slonconf.sgml -u -w -r1.9 -r1.10
--- doc/adminguide/slonconf.sgml
+++ doc/adminguide/slonconf.sgml
@@ -318,6 +318,23 @@
       </listitem>
     </varlistentry>
 
+    <varlistentry id="slon-config-lag-interval" xreflabel="lag_interval">
+      <term><varname>lag_interval</varname>  (<type>string/interval</type>)</term>
+      <indexterm>
+        <primary><varname>lag_interval</varname> configuration parameter</primary>
+      </indexterm>
+      <listitem>
+        <para>Indicates an interval by which this node should lag its
+        providers.  If set, this is used in the event processing loop
+        to modify what events are to be considered for queueing; those
+        events newer than <command> now() - lag_interval::interval
+        </command> are left out, to be processed later.  </para>
+
+	<para>If the value is left empty, this logic will be ignored.
+        </para>
+      </listitem>
+    </varlistentry>
+
   </variablelist>
 </sect1>
 </article>
Index: slon.sgml
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/doc/adminguide/slon.sgml,v
retrieving revision 1.17
retrieving revision 1.18
diff -Ldoc/adminguide/slon.sgml -Ldoc/adminguide/slon.sgml -u -w -r1.17 -r1.18
--- doc/adminguide/slon.sgml
+++ doc/adminguide/slon.sgml
@@ -331,6 +331,20 @@
     </listitem>
    </varlistentry>
 
+   <varlistentry>
+    <term><option>-l</option><replaceable class="parameter"> lag interval </replaceable></term>
+    <listitem>
+     <para>
+      <envar>lag_interval</envar> indicates an interval value such as
+      <command> 3 minutes </command> or <command> 4 hours </command>
+      or <command> 2 days </command> that indicates that this node is
+      to lag its providers by the specified interval of time.  This
+      causes events to be ignored until they reach the age
+      corresponding to the interval.
+     </para>
+    </listitem>
+   </varlistentry>
+
   </variablelist>
  </refsect1>
  <refsect1>
Index: confoptions.h
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slon/confoptions.h,v
retrieving revision 1.24
retrieving revision 1.25
diff -Lsrc/slon/confoptions.h -Lsrc/slon/confoptions.h -u -w -r1.24 -r1.25
--- src/slon/confoptions.h
+++ src/slon/confoptions.h
@@ -37,6 +37,7 @@
 bool            drop_indices;
 char		*log_timestamp_format;
 char		*sql_on_connection;
+char		*lag_interval;
 
 enum config_type
 {
@@ -330,6 +331,20 @@
 	},
 
 
+	{
+		{
+			(const char *)"lag_interval",
+			gettext_noop("A PostgreSQL value compatible with ::interval "
+				     "which indicates how far behind this node should "
+				     "lag its providers."),
+			NULL,
+			SLON_C_STRING
+		},
+		&lag_interval,
+		NULL
+	},
+
+
 
 #ifdef HAVE_SYSLOG
 	{
Index: remote_listen.c
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slon/remote_listen.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -Lsrc/slon/remote_listen.c -Lsrc/slon/remote_listen.c -u -w -r1.21 -r1.22
--- src/slon/remote_listen.c
+++ src/slon/remote_listen.c
@@ -57,7 +57,7 @@
 static int remoteListen_receive_events(SlonNode * node,
 							SlonConn * conn, struct listat *listat);
 
-
+extern char *lag_interval;
 
 /*
  * ---------- slon_remoteListenThread
@@ -586,6 +586,7 @@
 {
 	SlonNode   *origin;
 	SlonDString query;
+	SlonDString q2;
 	char	   *where_or_or;
 	char		seqno_buf[64];
 	PGresult   *res;
@@ -620,6 +621,11 @@
 	rtcfg_lock();
 
 	where_or_or = "where";
+	if (lag_interval) {
+		dstring_init(&q2);
+		slon_mkquery(&q2, "where ev_timestamp < now() - '%s'::interval and (", lag_interval);
+		where_or_or = dstring_data(&q2);
+	}
 	while (listat)
 	{
 		if ((origin = rtcfg_findNode(listat->li_origin)) == NULL)
@@ -639,6 +645,9 @@
 		where_or_or = "or";
 		listat = listat->next;
 	}
+	if (lag_interval) {
+		slon_appendquery(&query, ")");
+	}
 	slon_appendquery(&query, " order by e.ev_origin, e.ev_seqno");
 
 	rtcfg_unlock();
Index: slon.c
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slon/slon.c,v
retrieving revision 1.56
retrieving revision 1.57
diff -Lsrc/slon/slon.c -Lsrc/slon/slon.c -u -w -r1.56 -r1.57
--- src/slon/slon.c
+++ src/slon/slon.c
@@ -121,7 +121,7 @@
 	
 	InitializeConfOptions();
 
-	while ((c = getopt(argc, argv, "f:a:d:s:t:g:c:p:o:q:r:hv")) != EOF)
+	while ((c = getopt(argc, argv, "f:a:d:s:t:g:c:p:o:q:r:l:hv")) != EOF)
 	{
 		switch (c)
 		{
@@ -169,6 +169,10 @@
 				set_config_option("desired_sync_time", optarg);
 				break;
 
+			case 'l':
+				set_config_option("lag_interval", optarg);
+				break;
+
 			case 'h':
 				errors++;
 				break;
@@ -254,6 +258,7 @@
 		fprintf(stderr, "    -a <directory>        directory to store SYNC archive files\n");
 		fprintf(stderr, "    -q <num>              Terminate when this node reaches # of SYNCs\n");
 		fprintf(stderr, "    -r <num>              # of syncs for -q option\n");
+		fprintf(stderr, "    -l <interval>         this node should lag providers by this interval\n");
 		return 1;
 	}
 


More information about the Slony1-commit mailing list