On 20.08.2019 19:06, Pavel Stehule wrote:
As I wrote at the beginning of this thread, one of the problems
with temporary table sis that it is not possible to use them at
replica.
Global temp tables allows to share metadata between master and
replica.
I am not sure if I understand to last sentence. Global temp tables
should be replicated on replica servers. But the content should not be
replicated. This should be session specific.
Obviously.
When we run OLAP queries at replica, it will be great if we can do
insert into temp_table (select ...);
With local temp tables it is not possible just because you can not
create temp table at replica.
But global temp table can be created at master and populated with data
at replica.
I perform small investigation: how difficult it will be to support
inserts in temp tables at replica.
First my impression was that it can be done in tricky but simple way.
By making small changes changing just three places:
1. Prohibit non-select statements in read-only transactions
2. Xid assignment (return FrozenTransactionId)
3. Transaction commit/abort
I managed to provide normal work with global temp tables at replica.
But there is one problem with this approach: it is not possible to
undo changes in temp tables so rollback doesn't work.
I tried another solution, but assigning some dummy Xids to standby
transactions.
But this approach require much more changes:
- Initialize page for such transaction in CLOG
- Mark transaction as committed/aborted in XCLOG
- Change snapshot check in visibility function
And still I didn't find safe way to cleanup CLOG space.
Alternative solution is to implement "local CLOG" for such
transactions.
The straightforward solution is to use hashtable. But it may cause
memory overflow if we have long living backend which performs huge
number of transactions.
Also in this case we need to change visibility check functions.
So I have implemented simplest solution with frozen xid and force
backend termination in case of transaction rollback (so user will
no see inconsistent behavior).
Attached please find global_private_temp_replica.patch which
implements this approach.
It will be nice if somebody can suggest better solution for
temporary tables at replica.
This is another hard issue. Probably backend temination should be
acceptable solution. I don't understand well to this area, but if
replica allows writing (to global temp tables), then replica have to
have local CLOG.
There are several problems:
1. How to choose XID for writing transaction at standby. The simplest
solution is to just add 0x7fffffff to the current XID.
It eliminates possibility of conflict with normal XIDs (received from
master).
But requires changes in visibility functions. Visibility check function
do not know OID of tuple owner, just XID stored in the tuple header. It
should make a decision just based on this XID.
2. How to perform cleanup of not needed XIDs. Right now there is quite
complex logic of how to free CLOG pages.
3. How to implement visibility rules to such XIDs.
CLOG for global temp tables can be more simple then standard CLOG.
Data are not shared, and life of data (and number of transactions) can
be low.
Another solution is wait on ZHeap storage and replica can to have own
UNDO log.
I thought about implementation of special table access method for
temporary tables.
I am trying to understand now if it is the only possible approach or
there are simpler solutions.
--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company