Changeset: abaa47e4e552 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/abaa47e4e552 Modified Files: gdk/gdk.h gdk/gdk_bbp.c gdk/gdk_logger.c gdk/gdk_logger_old.c gdk/gdk_private.h gdk/gdk_utils.c Branch: default Log Message:
Create extra farm for system transients. diffs (196 lines): diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -541,6 +541,7 @@ typedef size_t BUN; typedef enum { PERSISTENT = 0, TRANSIENT, + SYSTRANS, } role_t; /* Heap storage modes */ diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -1108,7 +1108,7 @@ BBPaddfarm(const char *dirname, uint32_t GDKerror("no newline allowed in directory name\n"); return GDK_FAIL; } - if (rolemask == 0 || (rolemask & 1 && BBPfarms[0].dirname != NULL)) { + if (rolemask == 0 || (rolemask & 1 && BBPfarms[0].roles != 0)) { if (logerror) GDKerror("bad rolemask\n"); return GDK_FAIL; @@ -1181,6 +1181,36 @@ BBPaddfarm(const char *dirname, uint32_t return GDK_FAIL; } +gdk_return +BBPchkfarms(void) +{ + const char *dir = NULL; + uint32_t rolemask = 0; + if ((BBPfarms[0].roles & 1) == 0) { + GDKerror("Must at least call BBPaddfarms for once for persistent data\n"); + return GDK_FAIL; + } + for (int i = 0; i < MAXFARMS; i++) { + if (BBPfarms[i].roles != 0) { + dir = BBPfarms[i].dirname; + rolemask |= BBPfarms[i].roles; + } + } + if (dir == NULL) + dir = "in-memory"; + if ((rolemask & (1U << TRANSIENT)) == 0) { + gdk_return rc = BBPaddfarm(dir, 1U << TRANSIENT, true); + if (rc != GDK_SUCCEED) + return rc; + } + if ((rolemask & (1U << SYSTRANS)) == 0) { + gdk_return rc = BBPaddfarm(dir, 1U << SYSTRANS, true); + if (rc != GDK_SUCCEED) + return rc; + } + return GDK_SUCCEED; +} + #ifdef GDKLIBRARY_HASHASH static gdk_return fixhashashbat(BAT *b) diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -1218,7 +1218,7 @@ log_read_transaction(logger *lg) else { if (l.id > 0) { // START OF LOG_BAT_GROUP - cands = COLnew(0, TYPE_void, 0, TRANSIENT); + cands = COLnew(0, TYPE_void, 0, SYSTRANS); if (!cands) err = LOG_ERR; } @@ -1527,8 +1527,8 @@ cleanup_and_swap(logger *lg, int *r, con BUN ocnt = BATcount(catalog_bid); nbids = logbat_new(TYPE_int, ocnt-cleanup, PERSISTENT); noids = logbat_new(TYPE_int, ocnt-cleanup, PERSISTENT); - ncnts = logbat_new(TYPE_lng, ocnt-cleanup, TRANSIENT); - nlids = logbat_new(TYPE_lng, ocnt-cleanup, TRANSIENT); + ncnts = logbat_new(TYPE_lng, ocnt-cleanup, SYSTRANS); + nlids = logbat_new(TYPE_lng, ocnt-cleanup, SYSTRANS); ndels = logbat_new(TYPE_oid, BATcount(dcatalog)-cleanup, PERSISTENT); if (nbids == NULL || noids == NULL || ncnts == NULL || nlids == NULL || ndels == NULL) { @@ -1996,12 +1996,12 @@ log_load(int debug, const char *fn, cons BBPretain(lg->catalog_id->batCacheid); BBPretain(lg->dcatalog->batCacheid); } - lg->catalog_cnt = logbat_new(TYPE_lng, 1, TRANSIENT); + lg->catalog_cnt = logbat_new(TYPE_lng, 1, SYSTRANS); if (lg->catalog_cnt == NULL) { GDKerror("failed to create catalog_cnt bat"); goto error; } - lg->catalog_lid = logbat_new(TYPE_lng, 1, TRANSIENT); + lg->catalog_lid = logbat_new(TYPE_lng, 1, SYSTRANS); if (lg->catalog_lid == NULL) { GDKerror("failed to create catalog_lid bat"); goto error; diff --git a/gdk/gdk_logger_old.c b/gdk/gdk_logger_old.c --- a/gdk/gdk_logger_old.c +++ b/gdk/gdk_logger_old.c @@ -1390,7 +1390,7 @@ logger_load(const char *fn, char filenam catalog_tpe = BBPindex(bak); t = BATdescriptor(catalog_tpe); if (t == NULL) { - t = logbat_new(TYPE_bte, BATSIZE, TRANSIENT); + t = logbat_new(TYPE_bte, BATSIZE, SYSTRANS); if (t == NULL ||BBPrename(t, bak) < 0) { BBPunfix(b->batCacheid); @@ -1416,7 +1416,7 @@ logger_load(const char *fn, char filenam catalog_oid = BBPindex(bak); o = BATdescriptor(catalog_oid); if (o == NULL) { - o = logbat_new(TYPE_lng, BATSIZE, TRANSIENT); + o = logbat_new(TYPE_lng, BATSIZE, SYSTRANS); if (o == NULL ||BBPrename(o, bak) < 0) { BBPunfix(b->batCacheid); @@ -1446,7 +1446,7 @@ logger_load(const char *fn, char filenam /* older database: create dcatalog and convert * catalog_bid and catalog_nme to * dense-headed */ - d = logbat_new(TYPE_oid, BATSIZE, TRANSIENT); + d = logbat_new(TYPE_oid, BATSIZE, SYSTRANS); if (d == NULL) { GDKerror("Logger_new: cannot create dcatalog bat"); BBPunfix(b->batCacheid); @@ -1492,7 +1492,7 @@ logger_load(const char *fn, char filenam goto error; } - lg->freed = logbat_new(TYPE_int, 1, TRANSIENT); + lg->freed = logbat_new(TYPE_int, 1, SYSTRANS); if (lg->freed == NULL) { GDKerror("Logger_new: failed to create freed bat"); goto error; @@ -1501,9 +1501,9 @@ logger_load(const char *fn, char filenam if (snapshots_bid < 0) goto error; if (snapshots_bid == 0) { - lg->snapshots_bid = logbat_new(TYPE_int, 1, TRANSIENT); - lg->snapshots_tid = logbat_new(TYPE_int, 1, TRANSIENT); - lg->dsnapshots = logbat_new(TYPE_oid, 1, TRANSIENT); + lg->snapshots_bid = logbat_new(TYPE_int, 1, SYSTRANS); + lg->snapshots_tid = logbat_new(TYPE_int, 1, SYSTRANS); + lg->dsnapshots = logbat_new(TYPE_oid, 1, SYSTRANS); if (lg->snapshots_bid == NULL || lg->snapshots_tid == NULL || lg->dsnapshots == NULL) { @@ -1539,7 +1539,7 @@ logger_load(const char *fn, char filenam goto error; BBPretain(dsnapshots); } else { - lg->dsnapshots = logbat_new(TYPE_oid, 1, TRANSIENT); + lg->dsnapshots = logbat_new(TYPE_oid, 1, SYSTRANS); if (lg->dsnapshots == NULL) { GDKerror("Logger_new: cannot create dsnapshot bat"); goto error; @@ -1686,8 +1686,8 @@ logger_new(logger *lg, const char *fn, c .id = 1, }; - old_lg->add = COLnew(0, TYPE_int, 0, TRANSIENT); - old_lg->del = COLnew(0, TYPE_int, 0, TRANSIENT); + old_lg->add = COLnew(0, TYPE_int, 0, SYSTRANS); + old_lg->del = COLnew(0, TYPE_int, 0, SYSTRANS); if (old_lg->add == NULL || old_lg->del == NULL) { TRC_CRITICAL(GDK, "cannot allocate temporary bats\n"); goto bailout; diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h --- a/gdk/gdk_private.h +++ b/gdk/gdk_private.h @@ -96,6 +96,9 @@ ValPtr BATsetprop_nolock(BAT *b, enum pr gdk_return BBPcacheit(BAT *bn, bool lock) __attribute__((__warn_unused_result__)) __attribute__((__visibility__("hidden"))); +gdk_return BBPchkfarms(void) + __attribute__((__warn_unused_result__)) + __attribute__((__visibility__("hidden"))); void BBPclear(bat bid, bool lock) __attribute__((__visibility__("hidden"))); void BBPdump(void) /* never called: for debugging only */ diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c --- a/gdk/gdk_utils.c +++ b/gdk/gdk_utils.c @@ -897,6 +897,9 @@ GDKinit(opt *set, int setlen, bool embed mainpid = MT_getpid(); + if (BBPchkfarms() != GDK_SUCCEED) + return GDK_FAIL; + if (GDKinmemory(0)) { dbpath = dbtrace = NULL; } else { _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org