repack: fix uninitialized DecodingWorkerShared.initialized - Mailing list pgsql-hackers

From Chao Li
Subject repack: fix uninitialized DecodingWorkerShared.initialized
Date
Msg-id 9AFE5694-9420-40C3-842C-4A4473E1D02B@gmail.com
Whole thread
Responses Re: repack: fix uninitialized DecodingWorkerShared.initialized
Re: repack: fix uninitialized DecodingWorkerShared.initialized
List pgsql-hackers
Hi,

I have not reviewed the repack-related patches before. Recently, I started trying to understand how repack works and
tracethrough the code. 

While tracing start_repack_decoding_worker(), I noticed something suspicious:

```
    seg = dsm_create(size, 0);
    shared = (DecodingWorkerShared *) dsm_segment_address(seg);
    shared->lsn_upto = InvalidXLogRecPtr;
    shared->done = false;
    SharedFileSetInit(&shared->sfs, seg);
    shared->last_exported = -1;
    SpinLockInit(&shared->mutex);
    shared->dbid = MyDatabaseId;
```

Here, the code creates a shared-memory segment and lets “shared" point to that memory. It then initializes some fields
of“shared". However, later code reads shared->initialized, but this field was not initialized: 
```
    for (;;)
    {
        bool        initialized;

        SpinLockAcquire(&shared->mutex);
        initialized = shared->initialized;
        SpinLockRelease(&shared->mutex);

        if (initialized)
            break;

        ConditionVariableSleep(&shared->cv, WAIT_EVENT_REPACK_WORKER_EXPORT);
    }
```

I checked the code of dsm_create(), and I did not see anything showing that the created shared-memory segment is
zeroed.

This is actually just an eyeball finding. From my tracing on my MacBook, after shared = (DecodingWorkerShared *)
dsm_segment_address(seg);,the memory always seemed to be zeroed, so I may have missed something. But given that the
codeexplicitly initializes several other fields, it seems better not to rely on that implicitly. 

For the fix, since start_repack_decoding_worker() is not on a hot path, I think it is fine to zero the whole shared
structexplicitly, and then initialize the non-zero fields afterwards. 

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/





Attachment

pgsql-hackers by date:

Previous
From: shveta malik
Date:
Subject: Re: Support EXCEPT for TABLES IN SCHEMA publications
Next
From: Tender Wang
Date:
Subject: Re: pg_plan_advice