int sc_backupbegin(sc *s) { /* * a. create backup_path/<bsn.incomplete> directory * b. create database directories * c. create log directory */ char path[1024]; snprintf(path, sizeof(path), "%s/%" PRIu32 ".incomplete", s->backup_path, s->backup_bsn); int rc = ss_vfsmkdir(s->r->vfs, path, 0755); if (ssunlikely(rc == -1)) { sr_error(s->r->e, "backup directory '%s' create error: %s", path, strerror(errno)); return -1; } int i = 0; while (i < s->count) { scdb *db = &s->i[i]; snprintf(path, sizeof(path), "%s/%" PRIu32 ".incomplete/%s", s->backup_path, s->backup_bsn, db->index->scheme.name); rc = ss_vfsmkdir(s->r->vfs, path, 0755); if (ssunlikely(rc == -1)) { sr_error(s->r->e, "backup directory '%s' create error: %s", path, strerror(errno)); return -1; } i++; } snprintf(path, sizeof(path), "%s/%" PRIu32 ".incomplete/log", s->backup_path, s->backup_bsn); rc = ss_vfsmkdir(s->r->vfs, path, 0755); if (ssunlikely(rc == -1)) { sr_error(s->r->e, "backup directory '%s' create error: %s", path, strerror(errno)); return -1; } ss_mutexlock(&s->lock); s->backup = 2; s->backup_in_progress = s->count; i = 0; while (i < s->count) { sc_task_backup(&s->i[i]); i++; } ss_mutexunlock(&s->lock); return 0; }
static inline int se_backupstart(sescheduler *s) { se *e = (se*)s->env; /* * a. create backup_path/<bsn.incomplete> directory * b. create database directories * c. create log directory */ char path[1024]; snprintf(path, sizeof(path), "%s/%" PRIu32 ".incomplete", e->conf.backup_path, s->backup_bsn); int rc = ss_vfsmkdir(&e->vfs, path, 0755); if (ssunlikely(rc == -1)) { sr_error(&e->error, "backup directory '%s' create error: %s", path, strerror(errno)); return -1; } int i = 0; while (i < s->count) { sedb *db = s->i[i]; snprintf(path, sizeof(path), "%s/%" PRIu32 ".incomplete/%s", e->conf.backup_path, s->backup_bsn, db->scheme.name); rc = ss_vfsmkdir(&e->vfs, path, 0755); if (ssunlikely(rc == -1)) { sr_error(&e->error, "backup directory '%s' create error: %s", path, strerror(errno)); return -1; } i++; } snprintf(path, sizeof(path), "%s/%" PRIu32 ".incomplete/log", e->conf.backup_path, s->backup_bsn); rc = ss_vfsmkdir(&e->vfs, path, 0755); if (ssunlikely(rc == -1)) { sr_error(&e->error, "backup directory '%s' create error: %s", path, strerror(errno)); return -1; } return 0; }
static int sy_deploy(sy *e, sr *r) { int rc; rc = ss_vfsmkdir(r->vfs, e->conf->path, 0755); if (ssunlikely(rc == -1)) { sr_error(r->e, "directory '%s' create error: %s", e->conf->path, strerror(errno)); return -1; } return 0; }
static inline int sy_recoverbackup(sy *i, sr *r) { if (i->conf->path_backup == NULL) return 0; int rc; int exists = ss_vfsexists(r->vfs, i->conf->path_backup); if (! exists) { rc = ss_vfsmkdir(r->vfs, i->conf->path_backup, 0755); if (ssunlikely(rc == -1)) { sr_error(r->e, "backup directory '%s' create error: %s", i->conf->path_backup, strerror(errno)); return -1; } } /* recover backup sequential number */ DIR *dir = opendir(i->conf->path_backup); if (ssunlikely(dir == NULL)) { sr_error(r->e, "backup directory '%s' open error: %s", i->conf->path_backup, strerror(errno)); return -1; } uint32_t bsn = 0; struct dirent *de; while ((de = readdir(dir))) { if (ssunlikely(de->d_name[0] == '.')) continue; uint32_t id = 0; rc = sy_process(de->d_name, &id); switch (rc) { case 1: case 0: if (id > bsn) bsn = id; break; case -1: /* skip unknown file */ continue; } } closedir(dir); r->seq->bsn = bsn; return 0; }
sinode *si_bootstrap(si *i, uint64_t parent) { sr *r = i->r; /* create node */ sinode *n = si_nodenew(r); if (ssunlikely(n == NULL)) return NULL; sdid id = { .parent = parent, .flags = 0, .id = sr_seq(r->seq, SR_NSNNEXT) }; int rc; rc = si_nodecreate(n, r, i->scheme, &id); if (ssunlikely(rc == -1)) goto e0; n->branch = &n->self; n->branch_count++; /* in-memory mode support */ ssblob *blob = NULL; if (i->scheme->storage == SI_SIN_MEMORY) { blob = &n->self.copy; rc = ss_blobensure(blob, 4096); if (ssunlikely(rc == -1)) goto e0; n->in_memory = 1; } /* create index with one empty page */ sdindex index; sd_indexinit(&index); rc = sd_indexbegin(&index, r); if (ssunlikely(rc == -1)) goto e0; ssqf f, *qf = NULL; ss_qfinit(&f); sdbuild build; sd_buildinit(&build); rc = sd_buildbegin(&build, r, i->scheme->node_page_checksum, i->scheme->compression_key, i->scheme->compression, i->scheme->compression_if); if (ssunlikely(rc == -1)) goto e1; sd_buildend(&build, r); rc = sd_indexadd(&index, r, &build, sizeof(sdseal)); if (ssunlikely(rc == -1)) goto e1; /* write seal */ uint64_t seal = n->file.size; rc = sd_writeseal(r, &n->file, blob); if (ssunlikely(rc == -1)) goto e1; /* write page */ rc = sd_writepage(r, &n->file, blob, &build); if (ssunlikely(rc == -1)) goto e1; /* amqf */ if (i->scheme->amqf) { rc = ss_qfensure(&f, r->a, 0); if (ssunlikely(rc == -1)) goto e1; qf = &f; } rc = sd_indexcommit(&index, r, &id, qf, n->file.size); if (ssunlikely(rc == -1)) goto e1; ss_qffree(&f, r->a); /* write index */ rc = sd_writeindex(r, &n->file, blob, &index); if (ssunlikely(rc == -1)) goto e1; /* close seal */ rc = sd_seal(r, &n->file, blob, &index, seal); if (ssunlikely(rc == -1)) goto e1; if (blob) { rc = ss_blobfit(blob); if (ssunlikely(rc == -1)) goto e1; } if (i->scheme->mmap) { rc = si_nodemap(n, r); if (ssunlikely(rc == -1)) goto e1; } si_branchset(&n->self, &index); sd_buildcommit(&build, r); sd_buildfree(&build, r); return n; e1: ss_qffree(&f, r->a); sd_indexfree(&index, r); sd_buildfree(&build, r); e0: si_nodefree(n, r, 0); return NULL; } static inline int si_deploy(si *i, sr *r, int create_directory) { /* create directory */ int rc; if (sslikely(create_directory)) { rc = ss_vfsmkdir(r->vfs, i->scheme->path, 0755); if (ssunlikely(rc == -1)) { sr_malfunction(r->e, "directory '%s' create error: %s", i->scheme->path, strerror(errno)); return -1; } } /* create scheme file */ rc = si_schemedeploy(i->scheme, r); if (ssunlikely(rc == -1)) { sr_malfunction_set(r->e); return -1; } /* create initial node */ sinode *n = si_bootstrap(i, 0); if (ssunlikely(n == NULL)) return -1; SS_INJECTION(r->i, SS_INJECTION_SI_RECOVER_0, si_nodefree(n, r, 0); sr_malfunction(r->e, "%s", "error injection"); return -1); rc = si_nodecomplete(n, r, i->scheme); if (ssunlikely(rc == -1)) { si_nodefree(n, r, 1); return -1; } si_insert(i, n); si_plannerupdate(&i->p, SI_COMPACT|SI_BRANCH|SI_TEMP, n); i->size = si_nodesize(n); return 1; }