~ubuntu-branches/ubuntu/quantal/postgresql-9.1/quantal-proposed

« back to all changes in this revision

Viewing changes to src/backend/replication/walsender.c

  • Committer: Package Import Robot
  • Author(s): Martin Pitt
  • Date: 2011-12-02 14:39:18 UTC
  • mfrom: (12.1.1 sid)
  • Revision ID: package-import@ubuntu.com-20111202143918-1ftj0oo87w0y8m8d
* New upstream bug fix release:
  - Fix bugs in information_schema.referential_constraints view.
    This view was being insufficiently careful about matching the
    foreign-key constraint to the depended-on primary or unique key
    constraint. That could result in failure to show a foreign key
    constraint at all, or showing it multiple times, or claiming that
    it depends on a different constraint than the one it really does.
    Since the view definition is installed by initdb, merely upgrading
    will not fix the problem. If you need to fix this in an existing
    installation, you can (as a superuser) drop the information_schema
    schema then re-create it by sourcing
    "SHAREDIR/information_schema.sql". (Run pg_config --sharedir if
    you're uncertain where "SHAREDIR" is.) This must be repeated in
    each database to be fixed.
  - Make "contrib/citext"'s upgrade script fix collations of citext
    columns and indexes.
    Existing citext columns and indexes aren't correctly marked as
    being of a collatable data type during pg_upgrade from a pre-9.1
    server. That leads to operations on them failing with errors such
    as "could not determine which collation to use for string
    comparison". This change allows them to be fixed by the same script
    that upgrades the citext module into a proper 9.1 extension during
    CREATE EXTENSION citext FROM unpackaged.
    If you have a previously-upgraded database that is suffering from
    this problem, and you already ran the "CREATE EXTENSION" command,
    you can manually run (as superuser) the "UPDATE" commands found at
    the end of "SHAREDIR/extension/citext--unpackaged--1.0.sql". (Run
    pg_config --sharedir if you're uncertain where "SHAREDIR" is.)
  - Fix possible crash during "UPDATE" or "DELETE" that joins to the
    output of a scalar-returning function.
  - Fix incorrect replay of WAL records for GIN index updates.
  - Fix TOAST-related data corruption during CREATE TABLE dest AS
    SELECT - FROM src or INSERT INTO dest SELECT * FROM src.
  - Fix possible failures during hot standby startup.
  - Start hot standby faster when initial snapshot is incomplete.
  - Fix race condition during toast table access from stale syscache
    entries. The typical symptom was transient errors like "missing chunk
    number 0 for toast value NNNNN in pg_toast_2619", where the cited toast
    table would always belong to a system catalog.
  - Track dependencies of functions on items used in parameter default
    expressions. Previously, a referenced object could be dropped without
    having dropped or modified the function, leading to misbehavior when
    the function was used. Note that merely installing this update will not
    fix the missing dependency entries; to do that, you'd need to
    "CREATE OR REPLACE" each such function afterwards. If you have
    functions whose defaults depend on non-built-in objects, doing so
    is recommended.
  - Fix incorrect management of placeholder variables in nestloop joins.
    This bug is known to lead to "variable not found in subplan target
    list" planner errors, and could possibly result in wrong query
    output when outer joins are involved.
  - Fix window functions that sort by expressions involving aggregates.
  - Fix "MergeAppend child's targetlist doesn't match MergeAppend"
    planner errors.
  - Fix index matching for operators with both collatable and
    noncollatable inputs. In 9.1.0, an indexable operator that has a
    non-collatable left-hand input type and a collatable right-hand input
    type would not be recognized as matching the left-hand column's index.
    An example is the hstore ? text operator.
  - Allow inlining of set-returning SQL functions with multiple OUT
    parameters.
  - Don't trust deferred-unique indexes for join removal.
  - Make DatumGetInetP() unpack inet datums that have a 1-byte header,
    and add a new macro, DatumGetInetPP(), that does not.
  - Improve locale support in money type's input and output.
    Aside from not supporting all standard lc_monetary formatting
    options, the input and output functions were inconsistent, meaning
    there were locales in which dumped money values could not be
    re-read.
  - Don't let transform_null_equals affect CASE foo WHEN NULL ...
    constructs.  transform_null_equals is only supposed to affect foo =
    NULL expressions written directly by the user, not equality checks
    generated internally by this form of CASE.
  - Change foreign-key trigger creation order to better support
    self-referential foreign keys.
  - Fix IF EXISTS to work correctly in "DROP OPERATOR FAMILY".
  - Disallow dropping of an extension from within its own script.
  - Don't mark auto-generated types as extension members.
  - Cope with invalid pre-existing search_path settings during "CREATE
    EXTENSION".
  - Avoid floating-point underflow while tracking buffer allocation
    rate.
  - Prevent autovacuum transactions from running in serializable mode.
    Autovacuum formerly used the cluster-wide default transaction
    isolation level, but there is no need for it to use anything higher
    than READ COMMITTED, and using SERIALIZABLE could result in
    unnecessary delays for other processes.
  - Ensure walsender processes respond promptly to SIGTERM.
  - Exclude "postmaster.opts" from base backups.
  - Fix incorrect field alignment in ecpg's SQLDA area.
  - Preserve blank lines within commands in psql's command history.
    The former behavior could cause problems if an empty line was
    removed from within a string literal, for example.
  - Avoid platform-specific infinite loop in pg_dump.
  - Fix compression of plain-text output format in pg_dump.
    pg_dump has historically understood -Z with no -F switch to mean
    that it should emit a gzip-compressed version of its plain text
    output. Restore that behavior.
  - Fix pg_dump to dump user-defined casts between auto-generated
    types, such as table rowtypes.
  - Fix missed quoting of foreign server names in pg_dump.
  - Assorted fixes for pg_upgrade. Handle exclusion constraints correctly,
    avoid failures on Windows, don't complain about mismatched toast table
    names in 8.4 databases.
  - In PL/pgSQL, allow foreign tables to define row types.
  - Fix up conversions of PL/Perl functions' results.
    Restore the pre-9.1 behavior that PL/Perl functions returning void
    ignore the result value of their last Perl statement; 9.1.0 would
    throw an error if that statement returned a reference. Also, make
    sure it works to return a string value for a composite type, so
    long as the string meets the type's input format. In addition,
    throw errors for attempts to return Perl arrays or hashes when the
    function's declared result type is not an array or composite type,
    respectively. (Pre-9.1 versions rather uselessly returned strings
    like ARRAY(0x221a9a0) or HASH(0x221aa90) in such cases.)
  - Ensure PL/Perl strings are always correctly UTF8-encoded.
  - Use the preferred version of xsubpp to build PL/Perl, not
    necessarily the operating system's main copy.
  - Correctly propagate SQLSTATE in PL/Python exceptions.
  - Do not install PL/Python extension files for Python major versions
    other than the one built against.
  - Change all the "contrib" extension script files to report a useful
    error message if they are fed to psql. This should help teach people
    about the new method of using "CREATE EXTENSION" to load these files.
    In most cases, sourcing the scripts directly would fail anyway, but
    with harder-to-interpret messages.
  - Fix incorrect coding in "contrib/dict_int" and "contrib/dict_xsyn".
  - Remove "contrib/sepgsql" tests from the regular regression test
    mechanism. Since these tests require root privileges for setup, they're
    impractical to run automatically. Switch over to a manual approach
    instead, and provide a testing script to help with that.
  - Fix assorted errors in "contrib/unaccent"'s configuration file
    parsing.
  - Honor query cancel interrupts promptly in pgstatindex().
  - Revert unintentional enabling of WAL_DEBUG. Fortunately, as debugging
    tools go, this one is pretty cheap; but it's not intended to be enabled
    by default, so revert.
  - Ensure VPATH builds properly install all server header files.
  - Shorten file names reported in verbose error messages.
    Regular builds have always reported just the name of the C file
    containing the error message call, but VPATH builds formerly
    reported an absolute path name.
* debian/rules: Fix build failure for binary-indep-only builds.
  (Closes: #646079)

Show diffs side-by-side

added added

removed removed

Lines of Context:
611
611
ProcessStandbyHSFeedbackMessage(void)
612
612
{
613
613
        StandbyHSFeedbackMessage reply;
614
 
        TransactionId newxmin = InvalidTransactionId;
 
614
        TransactionId nextXid;
 
615
        uint32          nextEpoch;
615
616
 
616
 
        pq_copymsgbytes(&reply_message, (char *) &reply, sizeof(StandbyHSFeedbackMessage));
 
617
        /* Decipher the reply message */
 
618
        pq_copymsgbytes(&reply_message, (char *) &reply,
 
619
                                        sizeof(StandbyHSFeedbackMessage));
617
620
 
618
621
        elog(DEBUG2, "hot standby feedback xmin %u epoch %u",
619
622
                 reply.xmin,
620
623
                 reply.epoch);
621
624
 
622
 
        /*
623
 
         * Update the WalSender's proc xmin to allow it to be visible to
624
 
         * snapshots. This will hold back the removal of dead rows and thereby
625
 
         * prevent the generation of cleanup conflicts on the standby server.
626
 
         */
627
 
        if (TransactionIdIsValid(reply.xmin))
628
 
        {
629
 
                TransactionId nextXid;
630
 
                uint32          nextEpoch;
631
 
                bool            epochOK = false;
632
 
 
633
 
                GetNextXidAndEpoch(&nextXid, &nextEpoch);
634
 
 
635
 
                /*
636
 
                 * Epoch of oldestXmin should be same as standby or if the counter has
637
 
                 * wrapped, then one less than reply.
638
 
                 */
639
 
                if (reply.xmin <= nextXid)
640
 
                {
641
 
                        if (reply.epoch == nextEpoch)
642
 
                                epochOK = true;
643
 
                }
644
 
                else
645
 
                {
646
 
                        if (nextEpoch > 0 && reply.epoch == nextEpoch - 1)
647
 
                                epochOK = true;
648
 
                }
649
 
 
650
 
                /*
651
 
                 * Feedback from standby must not go backwards, nor should it go
652
 
                 * forwards further than our most recent xid.
653
 
                 */
654
 
                if (epochOK && TransactionIdPrecedesOrEquals(reply.xmin, nextXid))
655
 
                {
656
 
                        if (!TransactionIdIsValid(MyProc->xmin))
657
 
                        {
658
 
                                TransactionId oldestXmin = GetOldestXmin(true, true);
659
 
 
660
 
                                if (TransactionIdPrecedes(oldestXmin, reply.xmin))
661
 
                                        newxmin = reply.xmin;
662
 
                                else
663
 
                                        newxmin = oldestXmin;
664
 
                        }
665
 
                        else
666
 
                        {
667
 
                                if (TransactionIdPrecedes(MyProc->xmin, reply.xmin))
668
 
                                        newxmin = reply.xmin;
669
 
                                else
670
 
                                        newxmin = MyProc->xmin;         /* stay the same */
671
 
                        }
672
 
                }
673
 
        }
674
 
 
675
 
        /*
676
 
         * Grab the ProcArrayLock to set xmin, or invalidate for bad reply
677
 
         */
678
 
        if (MyProc->xmin != newxmin)
679
 
        {
680
 
                LWLockAcquire(ProcArrayLock, LW_SHARED);
681
 
                MyProc->xmin = newxmin;
682
 
                LWLockRelease(ProcArrayLock);
683
 
        }
 
625
        /* Ignore invalid xmin (can't actually happen with current walreceiver) */
 
626
        if (!TransactionIdIsNormal(reply.xmin))
 
627
                return;
 
628
 
 
629
        /*
 
630
         * Check that the provided xmin/epoch are sane, that is, not in the future
 
631
         * and not so far back as to be already wrapped around.  Ignore if not.
 
632
         *
 
633
         * Epoch of nextXid should be same as standby, or if the counter has
 
634
         * wrapped, then one greater than standby.
 
635
         */
 
636
        GetNextXidAndEpoch(&nextXid, &nextEpoch);
 
637
 
 
638
        if (reply.xmin <= nextXid)
 
639
        {
 
640
                if (reply.epoch != nextEpoch)
 
641
                        return;
 
642
        }
 
643
        else
 
644
        {
 
645
                if (reply.epoch + 1 != nextEpoch)
 
646
                        return;
 
647
        }
 
648
 
 
649
        if (!TransactionIdPrecedesOrEquals(reply.xmin, nextXid))
 
650
                return;                                 /* epoch OK, but it's wrapped around */
 
651
 
 
652
        /*
 
653
         * Set the WalSender's xmin equal to the standby's requested xmin, so that
 
654
         * the xmin will be taken into account by GetOldestXmin.  This will hold
 
655
         * back the removal of dead rows and thereby prevent the generation of
 
656
         * cleanup conflicts on the standby server.
 
657
         *
 
658
         * There is a small window for a race condition here: although we just
 
659
         * checked that reply.xmin precedes nextXid, the nextXid could have gotten
 
660
         * advanced between our fetching it and applying the xmin below, perhaps
 
661
         * far enough to make reply.xmin wrap around.  In that case the xmin we
 
662
         * set here would be "in the future" and have no effect.  No point in
 
663
         * worrying about this since it's too late to save the desired data
 
664
         * anyway.  Assuming that the standby sends us an increasing sequence of
 
665
         * xmins, this could only happen during the first reply cycle, else our
 
666
         * own xmin would prevent nextXid from advancing so far.
 
667
         *
 
668
         * We don't bother taking the ProcArrayLock here.  Setting the xmin field
 
669
         * is assumed atomic, and there's no real need to prevent a concurrent
 
670
         * GetOldestXmin.  (If we're moving our xmin forward, this is obviously
 
671
         * safe, and if we're moving it backwards, well, the data is at risk
 
672
         * already since a VACUUM could have just finished calling GetOldestXmin.)
 
673
         */
 
674
        MyProc->xmin = reply.xmin;
684
675
}
685
676
 
686
677
/* Main loop of walsender process */
1207
1198
        if (MyWalSnd)
1208
1199
                SetLatch(&MyWalSnd->latch);
1209
1200
 
 
1201
        /*
 
1202
         * Set the standard (non-walsender) state as well, so that we can
 
1203
         * abort things like do_pg_stop_backup().
 
1204
         */
 
1205
        InterruptPending = true;
 
1206
        ProcDiePending = true;
 
1207
 
1210
1208
        errno = save_errno;
1211
1209
}
1212
1210