Thread

  1. Re: sinval synchronization considered harmful

    Robert Haas <robertmhaas@gmail.com> — 2011-07-27T16:12:15Z

    On Tue, Jul 26, 2011 at 9:57 PM, Robert Haas <robertmhaas@gmail.com> wrote:
    > On Tue, Jul 26, 2011 at 4:38 PM, Noah Misch <noah@2ndquadrant.com> wrote:
    >> No new ideas come to mind, here.
    >
    > OK, I have a new idea.  :-)
    >
    > 1. Add a new flag to each procState called something like "timeToPayAttention".
    > 2. Each call to SIGetDataEntries() iterates over all the ProcStates
    > whose index is < lastBackend and sets stateP->timeToPayAttention =
    > TRUE for each.
    > 3. At the beginning of SIGetDataEntries(), we do an unlocked if
    > (!stateP->timeToPayAttention) return 0.
    > 4. Immediately following that if statement and before acquiring any
    > locks, we set stateP->timeToPayAttention = FALSE.
    >
    > The LWLockRelease() in SIGetDataEntries() will be sufficient to force
    > all of the stateP->timeToPayAttention writes out to main memory, and
    > the read side is OK because we either just took a lock (which acted as
    > a fence) or else there's a race anyway.  But unlike my previous
    > proposal, it doesn't involve *comparing* anything.  We needn't worry
    > about whether we could read two different values that are through
    > great misfortune out of sync because we're only reading one value.
    >
    > If, by chance, the value is set to true just after we set it to false,
    > that won't mess us up either: we'll still read all the messages after
    > acquiring the lock.
    
    There turned out to be a little bit of further subtlety to this, but
    it seems to work.  Patch attached.
    
    -- 
    Robert Haas
    EnterpriseDB: http://www.enterprisedb.com
    The Enterprise PostgreSQL Company