#include "pgstat.h"
 #include "replication/slot.h"
 #include "storage/fd.h"
+#include "storage/ipc.h"
 #include "storage/proc.h"
 #include "storage/procarray.h"
 #include "utils/builtins.h"
 int            max_replication_slots = 0;  /* the maximum number of replication
                                         * slots */
 
+static void ReplicationSlotShmemExit(int code, Datum arg);
 static void ReplicationSlotDropAcquired(void);
 static void ReplicationSlotDropPtr(ReplicationSlot *slot);
 
    }
 }
 
+/*
+ * Register the callback for replication slot cleanup and releasing.
+ */
+void
+ReplicationSlotInitialize(void)
+{
+   before_shmem_exit(ReplicationSlotShmemExit, 0);
+}
+
+/*
+ * Release and cleanup replication slots.
+ */
+static void
+ReplicationSlotShmemExit(int code, Datum arg)
+{
+   /* Make sure active replication slots are released */
+   if (MyReplicationSlot != NULL)
+       ReplicationSlotRelease();
+
+   /* Also cleanup all the temporary slots. */
+   ReplicationSlotCleanup();
+}
+
 /*
  * Check whether the passed slot name is valid and report errors at elevel.
  *
 
    /* Cancel any pending condition variable sleep, too */
    ConditionVariableCancelSleep();
 
-   /* Make sure active replication slots are released */
-   if (MyReplicationSlot != NULL)
-       ReplicationSlotRelease();
-
-   /* Also cleanup all the temporary slots. */
-   ReplicationSlotCleanup();
-
    /*
     * Detach from any lock group of which we are a member.  If the leader
     * exist before all other group members, its PGPROC will remain allocated
 
         * We can't release replication slots inside AbortTransaction() as we
         * need to be able to start and abort transactions while having a slot
         * acquired. But we never need to hold them across top level errors,
-        * so releasing here is fine. There's another cleanup in ProcKill()
-        * ensuring we'll correctly cleanup on FATAL errors as well.
+        * so releasing here is fine. There also is a before_shmem_exit()
+        * callback ensuring correct cleanup on FATAL errors.
         */
        if (MyReplicationSlot != NULL)
            ReplicationSlotRelease();
 
 #include "pgstat.h"
 #include "postmaster/autovacuum.h"
 #include "postmaster/postmaster.h"
+#include "replication/slot.h"
 #include "replication/walsender.h"
 #include "storage/bufmgr.h"
 #include "storage/fd.h"
     * ever try to insert XLOG.
     */
    InitXLogInsert();
+
+   /*
+    * Initialize replication slots after pgstat. The exit hook might need to
+    * drop ephemeral slots, which in turn triggers stats reporting.
+    */
+   ReplicationSlotInitialize();
 }
 
 
 
 extern void ReplicationSlotMarkDirty(void);
 
 /* misc stuff */
+extern void ReplicationSlotInitialize(void);
 extern bool ReplicationSlotValidateName(const char *name, int elevel);
 extern void ReplicationSlotReserveWal(void);
 extern void ReplicationSlotsComputeRequiredXmin(bool already_locked);