sync request forward function ForwardSyncRequest() might hang for some time in a corner case? - Mailing list pgsql-hackers

From Paul Guo
Subject sync request forward function ForwardSyncRequest() might hang for some time in a corner case?
Date
Msg-id CABQrizf=dbHRtWMtUMtReAdrbG6tc9k_4eMzmpCdC_K8eiLsZg@mail.gmail.com
Whole thread Raw
Responses Re: sync request forward function ForwardSyncRequest() might hang for some time in a corner case?
List pgsql-hackers
Hi hackers,

I found this when reading the related code. Here is the scenario:

bool
RegisterSyncRequest(const FileTag *ftag, SyncRequestType type,
                    bool retryOnError)

For the case retryOnError is true, the function would in loop call
ForwardSyncRequest() until it succeeds, but in ForwardSyncRequest(),
we can see if we run into the below branch, RegisterSyncRequest() will
need to loop until the checkpointer absorbs the existing requests so
ForwardSyncRequest() might hang for some time until a checkpoint
request is triggered. This scenario seems to be possible in theory
though the chance is not high.

ForwardSyncRequest():

    if (CheckpointerShmem->checkpointer_pid == 0 ||
        (CheckpointerShmem->num_requests >= CheckpointerShmem->max_requests &&
         !CompactCheckpointerRequestQueue()))
    {
        /*
         * Count the subset of writes where backends have to do their own
         * fsync
         */
        if (!AmBackgroundWriterProcess())
            CheckpointerShmem->num_backend_fsync++;
        LWLockRelease(CheckpointerCommLock);
        return false;
    }

One fix is to add below similar code in RegisterSyncRequest(), trigger
a checkpoint for the scenario.

// checkpointer_triggered: variable for one trigger only.
if (!ret && retryOnError && ProcGlobal->checkpointerLatch &&
!checkpointer_triggered)
        SetLatch(ProcGlobal->checkpointerLatch);

Any comments?

Regards,
Paul Guo (Vmware)



pgsql-hackers by date:

Previous
From: Pavan Deolasee
Date:
Subject: Re: Assertion failure while streaming toasted data
Next
From: Paul Guo
Date:
Subject: Re: pg_rewind fails if there is a read only file.