Jeff Davis <pgsql@j-davis.com> writes:
> In those terms, we can reframe the questions as: what do we do about
> reads during the load?
> Answers could include:
> (a) nothing -- reads during a load are potentially dirty
> (b) readers ignore hint bits during the load, and pay the penalty
> (c) allow only INSERT/COPY, and block unsafe SELECT/UPDATE/DELETE
Or (d) it's not a problem, since the inserting XID is still busy
according to the readers' snapshots.
The part I think is actually hard is how to clean up if the inserting
xact doesn't reach commit. I think what we're basically looking at here
is pushing more cost into that path in order to avoid cost in successful
cases. The first design that comes to mind is
(1) the inserting xact remembers which tables it's inserted pre-hinted
tuples into, and if it has to abort, it first seqscans those tables to
reset the hint bits;
(2) it also emits WAL entries that will cause crash recovery to perform
an identical scan, if WAL ends without finding a commit or abort record
for the inserting xact.
But there may be other better ways. One problem with the above sketch
is that you can't checkpoint till the insertion is committed, since a
checkpoint would prevent crash recovery from seeing the warning WAL
records.
regards, tom lane