static inline int sc_execute(sctask *t, scworker *w, uint64_t vlsn) { si *index = t->db->index; si_plannertrace(&t->plan, index->scheme.id, &w->trace); return si_execute(index, &w->dc, &t->plan, vlsn); }
static int se_run(setask *t, seworker *w) { si_plannertrace(&t->plan, &w->trace); sedb *db = t->db; se *e = (se*)db->o.env; uint64_t vlsn = sx_vlsn(&e->xm); return si_execute(&db->index, &w->dc, &t->plan, vlsn); }
static int so_execute(sotask *t, soworker *w) { si_plannertrace(&t->plan, &w->trace); sodb *db = t->db; so *e = (so*)db->o.env; uint64_t vlsn = sx_vlsn(&e->xm); return si_execute(&db->index, &db->r, &w->dc, &t->plan, vlsn); }
int se_scheduler_branch(void *arg) { sedb *db = arg; se *e = se_of(&db->o); srzone *z = se_zoneof(e); seworker stub; se_workerstub_init(&stub); int rc; while (1) { uint64_t vlsn = sx_vlsn(&e->xm); siplan plan = { .explain = SI_ENONE, .plan = SI_BRANCH, .a = z->branch_wm, .b = 0, .c = 0, .node = NULL }; rc = si_plan(&db->index, &plan); if (rc == 0) break; rc = si_execute(&db->index, &stub.dc, &plan, vlsn); if (ssunlikely(rc == -1)) break; } se_workerstub_free(&stub, &db->r); return rc; } int se_scheduler_compact(void *arg) { sedb *db = arg; se *e = se_of(&db->o); srzone *z = se_zoneof(e); seworker stub; se_workerstub_init(&stub); int rc; while (1) { uint64_t vlsn = sx_vlsn(&e->xm); siplan plan = { .explain = SI_ENONE, .plan = SI_COMPACT, .a = z->compact_wm, .b = z->compact_mode, .c = 0, .node = NULL }; rc = si_plan(&db->index, &plan); if (rc == 0) break; rc = si_execute(&db->index, &stub.dc, &plan, vlsn); if (ssunlikely(rc == -1)) break; } se_workerstub_free(&stub, &db->r); return rc; } int se_scheduler_checkpoint(void *arg) { se *o = arg; sescheduler *s = &o->sched; uint64_t lsn = sr_seq(&o->seq, SR_LSN); ss_mutexlock(&s->lock); s->checkpoint_lsn = lsn; s->checkpoint = 1; ss_mutexunlock(&s->lock); return 0; }
int sc_ctl_branch(sc *s, uint64_t vlsn, si *index) { sr *r = s->r; int rc = sr_statusactive(r->status); if (ssunlikely(rc == 0)) return 0; srzone *z = sr_zoneof(r); scworker *w = sc_workerpool_pop(&s->wp, r); if (ssunlikely(w == NULL)) return -1; while (1) { uint64_t vlsn_lru = si_lru_vlsn(index); siplan plan = { .explain = SI_ENONE, .plan = SI_BRANCH, .a = z->branch_wm, .b = 0, .c = 0, .node = NULL }; rc = si_plan(index, &plan); if (rc == 0) break; rc = si_execute(index, &w->dc, &plan, vlsn, vlsn_lru); if (ssunlikely(rc == -1)) break; } sc_workerpool_push(&s->wp, w); return rc; } int sc_ctl_compact(sc *s, uint64_t vlsn, si *index) { sr *r = s->r; int rc = sr_statusactive(r->status); if (ssunlikely(rc == 0)) return 0; srzone *z = sr_zoneof(r); scworker *w = sc_workerpool_pop(&s->wp, r); if (ssunlikely(w == NULL)) return -1; while (1) { uint64_t vlsn_lru = si_lru_vlsn(index); siplan plan = { .explain = SI_ENONE, .plan = SI_COMPACT, .a = z->compact_wm, .b = z->compact_mode, .c = 0, .node = NULL }; rc = si_plan(index, &plan); if (rc == 0) break; rc = si_execute(index, &w->dc, &plan, vlsn, vlsn_lru); if (ssunlikely(rc == -1)) break; } sc_workerpool_push(&s->wp, w); return rc; } int sc_ctl_compact_index(sc *s, uint64_t vlsn, si *index) { sr *r = s->r; int rc = sr_statusactive(r->status); if (ssunlikely(rc == 0)) return 0; srzone *z = sr_zoneof(r); scworker *w = sc_workerpool_pop(&s->wp, r); if (ssunlikely(w == NULL)) return -1; while (1) { uint64_t vlsn_lru = si_lru_vlsn(index); siplan plan = { .explain = SI_ENONE, .plan = SI_COMPACT_INDEX, .a = z->branch_wm, .b = 0, .c = 0, .node = NULL }; rc = si_plan(index, &plan); if (rc == 0) break; rc = si_execute(index, &w->dc, &plan, vlsn, vlsn_lru); if (ssunlikely(rc == -1)) break; } sc_workerpool_push(&s->wp, w); return rc; } int sc_ctl_anticache(sc *s) { uint64_t asn = sr_seq(s->r->seq, SR_ASNNEXT); ss_mutexlock(&s->lock); s->anticache_asn = asn; s->anticache_storage = s->anticache_limit; s->anticache = 1; ss_mutexunlock(&s->lock); return 0; }
int se_scheduler_branch(void *arg) { sedb *db = arg; se *e = se_of(&db->o); srzone *z = se_zoneof(e); seworker *w = se_workerpool_pop(&e->sched.workers, &e->r); if (ssunlikely(w == NULL)) return -1; int rc; while (1) { uint64_t vlsn = sx_vlsn(&e->xm); uint64_t vlsn_lru = si_lru_vlsn(&db->index); siplan plan = { .explain = SI_ENONE, .plan = SI_BRANCH, .a = z->branch_wm, .b = 0, .c = 0, .node = NULL }; rc = si_plan(&db->index, &plan); if (rc == 0) break; rc = si_execute(&db->index, &w->dc, &plan, vlsn, vlsn_lru); if (ssunlikely(rc == -1)) break; } se_workerpool_push(&e->sched.workers, w); return rc; } int se_scheduler_compact(void *arg) { sedb *db = arg; se *e = se_of(&db->o); srzone *z = se_zoneof(e); seworker *w = se_workerpool_pop(&e->sched.workers, &e->r); if (ssunlikely(w == NULL)) return -1; int rc; while (1) { uint64_t vlsn = sx_vlsn(&e->xm); uint64_t vlsn_lru = si_lru_vlsn(&db->index); siplan plan = { .explain = SI_ENONE, .plan = SI_COMPACT, .a = z->compact_wm, .b = z->compact_mode, .c = 0, .node = NULL }; rc = si_plan(&db->index, &plan); if (rc == 0) break; rc = si_execute(&db->index, &w->dc, &plan, vlsn, vlsn_lru); if (ssunlikely(rc == -1)) break; } se_workerpool_push(&e->sched.workers, w); return rc; } int se_scheduler_compact_index(void *arg) { sedb *db = arg; se *e = se_of(&db->o); srzone *z = se_zoneof(e); seworker *w = se_workerpool_pop(&e->sched.workers, &e->r); if (ssunlikely(w == NULL)) return -1; int rc; while (1) { uint64_t vlsn = sx_vlsn(&e->xm); uint64_t vlsn_lru = si_lru_vlsn(&db->index); siplan plan = { .explain = SI_ENONE, .plan = SI_COMPACT_INDEX, .a = z->branch_wm, .b = 0, .c = 0, .node = NULL }; rc = si_plan(&db->index, &plan); if (rc == 0) break; rc = si_execute(&db->index, &w->dc, &plan, vlsn, vlsn_lru); if (ssunlikely(rc == -1)) break; } se_workerpool_push(&e->sched.workers, w); return rc; } int se_scheduler_anticache(void *arg) { se *o = arg; sescheduler *s = &o->sched; uint64_t asn = sr_seq(&o->seq, SR_ASNNEXT); ss_mutexlock(&s->lock); s->anticache_asn = asn; s->anticache_storage = o->conf.anticache; s->anticache = 1; ss_mutexunlock(&s->lock); return 0; }