1. 19 Aug, 2011 9 commits
  2. 18 Aug, 2011 10 commits
  3. 17 Aug, 2011 8 commits
  4. 16 Aug, 2011 10 commits
    • Tom Lane's avatar
      Revise sinval code to remove no-longer-used tuple TID from inval messages. · b5282aa8
      Tom Lane authored
      This requires adjusting the API for syscache callback functions: they now
      get a hash value, not a TID, to identify the target tuple.  Most of them
      weren't paying any attention to that argument anyway, but plancache did
      require a small amount of fixing.
      
      Also, improve performance a trifle by avoiding sending duplicate inval
      messages when a heap_update isn't changing the catcache lookup columns.
      b5282aa8
    • Tom Lane's avatar
      Forget about targeting catalog cache invalidations by tuple TID. · 632ae682
      Tom Lane authored
      The TID isn't stable enough: we might queue an sinval event before a VACUUM
      FULL, and then process it afterwards, when the target tuple no longer has
      the same TID.  So we must invalidate entries on the basis of hash value
      only.  The old coding can be shown to result in various bizarre,
      hard-to-reproduce errors in the presence of concurrent VACUUM FULLs on
      system catalogs, and could easily result in permanent catalog corruption,
      up to and including complete loss of tables.
      
      This commit is just a minimal fix that removes the unsafe comparison.
      We should remove transmission of the tuple TID from sinval messages
      altogether, and then arrange to suppress the extra message in the common
      case of a heap_update that doesn't change the key hashvalue.  But that's
      going to be much more invasive, and will only produce a probably-marginal
      performance gain, so it doesn't seem like material for a back-patch.
      
      Back-patch to 9.0.  Before that, VACUUM FULL refused to do any tuple moving
      if it found any INSERT_IN_PROGRESS or DELETE_IN_PROGRESS tuples (and
      CLUSTER would give up altogether), so there was no risk of moving a tuple
      that might be the subject of an unsent sinval message.
      632ae682
    • Tom Lane's avatar
      Fix incorrect order of operations during sinval reset processing. · f4d7f1ad
      Tom Lane authored
      We have to be sure that we have revalidated each nailed-in-cache relcache
      entry before we try to use it to load data for some other relcache entry.
      The introduction of "mapped relations" in 9.0 broke this, because although
      we updated the state kept in relmapper.c early enough, we failed to
      propagate that information into relcache entries soon enough; in
      particular, we could try to fetch pg_class rows out of pg_class before
      we'd updated its relcache entry's rd_node.relNode value from the map.
      
      This bug accounts for Dave Gould's report of failures after "vacuum full
      pg_class", and I believe that there is risk for other system catalogs
      as well.
      
      The core part of the fix is to copy relmapper data into the relcache
      entries during "phase 1" in RelationCacheInvalidate(), before they'll be
      used in "phase 2".  To try to future-proof the code against other similar
      bugs, I also rearranged the order in which nailed relations are visited
      during phase 2: now it's pg_class first, then pg_class_oid_index, then
      other nailed relations.  This should ensure that RelationClearRelation can
      apply RelationReloadIndexInfo to all nailed indexes without risking use
      of not-yet-revalidated relcache entries.
      
      Back-patch to 9.0 where the relation mapper was introduced.
      f4d7f1ad
    • Tom Lane's avatar
      Preserve toast value OIDs in toast-swap-by-content for CLUSTER/VACUUM FULL. · 7b0d0e93
      Tom Lane authored
      This works around the problem that a catalog cache entry might contain a
      toast pointer that we try to dereference just as a VACUUM FULL completes
      on that catalog.  We will see the sinval message on the cache entry when
      we acquire lock on the toast table, but by that point we've already told
      tuptoaster.c "here's the pointer to fetch", so it's difficult from a code
      structural standpoint to update the pointer before we use it.  Much less
      painful to ensure that toast pointers are not invalidated in the first
      place.  We have to add a bit of code to deal with the case that a value
      that previously wasn't toasted becomes so; but that should be a
      seldom-exercised corner case, so the inefficiency shouldn't be significant.
      
      Back-patch to 9.0.  In prior versions, we didn't allow CLUSTER on system
      catalogs, and VACUUM FULL didn't result in reassignment of toast OIDs, so
      there was no problem.
      7b0d0e93
    • Tom Lane's avatar
      Fix race condition in relcache init file invalidation. · 2ada6779
      Tom Lane authored
      The previous code tried to synchronize by unlinking the init file twice,
      but that doesn't actually work: it leaves a window wherein a third process
      could read the already-stale init file but miss the SI messages that would
      tell it the data is stale.  The result would be bizarre failures in catalog
      accesses, typically "could not read block 0 in file ..." later during
      startup.
      
      Instead, hold RelCacheInitLock across both the unlink and the sending of
      the SI messages.  This is more straightforward, and might even be a bit
      faster since only one unlink call is needed.
      
      This has been wrong since it was put in (in 2002!), so back-patch to all
      supported releases.
      2ada6779
    • Magnus Hagander's avatar
      Adjust total size in pg_basebackup progress report when reality changes · 1bb69245
      Magnus Hagander authored
      When streaming including WAL, the size estimate will always be incorrect,
      since we don't know how much WAL is included. To make sure the output doesn't
      look completely unreasonable, this patch increases the total size whenever we
      go past the estimate, to make sure we never go above 100%.
      1bb69245
    • Heikki Linnakangas's avatar
      Fix bogus comment that claimed that the new BACKUP METHOD line in · 2877c67b
      Heikki Linnakangas authored
      backup_label was new in 9.0. Spotted by Fujii Masao.
      2877c67b
    • Peter Eisentraut's avatar
      Make pg_basebackup progress report translatable · 3b3f0935
      Peter Eisentraut authored
      Also fix a potential portability bug, because INT64_FORMAT is only
      guaranteed to be available with snprintf, not fprintf.
      3b3f0935
    • Peter Eisentraut's avatar
      Use less cryptic variable names · 005e5c30
      Peter Eisentraut authored
      005e5c30
    • Bruce Momjian's avatar
      In pg_upgrade, avoid dumping orphaned temporary tables. This makes the · 2411fbda
      Bruce Momjian authored
      pg_upgrade schema matching pattern match pg_dump/pg_dumpall.
      
      Fix for 9.0, 9.1, and 9.2.
      2411fbda
  5. 15 Aug, 2011 2 commits
  6. 14 Aug, 2011 1 commit
    • Tom Lane's avatar
      Fix unsafe order of operations in foreign-table DDL commands. · 52994e9e
      Tom Lane authored
      When updating or deleting a system catalog tuple, it's necessary to acquire
      RowExclusiveLock on the catalog before looking up the tuple; otherwise a
      concurrent VACUUM FULL on the catalog might move the tuple to a different
      TID before we can apply the update.  Coding patterns that find the tuple
      via a table scan aren't at risk here, but when obtaining the tuple from a
      catalog cache, correct ordering is important; and several routines in
      foreigncmds.c got it wrong.  Noted while running the regression tests in
      parallel with VACUUM FULL of assorted system catalogs.
      
      For consistency I moved all the heap_open calls to the starts of their
      functions, including a couple for which there was no actual bug.
      
      Back-patch to 8.4 where foreigncmds.c was added.
      52994e9e