• Amit Kapila's avatar
    Implement streaming mode in ReorderBuffer. · 7259736a
    Amit Kapila authored
    Instead of serializing the transaction to disk after reaching the
    logical_decoding_work_mem limit in memory, we consume the changes we have
    in memory and invoke stream API methods added by commit 45fdc973.
    However, sometimes if we have incomplete toast or speculative insert we
    spill to the disk because we can't generate the complete tuple and stream.
    And, as soon as we get the complete tuple we stream the transaction
    including the serialized changes.
    
    We can do this incremental processing thanks to having assignments
    (associating subxact with toplevel xacts) in WAL right away, and
    thanks to logging the invalidation messages at each command end. These
    features are added by commits 0bead9af and c55040cc respectively.
    
    Now that we can stream in-progress transactions, the concurrent aborts
    may cause failures when the output plugin consults catalogs (both system
    and user-defined).
    
    We handle such failures by returning ERRCODE_TRANSACTION_ROLLBACK
    sqlerrcode from system table scan APIs to the backend or WALSender
    decoding a specific uncommitted transaction. The decoding logic on the
    receipt of such a sqlerrcode aborts the decoding of the current
    transaction and continue with the decoding of other transactions.
    
    We have ReorderBufferTXN pointer in each ReorderBufferChange by which we
    know which xact it belongs to.  The output plugin can use this to decide
    which changes to discard in case of stream_abort_cb (e.g. when a subxact
    gets discarded).
    
    We also provide a new option via SQL APIs to fetch the changes being
    streamed.
    
    Author: Dilip Kumar, Tomas Vondra, Amit Kapila, Nikhil Sontakke
    Reviewed-by: Amit Kapila, Kuntal Ghosh, Ajin Cherian
    Tested-by: Neha Sharma, Mahendra Singh Thalor and Ajin Cherian
    Discussion: https://postgr.es/m/688b0b7f-2f6c-d827-c27b-216a8e3ea700@2ndquadrant.com
    7259736a
stream.sql 1.28 KB