Re: XTM & parallel search - Mailing list pgsql-hackers

From Konstantin Knizhnik
Subject Re: XTM & parallel search
Date
Msg-id 575183D1.7010700@postgrespro.ru
Whole thread Raw
In response to Re: XTM & parallel search  (Amit Kapila <amit.kapila16@gmail.com>)
Responses Re: XTM & parallel search  (Amit Kapila <amit.kapila16@gmail.com>)
List pgsql-hackers


On 03.06.2016 16:05, Amit Kapila wrote:
On Fri, Jun 3, 2016 at 1:34 AM, Konstantin Knizhnik <k.knizhnik@postgrespro.ru> wrote:
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);



In above proposal, are you suggesting to change the existing API's as well, because the parameters of function pointers don't match with exiting API's. I think it is better to consider this along with the overall XTM API.

Sorry, but right now I have not replaced existed functions 
EstimateTransactionStateSpace/SerializeTransactionState/StartParallelWorkerTransaction
with XTM indirect calls. If was my original intention, but these functions access static variable CurrentTransactionState defined in xact.c.
So if  user-defined TM wants to override this functions, it will have to invoke original functions to save/restore CurrentTransactionState. 
It is not  convenient.
This is why three XTM functions above are now called by existed xact funcations to save additional state, for example:

Size
EstimateTransactionStateSpace(void)
{
    TransactionState s;
    Size        nxids = 6;        /* iso level, deferrable, top & current XID,
                                 * command counter, XID count */

    for (s = CurrentTransactionState; s != NULL; s = s->parent)
    {
        if (TransactionIdIsValid(s->transactionId))
            nxids = add_size(nxids, 1);
        nxids = add_size(nxids, s->nChildXids);
    }

    nxids = add_size(nxids, nParallelCurrentXids);   
    nxids = mul_size(nxids, sizeof(TransactionId));
    return add_size(nxids, TM->GetTransactionStateSize());
}

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

pgsql-hackers by date:

Previous
From: Amit Kapila
Date:
Subject: Re: XTM & parallel search
Next
From: Tom Lane
Date:
Subject: Re: Rename max_parallel_degree?