1. 12 May, 2019 1 commit
    • Tom Lane's avatar
      Rearrange pgstat_bestart() to avoid failures within its critical section. · 85ccb689
      Tom Lane authored
      We long ago decided to design the shared PgBackendStatus data structure to
      minimize the cost of writing status updates, which means that writers just
      have to increment the st_changecount field twice.  That isn't hooked into
      any sort of resource management mechanism, which means that if something
      were to throw error between the two increments, the st_changecount field
      would be left odd indefinitely.  That would cause readers to lock up.
      Now, since it's also a bad idea to leave the field odd for longer than
      absolutely necessary (because readers will spin while we have it set),
      the expectation was that we'd treat these segments like spinlock critical
      sections, with only short, more or less straight-line, code in them.
      
      That was fine as originally designed, but commit 9029f4b3 broke it
      by inserting a significant amount of non-straight-line code into
      pgstat_bestart(), code that is very capable of throwing errors, not to
      mention taking a significant amount of time during which readers will spin.
      We have a report from Neeraj Kumar of readers actually locking up, which
      I suspect was due to an encoding conversion error in X509_NAME_to_cstring,
      though conceivably it was just a garden-variety OOM failure.
      
      Subsequent commits have loaded even more dubious code into pgstat_bestart's
      critical section (and commit fc70a4b0 deserves some kind of booby prize
      for managing to miss the critical section entirely, although the negative
      consequences seem minimal given that the PgBackendStatus entry should be
      seen by readers as inactive at that point).
      
      The right way to fix this mess seems to be to compute all these values
      into a local copy of the process' PgBackendStatus struct, and then just
      copy the data back within the critical section proper.  This plan can't
      be implemented completely cleanly because of the struct's heavy reliance
      on out-of-line strings, which we must initialize separately within the
      critical section.  But still, the critical section is far smaller and
      safer than it was before.
      
      In hopes of forestalling future errors of the same ilk, rename the
      macros for st_changecount management to make it more apparent that
      the writer-side macros create a critical section.  And to prevent
      the worst consequences if we nonetheless manage to mess it up anyway,
      adjust those macros so that they really are a critical section, ie
      they now bump CritSectionCount.  That doesn't add much overhead, and
      it guarantees that if we do somehow throw an error while the counter
      is odd, it will lead to PANIC and a database restart to reset shared
      memory.
      
      Back-patch to 9.5 where the problem was introduced.
      
      In HEAD, also fix an oversight in commit b0b39f72: it failed to teach
      pgstat_read_current_status to copy st_gssstatus data from shared memory to
      local memory.  Hence, subsequent use of that data within the transaction
      would potentially see changing data that it shouldn't see.
      
      Discussion: https://postgr.es/m/CAPR3Wj5Z17=+eeyrn_ZDG3NQGYgMEOY6JV6Y-WRRhGgwc16U3Q@mail.gmail.com
      85ccb689
  2. 11 May, 2019 14 commits
  3. 10 May, 2019 7 commits
  4. 09 May, 2019 12 commits
    • Bruce Momjian's avatar
      doc: more PG 12 release note adjustments · 79697d03
      Bruce Momjian authored
      This adds two more items that should have been included in the
      beginning.
      
      Reported-by: Justin Pryzby
      
      Discussion: https://postgr.es/m/20190508203204.GA25482@telsasoft.com
      79697d03
    • Bruce Momjian's avatar
      docs: update release notes with fixes · 81ddfa2e
      Bruce Momjian authored
      Reported-by: Justin Pryzby
      
      Discussion: https://postgr.es/m/20190508203204.GA25482@telsasoft.com
      81ddfa2e
    • Michael Paquier's avatar
      Improve and fix some error handling for REINDEX INDEX/TABLE CONCURRENTLY · 508300e2
      Michael Paquier authored
      This improves the user experience when it comes to restrict several
      flavors of REINDEX CONCURRENTLY.  First, for INDEX, remove a restriction
      on shared relations as we already check after catalog relations.  Then,
      for TABLE, add a proper error message when attempting to run the command
      on system catalogs.  The code path of CREATE INDEX CONCURRENTLY already
      complains about that, but if a REINDEX is issued then then the error
      generated is confusing.
      
      While on it, add more tests to check restrictions on catalog indexes and
      on toast table/index for catalogs.  Some error messages are improved,
      with wording suggestion coming from Tom Lane.
      
      Reported-by: Tom Lane
      Author: Michael Paquier
      Reviewed-by: Tom Lane
      Discussion: https://postgr.es/m/23694.1556806002@sss.pgh.pa.us
      508300e2
    • Tom Lane's avatar
      Repair issues with faulty generation of merge-append plans. · 24c19e9f
      Tom Lane authored
      create_merge_append_plan failed to honor the CP_EXACT_TLIST flag:
      it would generate the expected targetlist but then it felt free to
      add resjunk sort targets to it.  This demonstrably leads to assertion
      failures in v11 and HEAD, and it's probably just accidental that we
      don't see the same in older branches.  I've not looked into whether
      there would be any real-world consequences in non-assert builds.
      In HEAD, create_append_plan has sprouted the same problem, so fix
      that too (although we do not have any test cases that seem able to
      reach that bug).  This is an oversight in commit 3fc6e2d7 which
      invented the CP_EXACT_TLIST flag, so back-patch to 9.6 where that
      came in.
      
      convert_subquery_pathkeys would create pathkeys for subquery output
      values if they match any EquivalenceClass known in the outer query
      and are available in the subquery's syntactic targetlist.  However,
      the second part of that condition is wrong, because such values might
      not appear in the subquery relation's reltarget list, which would
      mean that they couldn't be accessed above the level of the subquery
      scan.  We must check that they appear in the reltarget list, instead.
      This can lead to dropping knowledge about the subquery's sort
      ordering, but I believe it's okay, because any sort key that the
      outer query actually has any interest in would appear in the
      reltarget list.
      
      This second issue is of very long standing, but right now there's no
      evidence that it causes observable problems before 9.6, so I refrained
      from back-patching further than that.  We can revisit that choice if
      somebody finds a way to make it cause problems in older branches.
      (Developing useful test cases for these issues is really problematic;
      fixing convert_subquery_pathkeys removes the only known way to exhibit
      the create_merge_append_plan bug, and neither of the test cases added
      by this patch causes a problem in all branches, even when considering
      the issues separately.)
      
      The second issue explains bug #15795 from Suresh Kumar R ("could not
      find pathkey item to sort" with nested DISTINCT queries).  I stumbled
      across the first issue while investigating that.
      
      Discussion: https://postgr.es/m/15795-fadb56c8e44ee73c@postgresql.org
      24c19e9f
    • Bruce Momjian's avatar
      doc: update PG 12 release notes, v2 · 64084d68
      Bruce Momjian authored
      Adjustments requested by reviewers.
      
      Reported-by: Amit Kapila, Thomas Munro, Andrew Gierth, Amit Langote, Oleg Bartunov, Michael Paquier, Alvaro Herrera, Tatsuo Ishii
      
      Discussion: https://postgr.es/m/20190506233029.ozwged67i7s4qd6c@momjian.us
      64084d68
    • Etsuro Fujita's avatar
      Doc: Update FDW documentation about GetForeignUpperPaths(). · a0be05ba
      Etsuro Fujita authored
      In commit d50d172e, which added support for LIMIT/OFFSET pushdown in
      postgres_fdw, a new struct was introduced as the extra parameter of
      GetForeignUpperPaths() set for UPPERREL_FINAL, but I forgot to update
      the documentation to mention that.
      
      Author: Etsuro Fujita
      Discussion: https://postgr.es/m/CAPmGK17uSXQDe31oRb-z1nYyT6vVzkstZkA3_Wbq38U92b9BmQ%40mail.gmail.com
      a0be05ba
    • Etsuro Fujita's avatar
      postgres_fdw: Fix cost estimation for aggregate pushdown. · edbcbe27
      Etsuro Fujita authored
      In commit 7012b132, which added support for aggregate pushdown in
      postgres_fdw, the expense of evaluating the final scan/join target
      computed by make_group_input_target() was not accounted for at all in
      costing aggregate pushdown paths with local statistics.  The right fix
      for this would be to have a separate upper stage to adjust the final
      scan/join relation (see comments for apply_scanjoin_target_to_paths());
      but for now, fix by adding the tlist eval cost when costing aggregate
      pushdown paths with local statistics.
      
      Apply this to HEAD only to avoid destabilizing existing plan choices.
      
      Author: Etsuro Fujita
      Reviewed-By: Antonin Houska
      Discussion: https://postgr.es/m/5C66A056.60007%40lab.ntt.co.jp
      edbcbe27
    • Thomas Munro's avatar
      Fix SxactGlobalXmin tracking. · 47a338cf
      Thomas Munro authored
      Commit bb16aba5 broke the code that maintains SxactGlobalXmin.  It
      could get stuck when a well-timed READ ONLY transaction runs.  If
      SxactGlobalXmin stops advancing, transactions on the
      FinishedSerializableTransactions queue are never cleaned up, so
      resources are effectively leaked.  Revert that hunk of the commit.
      
      Also revert another similar hunk that was probably harmless, but
      unnecessary and unjustified, relating to the DOOMED flag in case of
      RO_SAFE early release.
      
      Author: Thomas Munro
      Reported-by: Tom Lane
      Discussion: https://postgr.es/m/16170.1557251214%40sss.pgh.pa.us
      47a338cf
    • Peter Eisentraut's avatar
      pg_controldata: Add common gettext flags · cd805f46
      Peter Eisentraut authored
      So it picks up strings in pg_log_* calls.  This was forgotten when it
      was added to all other relevant subdirectories.
      cd805f46
    • Peter Eisentraut's avatar
      Fix grammar in error message · 02daece4
      Peter Eisentraut authored
      02daece4
    • Tom Lane's avatar
      Clean up the behavior and API of catalog.c's is-catalog-relation tests. · 2d7d946c
      Tom Lane authored
      The right way for IsCatalogRelation/Class to behave is to return true
      for OIDs less than FirstBootstrapObjectId (not FirstNormalObjectId),
      without any of the ad-hoc fooling around with schema membership.
      
      The previous code was wrong because (1) it claimed that
      information_schema tables were not catalog relations but their toast
      tables were, which is silly; and (2) if you dropped and recreated
      information_schema, which is a supported operation, the behavior
      changed.  That's even sillier.  With this definition, "catalog
      relations" are exactly the ones traceable to the postgres.bki data,
      which seems like what we want.
      
      With this simplification, we don't actually need access to the pg_class
      tuple to identify a catalog relation; we only need its OID.  Hence,
      replace IsCatalogClass with "IsCatalogRelationOid(oid)".  But keep
      IsCatalogRelation as a convenience function.
      
      This allows fixing some arguably-wrong semantics in contrib/sepgsql and
      ReindexRelationConcurrently, which were using an IsSystemNamespace test
      where what they really should be using is IsCatalogRelationOid.  The
      previous coding failed to protect toast tables of system catalogs, and
      also was not on board with the general principle that user-created tables
      do not become catalogs just by virtue of being renamed into pg_catalog.
      We can also get rid of a messy hack in ReindexMultipleTables.
      
      While we're at it, also rename IsSystemNamespace to IsCatalogNamespace,
      because the previous name invited confusion with the more expansive
      semantics used by IsSystemRelation/Class.
      
      Also improve the comments in catalog.c.
      
      There are a few remaining places in replication-related code that are
      special-casing OIDs below FirstNormalObjectId.  I'm inclined to think
      those are wrong too, and if there should be any special case it should
      just extend to FirstBootstrapObjectId.  But first we need to debate
      whether a FOR ALL TABLES publication should include information_schema.
      
      Discussion: https://postgr.es/m/21697.1557092753@sss.pgh.pa.us
      Discussion: https://postgr.es/m/15150.1557257111@sss.pgh.pa.us
      2d7d946c
    • Michael Paquier's avatar
      Fix error status of vacuumdb when multiple jobs are used · 3ae3c18b
      Michael Paquier authored
      When running a batch of VACUUM or ANALYZE commands on a given database,
      there were cases where it is possible to have vacuumdb not report an
      error where it actually should, leading to incorrect status results.
      
      Author: Julien Rouhaud
      Reviewed-by: Amit Kapila, Michael Paquier
      Discussion: https://postgr.es/m/CAOBaU_ZuTwz7CtqLYJ1Ouuh272bTQPLN8b1bAPk0bCBm4PDMTQ@mail.gmail.com
      Backpatch-through: 9.5
      3ae3c18b
  5. 08 May, 2019 6 commits