We have to add three more functions to eXtensible Transaction Manager API (XTM):

    /*
     * Calculate transaction state size. This method is invoked by 
EstimateTransactionStateSpace to copy transaction
     * state to parallel workers
     */
    size_t      (*GetTransactionStateSize)(void);

    /*
     * Serialize transaction state
     */
    void        (*SerializeTransactionState)(void* ctx);

    /*
     * Deserialize transaction state
     */
    void        (*DeserializeTransactionState)(void* ctx);

The reason is that we find out that our multimaster is not correctly working when 
max_parallel_workers > 0
because multimaster transaction context is not properly shared between workers.
Unfortunately right now serialization/deserialization of transaction state is 
hardcoded in xact.c. and IMHO is done in quite ugly way:

    XactIsoLevel = (int) tstate[0];
    XactDeferrable = (bool) tstate[1];
    XactTopTransactionId = tstate[2];
    CurrentTransactionState->transactionId = tstate[3];
    currentCommandId = tstate[4];
    nParallelCurrentXids = (int) tstate[5];
    ParallelCurrentXids = &tstate[6];

- there is even no declared structure with fixed part of saved context.
I wonder if not only DTM will be interested in sharing some common state 
between workers and should we  provide some way of replicating user defined 
context between workers? From my point of view XTM seems to be good place for 
it...



--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company



--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to