83 lines
1.9 KiB
C++
83 lines
1.9 KiB
C++
#include "gtm/gtm_c.h"
|
|
#include "gtm/gtm_lock.h"
|
|
#include "gtm/gtm_txn.h"
|
|
#include "gtm/gtm_seq.h"
|
|
#include "gtm/gtm_backup.h"
|
|
#include "gtm/elog.h"
|
|
|
|
GTM_RWLock gtm_bkup_lock;
|
|
bool gtm_need_bkup;
|
|
|
|
extern char GTMControlFile[];
|
|
|
|
void GTM_WriteRestorePoint(void)
|
|
{
|
|
FILE* f;
|
|
|
|
GTM_RWLockAcquire(>m_bkup_lock, GTM_LOCKMODE_WRITE);
|
|
if (!gtm_need_bkup) {
|
|
GTM_RWLockRelease(>m_bkup_lock);
|
|
return;
|
|
}
|
|
|
|
f = fopen(GTMControlFile, "w");
|
|
if (f == NULL) {
|
|
ereport(LOG, (errno, errmsg("Cannot open control file"), errhint("%s", strerror(errno))));
|
|
return;
|
|
}
|
|
gtm_need_bkup = FALSE;
|
|
GTM_RWLockRelease(>m_bkup_lock);
|
|
GTM_WriteRestorePointXid(f);
|
|
GTM_WriteRestorePointSeq(f);
|
|
fclose(f);
|
|
}
|
|
|
|
void GTM_WriteBarrierBackup(char* barrier_id)
|
|
{
|
|
#define MyMAXPATH 1023
|
|
|
|
FILE* f;
|
|
char BarrierFilePath[MyMAXPATH + 1];
|
|
extern char* GTMDataDir;
|
|
|
|
int rc = -1;
|
|
rc = snprintf_s(BarrierFilePath, MyMAXPATH, MyMAXPATH - 1, "%s/GTM_%s.control", GTMDataDir, barrier_id);
|
|
securec_check_ss(rc, "\0", "\0");
|
|
|
|
if ((f = fopen(BarrierFilePath, "w")) == NULL) {
|
|
ereport(LOG, (errno, errmsg("Cannot open control file"), errhint("%s", strerror(errno))));
|
|
return;
|
|
}
|
|
GTM_RWLockAcquire(>m_bkup_lock, GTM_LOCKMODE_WRITE);
|
|
gtm_need_bkup = FALSE;
|
|
GTM_RWLockRelease(>m_bkup_lock);
|
|
GTM_WriteRestorePointXid(f);
|
|
GTM_WriteRestorePointSeq(f);
|
|
fclose(f);
|
|
}
|
|
|
|
void GTM_MakeBackup(char* path)
|
|
{
|
|
FILE* f = fopen(path, "w");
|
|
|
|
if (f == NULL) {
|
|
ereport(LOG, (errno, errmsg("Cannot open backup file %s", path), errhint("%s", strerror(errno))));
|
|
return;
|
|
}
|
|
GTM_SaveTxnInfo(f);
|
|
GTM_SaveSeqInfo(f);
|
|
fclose(f);
|
|
}
|
|
|
|
void GTM_SetNeedBackup(void)
|
|
{
|
|
GTM_RWLockAcquire(>m_bkup_lock, GTM_LOCKMODE_READ);
|
|
gtm_need_bkup = TRUE;
|
|
GTM_RWLockRelease(>m_bkup_lock);
|
|
}
|
|
|
|
bool GTM_NeedBackup(void)
|
|
{
|
|
return gtm_need_bkup;
|
|
}
|