• Thomas Munro's avatar
    Fix race between DROP TABLESPACE and checkpointing. · 26e00793
    Thomas Munro authored
    Commands like ALTER TABLE SET TABLESPACE may leave files for the next
    checkpoint to clean up.  If such files are not removed by the time DROP
    TABLESPACE is called, we request a checkpoint so that they are deleted.
    However, there is presently a window before checkpoint start where new
    unlink requests won't be scheduled until the following checkpoint.  This
    means that the checkpoint forced by DROP TABLESPACE might not remove the
    files we expect it to remove, and the following ERROR will be emitted:
    
    	ERROR:  tablespace "mytblspc" is not empty
    
    To fix, add a call to AbsorbSyncRequests() just before advancing the
    unlink cycle counter.  This ensures that any unlink requests forwarded
    prior to checkpoint start (i.e., when ckpt_started is incremented) will
    be processed by the current checkpoint.  Since AbsorbSyncRequests()
    performs memory allocations, it cannot be called within a critical
    section, so we also need to move SyncPreCheckpoint() to before
    CreateCheckPoint()'s critical section.
    
    This is an old bug, so back-patch to all supported versions.
    
    Author: Nathan Bossart <nathandbossart@gmail.com>
    Reported-by: default avatarNathan Bossart <nathandbossart@gmail.com>
    Reviewed-by: default avatarThomas Munro <thomas.munro@gmail.com>
    Reviewed-by: default avatarAndres Freund <andres@anarazel.de>
    Discussion: https://postgr.es/m/20220215235845.GA2665318%40nathanxps13
    26e00793
sync.c 19.8 KB