Re: sinval synchronization considered harmful
От | Robert Haas |
---|---|
Тема | Re: sinval synchronization considered harmful |
Дата | |
Msg-id | CA+TgmoZjo1bkP6eX=xOX3aHuPYbmJT9+PKW6qubQzN7sukK3Dg@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: sinval synchronization considered harmful (Robert Haas <robertmhaas@gmail.com>) |
Ответы |
Re: sinval synchronization considered harmful
Re: sinval synchronization considered harmful |
Список | pgsql-hackers |
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
Вложения
В списке pgsql-hackers по дате отправления: