static inline int se_metav_offline(srmeta *c, srmetastmt *s) { se *e = s->ptr; if (s->op == SR_WRITE) { if (se_status(&e->status)) { sr_error(s->r->e, "write to %s is offline-only", s->path); return -1; } } return se_metav(c, s); }
static inline int se_txwrite(setx *t, sev *o, uint8_t flags) { se *e = se_of(&t->o); sedb *db = se_cast(o->o.parent, sedb*, SEDB); /* validate req */ if (ssunlikely(t->t.state == SXPREPARE)) { sr_error(&e->error, "%s", "transaction is in 'prepare' state (read-only)"); goto error; } /* validate database status */ int status = se_status(&db->status); switch (status) { case SE_SHUTDOWN: if (ssunlikely(! se_dbvisible(db, t->t.id))) { sr_error(&e->error, "%s", "database is invisible for the transaction"); goto error; } break; case SE_RECOVER: case SE_ONLINE: break; default: goto error; } if (flags == SVUPDATE && !sf_updatehas(&db->scheme.fmt_update)) flags = 0; /* prepare object */ svv *v; int rc = se_dbv(db, o, 0, &v); if (ssunlikely(rc == -1)) goto error; v->flags = flags; v->log = o->log; sv vp; sv_init(&vp, &sv_vif, v, NULL); so_destroy(&o->o); /* ensure quota */ int size = sizeof(svv) + sv_size(&vp); ss_quota(&e->quota, SS_QADD, size); /* concurrent index only */ rc = sx_set(&t->t, &db->coindex, v); if (ssunlikely(rc == -1)) { ss_quota(&e->quota, SS_QREMOVE, size); return -1; } return 0; error: so_destroy(&o->o); return -1; }
#include <libsf.h> #include <libsr.h> #include <libso.h> #include <libsv.h> #include <libsl.h> #include <libsd.h> #include <libsi.h> #include <libsx.h> #include <libsy.h> #include <libse.h> static int se_open(so *o) { se *e = se_cast(o, se*, SE); int status = se_status(&e->status); if (status == SE_RECOVER) { assert(e->meta.two_phase_recover == 1); goto online; } if (status != SE_OFFLINE) return -1; int rc; rc = se_metavalidate(&e->meta); if (ssunlikely(rc == -1)) return -1; se_statusset(&e->status, SE_RECOVER); /* set memory quota (disable during recovery) */ ss_quotaset(&e->quota, e->meta.memory_limit); ss_quotaenable(&e->quota, 0);
db->cache = cache; } db->r.scheme = &s->scheme; db->r.fmt = s->fmt; db->r.fmt_storage = s->fmt_storage; db->r.fmt_upsert = &s->fmt_upsert; return 0; } static int se_dbopen(so *o) { sedb *db = se_cast(o, sedb*, SEDB); se *e = se_of(&db->o); int status = se_status(&db->status); if (status == SE_RECOVER) goto online; if (status != SE_OFFLINE) return -1; int rc = se_dbscheme_set(db); if (ssunlikely(rc == -1)) return -1; sx_indexset(&db->coindex, db->scheme.id); rc = se_recoverbegin(db); if (ssunlikely(rc == -1)) return -1; if (se_status(&e->status) == SE_RECOVER) if (e->conf.recover != SE_RECOVER_NP) return 0;