56 #define PGARCH_AUTOWAKE_INTERVAL 60
58 #define PGARCH_RESTART_INTERVAL 10
65 #define NUM_ARCHIVE_RETRIES 3
71 #define NUM_ORPHAN_CLEANUP_RETRIES 3
76 #define NUM_FILES_PER_DIRECTORY_SCAN 64
193 static time_t last_pgarch_start_time = 0;
194 time_t curtime = time(NULL);
200 if ((
unsigned int) (curtime - last_pgarch_start_time) <
204 last_pgarch_start_time = curtime;
289 int save_errno = errno;
333 time_t curtime = time(NULL);
344 last_copy_time = time(NULL);
400 int failures_orphan = 0;
404 struct stat stat_buf;
429 (
errmsg(
"archive_mode enabled, yet archiving is not configured")));
443 if (
stat(pathname, &stat_buf) != 0 && errno == ENOENT)
448 if (unlink(xlogready) == 0)
451 (
errmsg(
"removed orphan archive status file \"%s\"",
461 (
errmsg(
"removal of orphan archive status file \"%s\" failed too many times, will try again later",
497 (
errmsg(
"archiving write-ahead log file \"%s\" failed too many times, will try again later",
524 snprintf(activitymsg,
sizeof(activitymsg),
"archiving %s", xlog);
529 snprintf(activitymsg,
sizeof(activitymsg),
"last was %s", xlog);
531 snprintf(activitymsg,
sizeof(activitymsg),
"failed on %s", xlog);
595 if (
stat(status_file, &st) == 0)
597 strcpy(xlog, arch_file);
600 else if (errno != ENOENT)
603 errmsg(
"could not stat file \"%s\": %m", status_file)));
616 while ((rlde =
ReadDir(rldir, XLogArchiveStatusDir)) != NULL)
618 int basenamelen = (int) strlen(rlde->
d_name) - 6;
632 if (strcmp(rlde->
d_name + basenamelen,
".ready") != 0)
636 memcpy(basename, rlde->
d_name, basenamelen);
637 basename[basenamelen] =
'\0';
646 strcpy(arch_file, basename);
661 strcpy(arch_file, basename);
710 if (a_history != b_history)
711 return a_history ? -1 : 1;
714 return strcmp(a_str, b_str);
784 bool archiveLibChanged;
792 if (archiveLibChanged)
809 (
errmsg(
"restarting archiver process because value of "
810 "\"archive_library\" was changed")));
838 "_PG_archive_module_init",
false, NULL);
840 if (archive_init == NULL)
842 (
errmsg(
"archive modules have to declare the _PG_archive_module_init symbol")));
848 (
errmsg(
"archive modules must register an archive callback")));
void binaryheap_build(binaryheap *heap)
void binaryheap_add_unordered(binaryheap *heap, Datum d)
void binaryheap_reset(binaryheap *heap)
binaryheap * binaryheap_allocate(int capacity, binaryheap_comparator compare, void *arg)
Datum binaryheap_remove_first(binaryheap *heap)
Datum binaryheap_first(binaryheap *heap)
void binaryheap_add(binaryheap *heap, Datum d)
#define MemSet(start, val, len)
void * load_external_function(const char *filename, const char *funcname, bool signalNotFound, void **filehandle)
int errcode_for_file_access(void)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
struct dirent * ReadDir(DIR *dir, const char *dirname)
int durable_rename(const char *oldfile, const char *newfile, int elevel)
DIR * AllocateDir(const char *dirname)
volatile sig_atomic_t LogMemoryContextPending
volatile sig_atomic_t ProcSignalBarrierPending
void ProcessConfigFile(GucContext context)
void SignalHandlerForShutdownRequest(SIGNAL_ARGS)
volatile sig_atomic_t ShutdownRequestPending
volatile sig_atomic_t ConfigReloadPending
void SignalHandlerForConfigReload(SIGNAL_ARGS)
void on_shmem_exit(pg_on_exit_callback function, Datum arg)
#define PG_ENSURE_ERROR_CLEANUP(cleanup_function, arg)
#define PG_END_ENSURE_ERROR_CLEANUP(cleanup_function, arg)
void SetLatch(Latch *latch)
void ResetLatch(Latch *latch)
int WaitLatch(Latch *latch, int wakeEvents, long timeout, uint32 wait_event_info)
#define WL_POSTMASTER_DEATH
Assert(fmt[strlen(fmt) - 1] !='\n')
char * pstrdup(const char *in)
void pfree(void *pointer)
void ProcessLogMemoryContextInterrupt(void)
static volatile bool time_to_stop
static bool pgarch_archiveXlog(char *xlog)
static void pgarch_die(int code, Datum arg)
#define PGARCH_RESTART_INTERVAL
bool PgArchCanRestart(void)
static bool pgarch_readyXlog(char *xlog)
static PgArchData * PgArch
static void pgarch_MainLoop(void)
#define NUM_ARCHIVE_RETRIES
struct PgArchData PgArchData
static void pgarch_waken_stop(SIGNAL_ARGS)
static volatile sig_atomic_t ready_to_stop
void PgArchiverMain(void)
static struct arch_files_state * arch_files
char * XLogArchiveLibrary
Size PgArchShmemSize(void)
static void LoadArchiveLibrary(void)
static void pgarch_ArchiverCopyLoop(void)
static int ready_file_comparator(Datum a, Datum b, void *arg)
#define NUM_FILES_PER_DIRECTORY_SCAN
void PgArchForceDirScan(void)
static void call_archive_module_shutdown_callback(int code, Datum arg)
static ArchiveModuleCallbacks ArchiveContext
static void HandlePgArchInterrupts(void)
void PgArchShmemInit(void)
static void pgarch_archiveDone(char *xlog)
#define NUM_ORPHAN_CLEANUP_RETRIES
#define PGARCH_AUTOWAKE_INTERVAL
static time_t last_sigterm_time
void(* ArchiveModuleInit)(ArchiveModuleCallbacks *cb)
void pgstat_report_archiver(const char *xlog, bool failed)
#define PostmasterIsAlive()
#define CStringGetDatum(X)
#define DatumGetCString(X)
void ProcessProcSignalBarrier(void)
void procsignal_sigusr1_handler(SIGNAL_ARGS)
void set_ps_display(const char *activity)
void shell_archive_init(ArchiveModuleCallbacks *cb)
Size add_size(Size s1, Size s2)
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
void pg_usleep(long microsec)
pqsigfunc pqsignal(int signum, pqsigfunc handler)
#define SpinLockInit(lock)
#define SpinLockRelease(lock)
#define SpinLockAcquire(lock)
ArchiveFileCB archive_file_cb
ArchiveShutdownCB shutdown_cb
ArchiveCheckConfiguredCB check_configured_cb
char arch_filenames[NUM_FILES_PER_DIRECTORY_SCAN][MAX_XFN_CHARS+1]
char * arch_files[NUM_FILES_PER_DIRECTORY_SCAN]
@ WAIT_EVENT_ARCHIVER_MAIN
#define XLogArchivingActive()
#define IsTLHistoryFileName(fname)
#define StatusFilePath(path, xlog, suffix)