Proposed patch: synchronized_scanning GUC variable - Mailing list pgsql-patches

From Tom Lane
Subject Proposed patch: synchronized_scanning GUC variable
Date
Msg-id 12059.1201464449@sss.pgh.pa.us
Whole thread Raw
Responses Re: Proposed patch: synchronized_scanning GUC variable  ("Jonah H. Harris" <jonah.harris@gmail.com>)
Re: Proposed patch: synchronized_scanning GUC variable  (Russell Smith <mr-russ@pws.com.au>)
Re: Proposed patch: synchronized_scanning GUC variable  (Jeff Davis <pgsql@j-davis.com>)
List pgsql-patches
Per today's -hackers discussion, add a GUC variable to allow clients to
disable the new synchronized-scanning behavior, and make pg_dump disable
sync scans so that it will reliably preserve row ordering.  This is a
pretty trivial patch, but seeing how late we are in the 8.3 release
cycle, I thought I'd better post it for comment anyway.

            regards, tom lane

Index: doc/src/sgml/config.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/config.sgml,v
retrieving revision 1.162
diff -c -r1.162 config.sgml
*** doc/src/sgml/config.sgml    27 Jan 2008 19:12:28 -0000    1.162
--- doc/src/sgml/config.sgml    27 Jan 2008 20:00:16 -0000
***************
*** 4611,4616 ****
--- 4611,4638 ----
        </listitem>
       </varlistentry>

+      <varlistentry id="guc-synchronized-scanning" xreflabel="synchronized_scanning">
+       <term><varname>synchronized_scanning</varname> (<type>boolean</type>)</term>
+       <indexterm>
+        <primary><varname>synchronized_scanning</> configuration parameter</primary>
+       </indexterm>
+       <listitem>
+        <para>
+         This allows sequential scans of large tables to synchronize with each
+         other, so that concurrent scans read the same block at about the
+         same time and hence share the I/O workload.  When this is enabled,
+         a scan might start in the middle of the table and then <quote>wrap
+         around</> the end to cover all rows, so as to synchronize with the
+         activity of scans already in progress.  This can result in
+         unpredictable changes in the row ordering returned by queries that
+         have no <literal>ORDER BY</> clause.  Setting this parameter to
+         <literal>off</> ensures the pre-8.3 behavior in which a sequential
+         scan always starts from the beginning of the table.  The default
+         is <literal>on</>.
+        </para>
+       </listitem>
+      </varlistentry>
+
       </variablelist>
      </sect2>

Index: src/backend/access/heap/heapam.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v
retrieving revision 1.248
diff -c -r1.248 heapam.c
*** src/backend/access/heap/heapam.c    14 Jan 2008 01:39:09 -0000    1.248
--- src/backend/access/heap/heapam.c    27 Jan 2008 20:00:18 -0000
***************
*** 59,64 ****
--- 59,68 ----
  #include "utils/syscache.h"


+ /* GUC variable */
+ bool    synchronized_scanning = true;
+
+
  static HeapScanDesc heap_beginscan_internal(Relation relation,
                          Snapshot snapshot,
                          int nkeys, ScanKey key,
***************
*** 104,110 ****
       * the thresholds for these features could be different, we make them the
       * same so that there are only two behaviors to tune rather than four.
       * (However, some callers need to be able to disable one or both of
!      * these behaviors, independently of the size of the table.)
       *
       * During a rescan, don't make a new strategy object if we don't have to.
       */
--- 108,115 ----
       * the thresholds for these features could be different, we make them the
       * same so that there are only two behaviors to tune rather than four.
       * (However, some callers need to be able to disable one or both of
!      * these behaviors, independently of the size of the table; also there
!      * is a GUC variable that can disable synchronized scanning.)
       *
       * During a rescan, don't make a new strategy object if we don't have to.
       */
***************
*** 129,135 ****
          scan->rs_strategy = NULL;
      }

!     if (allow_sync)
      {
          scan->rs_syncscan = true;
          scan->rs_startblock = ss_get_location(scan->rs_rd, scan->rs_nblocks);
--- 134,140 ----
          scan->rs_strategy = NULL;
      }

