예제 #1
0
파일: se_meta.c 프로젝트: holys/sophia
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);
}
예제 #2
0
파일: se_tx.c 프로젝트: Safari77/sophia
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;
}
예제 #3
0
파일: se.c 프로젝트: Safari77/sophia
#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);
예제 #4
0
파일: se_db.c 프로젝트: EgoIncarnate/sophia
		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;