Re: Parallel INSERT (INTO ... SELECT ...) - Mailing list pgsql-hackers

From Bharath Rupireddy
Subject Re: Parallel INSERT (INTO ... SELECT ...)
Date
Msg-id CALj2ACWcy3gud18R=-dcpxzBSGv_j-kfusxECsSP239ZGgHLsA@mail.gmail.com
Whole thread Raw
In response to Re: Parallel INSERT (INTO ... SELECT ...)  (Amit Kapila <amit.kapila16@gmail.com>)
List pgsql-hackers
On Fri, Sep 25, 2020 at 5:47 PM Amit Kapila <amit.kapila16@gmail.com> wrote:
>
> >
> > At least in the case of Parallel INSERT, the leader for the Parallel
> > INSERT gets a new xid (GetCurrentFullTransactionId) and it is passed
> > through and assigned to each of the workers during their
> > initialization (so they are assigned the same xid).
> >
>
> So are you facing problems in this area because we EnterParallelMode
> before even assigning the xid in the leader? Because I don't think we
> should ever reach this code in the worker. If so, there are two
> possibilities that come to my mind (a) assign xid in leader before
> entering parallel mode or (b) change the check so that we don't assign
> the new xid in workers. In this case, I am again wondering how does
> parallel copy dealing this?
>

In parallel copy, we are doing option (a) i.e. the leader gets the
full txn id before entering parallel mode and passes it to all
workers.
In the leader:
    full_transaction_id = GetCurrentFullTransactionId();
    EnterParallelMode();
    shared_info_ptr->full_transaction_id = full_transaction_id;
In the workers:
    AssignFullTransactionIdForWorker(pcshared_info->full_transaction_id);

Hence below part of the code doesn't get hit.
    if (IsInParallelMode() || IsParallelWorker())
        elog(ERROR, "cannot assign XIDs during a parallel operation");

We also deal with the commandid similarly i.e. the leader gets the
command id, and workers would use it while insertion.
In the leader:
    shared_info_ptr->mycid = GetCurrentCommandId(true);
In the workers:
    AssignCommandIdForWorker(pcshared_info->mycid, true);

[1]
void
AssignFullTransactionIdForWorker(FullTransactionId fullTransactionId)
{
    TransactionState s = CurrentTransactionState;

    Assert((IsInParallelMode() || IsParallelWorker()));
    s->fullTransactionId = fullTransactionId;
}

void
AssignCommandIdForWorker(CommandId commandId, bool used)
{
    Assert((IsInParallelMode() || IsParallelWorker()));

    /* this is global to a transaction, not subtransaction-local */
    if (used)
        currentCommandIdUsed = true;

    currentCommandId = commandId;
}

With Regards,
Bharath Rupireddy.
EnterpriseDB: http://www.enterprisedb.com



pgsql-hackers by date:

Previous
From: Peter Eisentraut
Date:
Subject: Re: Dumping/restoring fails on inherited generated column
Next
From: Daniel Gustafsson
Date:
Subject: Re: Dumping/restoring fails on inherited generated column