With your changes sometimes due to incomplete toast changes, if it can not pick the largest top txn for streaming it will hang forever in the while loop, in that case, it should go for spilling.
while (rb->size >= logical_decoding_work_mem * 1024L) { /* * Pick the largest transaction (or subtransaction) and evict it from * memory by streaming, if supported. Otherwise, spill to disk. */ if (ReorderBufferCanStream(rb) && (txn = ReorderBufferLargestTopTXN(rb)) != NULL)
Which is this condition (of not picking largest top txn)? Wouldn't ReorderBufferLargestTopTXN then return a NULL? If not, is there a way to know that a transaction cannot be streamed, so there can be an exit condition for the while loop?