Hi,

I have not reviewed the repack-related patches before. Recently, I started 
trying to understand how repack works and trace through 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 code 
explicitly 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 struct explicitly, and then initialize the 
non-zero fields afterwards.

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




Attachment: v1-0001-repack-zero-initialize-DecodingWorkerShared.patch
Description: Binary data

Reply via email to