On Sat, Feb 25, 2023 at 11:07:42AM -0800, Andres Freund wrote:
> On 2023-02-23 20:33:23 -0800, Nathan Bossart wrote:>  
>>      if (in_restore_command)
>> -            proc_exit(1);
>> +    {
>> +            /*
>> +             * If we are in a child process (e.g., forked by system() in
>> +             * RestoreArchivedFile()), we don't want to call any exit 
>> callbacks.
>> +             * The parent will take care of that.
>> +             */
>> +            if (MyProcPid == (int) getpid())
>> +                    proc_exit(1);
>> +            else
>> +            {
>> +                    const char      msg[] = "StartupProcShutdownHandler() 
>> called in child process\n";
>> +                    int                     rc pg_attribute_unused();
>> +
>> +                    rc = write(STDERR_FILENO, msg, sizeof(msg));
>> +                    _exit(1);
>> +            }
>> +    }
> 
> Why do we need that rc variable? Don't we normally get away with (void)
> write(...)?

My compiler complains about that.  :/

        ../postgresql/src/backend/postmaster/startup.c: In function 
‘StartupProcShutdownHandler’:
        ../postgresql/src/backend/postmaster/startup.c:139:11: error: ignoring 
return value of ‘write’, declared with attribute warn_unused_result 
[-Werror=unused-result]
          139 |    (void) write(STDERR_FILENO, msg, sizeof(msg));
              |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        cc1: all warnings being treated as errors

>> diff --git a/src/backend/storage/lmgr/proc.c 
>> b/src/backend/storage/lmgr/proc.c
>> index 22b4278610..e3da0622d7 100644
>> --- a/src/backend/storage/lmgr/proc.c
>> +++ b/src/backend/storage/lmgr/proc.c
>> @@ -805,6 +805,7 @@ ProcKill(int code, Datum arg)
>>      dlist_head *procgloballist;
>>  
>>      Assert(MyProc != NULL);
>> +    Assert(MyProcPid == (int) getpid());  /* not safe if forked by 
>> system(), etc. */
>>  
>>      /* Make sure we're out of the sync rep lists */
>>      SyncRepCleanupAtProcExit();
>> @@ -925,6 +926,7 @@ AuxiliaryProcKill(int code, Datum arg)
>>      PGPROC     *proc;
>>  
>>      Assert(proctype >= 0 && proctype < NUM_AUXILIARY_PROCS);
>> +    Assert(MyProcPid == (int) getpid());  /* not safe if forked by 
>> system(), etc. */
>>  
>>      auxproc = &AuxiliaryProcs[proctype];
>>  
>> -- 
>> 2.25.1
> 
> I think the much more interesting assertion here would be to check that
> MyProc->pid equals the current pid.

I don't mind changing this, but why is this a more interesting assertion?

-- 
Nathan Bossart
Amazon Web Services: https://aws.amazon.com


Reply via email to