!     if (allow_sync && synchronized_scanning)
      {
          scan->rs_syncscan = true;
          scan->rs_startblock = ss_get_location(scan->rs_rd, scan->rs_nblocks);
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.431
diff -c -r1.431 guc.c
*** src/backend/utils/misc/guc.c    27 Jan 2008 19:12:28 -0000    1.431
--- src/backend/utils/misc/guc.c    27 Jan 2008 20:00:18 -0000
***************
*** 110,115 ****
--- 110,116 ----
  extern int    CommitSiblings;
  extern char *default_tablespace;
  extern char *temp_tablespaces;
+ extern bool synchronized_scanning;
  extern bool fullPageWrites;

  #ifdef TRACE_SORT
***************
*** 1053,1058 ****
--- 1054,1068 ----
      },

      {
+         {"synchronized_scanning", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
+             gettext_noop("Enable synchronized scans."),
+             NULL
+         },
+         &synchronized_scanning,
+         true, NULL, NULL
+     },
+
+     {
          {"archive_mode", PGC_POSTMASTER, WAL_SETTINGS,
              gettext_noop("Allows archiving of WAL files using archive_command."),
              NULL
Index: src/backend/utils/misc/postgresql.conf.sample
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/misc/postgresql.conf.sample,v
retrieving revision 1.235
diff -c -r1.235 postgresql.conf.sample
*** src/backend/utils/misc/postgresql.conf.sample    27 Jan 2008 19:12:28 -0000    1.235
--- src/backend/utils/misc/postgresql.conf.sample    27 Jan 2008 20:00:18 -0000
***************
*** 476,484 ****
  #backslash_quote = safe_encoding    # on, off, or safe_encoding
  #default_with_oids = off
  #escape_string_warning = on
- #standard_conforming_strings = off
  #regex_flavor = advanced        # advanced, extended, or basic
  #sql_inheritance = on

  # - Other Platforms and Clients -

--- 476,485 ----
  #backslash_quote = safe_encoding    # on, off, or safe_encoding
  #default_with_oids = off
  #escape_string_warning = on
  #regex_flavor = advanced        # advanced, extended, or basic
  #sql_inheritance = on
+ #standard_conforming_strings = off
+ #synchronized_scanning = on

  # - Other Platforms and Clients -

Index: src/bin/pg_dump/pg_dump.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v
retrieving revision 1.481
diff -c -r1.481 pg_dump.c
*** src/bin/pg_dump/pg_dump.c    1 Jan 2008 19:45:55 -0000    1.481
--- src/bin/pg_dump/pg_dump.c    27 Jan 2008 20:00:18 -0000
***************
*** 553,558 ****
--- 553,572 ----
      do_sql_command(g_conn, "SET DATESTYLE = ISO");

      /*
+      * If supported, set extra_float_digits so that we can dump float data
+      * exactly (given correctly implemented float I/O code, anyway)
+      */
+     if (g_fout->remoteVersion >= 70400)
+         do_sql_command(g_conn, "SET extra_float_digits TO 2");
+
+     /*
+      * If synchronized scanning is supported, disable it, to prevent
+      * unpredictable changes in row ordering across a dump and reload.
+      */
+     if (g_fout->remoteVersion >= 80300)
+         do_sql_command(g_conn, "SET synchronized_scanning TO off");
+
+     /*
       * Start serializable transaction to dump consistent data.
       */
      do_sql_command(g_conn, "BEGIN");
***************
*** 567,579 ****
      else
          username_subquery = "SELECT usename FROM pg_user WHERE usesysid =";

-     /*
-      * If supported, set extra_float_digits so that we can dump float data
-      * exactly (given correctly implemented float I/O code, anyway)
-      */
-     if (g_fout->remoteVersion >= 70400)
-         do_sql_command(g_conn, "SET extra_float_digits TO 2");
-
      /* Find the last built-in OID, if needed */
      if (g_fout->remoteVersion < 70300)
      {
--- 581,586 ----

pgsql-patches by date:

Previous
From: "Guillaume Smet"
Date:
Subject: Re: [8.4] Updated WITH clause patch (non-recursive)
Next
From: "Jonah H. Harris"
Date:
Subject: Re: Proposed patch: synchronized_scanning GUC variable