static inline int se_backupcomplete(sescheduler *s, seworker *w) { /* * a. rotate log file * b. copy log files * c. enable log gc * d. rename <bsn.incomplete> into <bsn> * e. set last backup, set COMPLETE */ se *e = (se*)s->env; /* force log rotation */ ss_trace(&w->trace, "%s", "log rotation for backup"); int rc = sl_poolrotate(&e->lp); if (ssunlikely(rc == -1)) return -1; /* copy log files */ ss_trace(&w->trace, "%s", "log files backup"); char path[1024]; snprintf(path, sizeof(path), "%s/%" PRIu32 ".incomplete/log", e->conf.backup_path, s->backup_bsn); rc = sl_poolcopy(&e->lp, path, &w->dc.c); if (ssunlikely(rc == -1)) { sr_errorrecover(&e->error); return -1; } /* enable log gc */ sl_poolgc_enable(&e->lp, 1); /* complete backup */ snprintf(path, sizeof(path), "%s/%" PRIu32 ".incomplete", e->conf.backup_path, s->backup_bsn); char newpath[1024]; snprintf(newpath, sizeof(newpath), "%s/%" PRIu32, e->conf.backup_path, s->backup_bsn); rc = rename(path, newpath); if (ssunlikely(rc == -1)) { sr_error(&e->error, "backup directory '%s' rename error: %s", path, strerror(errno)); return -1; } /* complete */ s->backup_last = s->backup_bsn; s->backup_last_complete = 1; s->backup = 0; s->backup_bsn = 0; return 0; }
int sc_backupend(sc *s, scworker *w) { /* * a. rotate log file * b. copy log files * c. enable log gc * d. rename <bsn.incomplete> into <bsn> * e. set last backup, set COMPLETE */ /* force log rotation */ ss_trace(&w->trace, "%s", "log rotation for backup"); int rc = sl_poolrotate(s->lp); if (ssunlikely(rc == -1)) return -1; /* copy log files */ ss_trace(&w->trace, "%s", "log files backup"); char path[1024]; snprintf(path, sizeof(path), "%s/%" PRIu32 ".incomplete/log", s->backup_path, s->backup_bsn); rc = sl_poolcopy(s->lp, path, &w->dc.c); if (ssunlikely(rc == -1)) return -1; /* complete backup */ snprintf(path, sizeof(path), "%s/%" PRIu32 ".incomplete", s->backup_path, s->backup_bsn); char newpath[1024]; snprintf(newpath, sizeof(newpath), "%s/%" PRIu32, s->backup_path, s->backup_bsn); rc = ss_vfsrename(s->r->vfs, path, newpath); if (ssunlikely(rc == -1)) { sr_error(s->r->e, "backup directory '%s' rename error: %s", path, strerror(errno)); return -1; } /* enable log gc */ sl_poolgc_enable(s->lp, 1); /* complete */ ss_mutexlock(&s->lock); s->backup_bsn_last = s->backup_bsn; s->backup_bsn_last_complete = 1; s->backup_in_progress = 0; s->backup = 0; s->backup_bsn = 0; ss_mutexunlock(&s->lock); return 0; }
static int se_rotate(sescheduler *s, seworker *w) { ss_trace(&w->trace, "%s", "log rotation"); se *e = (se*)s->env; int rc = sl_poolrotate_ready(&e->lp, e->conf.log_rotate_wm); if (rc) { rc = sl_poolrotate(&e->lp); if (ssunlikely(rc == -1)) return -1; } return 0; }
static int so_rotate(soscheduler *s, soworker *w) { sr_trace(&w->trace, "%s", "log rotation"); so *e = s->env; int rc = sl_poolrotate_ready(&e->lp, e->ctl.log_rotate_wm); if (rc) { rc = sl_poolrotate(&e->lp); if (srunlikely(rc == -1)) return -1; } return 0; }
} sv_logfree(log, c->a); } static void sl_itertx(void) { slconf conf = { .path = st_r.conf->log_dir, .enable = 1, .rotatewm = 1000 }; slpool lp; t( sl_poolinit(&lp, &st_r.r) == 0 ); t( sl_poolopen(&lp, &conf) == 0 ); t( sl_poolrotate(&lp) == 0 ); svlog log; sv_loginit(&log); alloclogv(&log, &st_r.r, 0, 0, 7); sltx ltx; t( sl_begin(&lp, <x) == 0 ); t( sl_write(<x, &log) == 0 ); t( sl_commit(<x) == 0 ); freelog(&log, &st_r.r); t( sl_poolshutdown(&lp) == 0 ); }