Changeset: 197efae327fe for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/197efae327fe
Modified Files:
gdk/gdk_logger.c
gdk/gdk_logger_old.c
sql/storage/bat/bat_logger.c
Branch: default
Log Message:
Set all persistent catalog bats to read-only with forced updates.
This makes that these bats do not become copy-on-write mmaps if they
grow large.
diffs (truncated from 455 to 300 lines):
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -258,16 +258,16 @@ log_read_seq(logger *lg, logformat *l)
if ((p = log_find(lg->seqs_id, lg->dseqs, seq)) != BUN_NONE &&
p >= lg->seqs_id->batInserted) {
assert(lg->seqs_val->hseqbase == 0);
- if (BUNreplace(lg->seqs_val, p, &val, false) != GDK_SUCCEED)
+ if (BUNreplace(lg->seqs_val, p, &val, true) != GDK_SUCCEED)
return LOG_ERR;
} else {
if (p != BUN_NONE) {
oid pos = p;
- if (BUNappend(lg->dseqs, &pos, false) != GDK_SUCCEED)
+ if (BUNappend(lg->dseqs, &pos, true) != GDK_SUCCEED)
return LOG_ERR;
}
- if (BUNappend(lg->seqs_id, &seq, false) != GDK_SUCCEED ||
- BUNappend(lg->seqs_val, &val, false) != GDK_SUCCEED)
+ if (BUNappend(lg->seqs_id, &seq, true) != GDK_SUCCEED ||
+ BUNappend(lg->seqs_val, &val, true) != GDK_SUCCEED)
return LOG_ERR;
}
return LOG_OK;
@@ -1575,7 +1575,10 @@ cleanup_and_swap(logger *lg, int *r, con
/* point of no return */
if (log_switch_bat(catalog_bid, nbids, lg->fn, "catalog_bid") !=
GDK_SUCCEED ||
log_switch_bat(catalog_id, noids, lg->fn, "catalog_id") !=
GDK_SUCCEED ||
- log_switch_bat(dcatalog, ndels, lg->fn, "dcatalog") != GDK_SUCCEED)
{
+ log_switch_bat(dcatalog, ndels, lg->fn, "dcatalog") != GDK_SUCCEED
||
+ (nbids = BATsetaccess(nbids, BAT_READ)) == NULL ||
+ (noids = BATsetaccess(noids, BAT_READ)) == NULL ||
+ (ndels = BATsetaccess(ndels, BAT_READ)) == NULL) {
logbat_destroy(nbids);
logbat_destroy(noids);
logbat_destroy(ndels);
@@ -1717,7 +1720,9 @@ bm_subcommit(logger *lg)
BATclear(lg->dseqs, true);
if (log_switch_bat(lg->seqs_id, ids, lg->fn, "seqs_id") !=
GDK_SUCCEED ||
- log_switch_bat(lg->seqs_val, vals, lg->fn, "seqs_val") !=
GDK_SUCCEED) {
+ log_switch_bat(lg->seqs_val, vals, lg->fn, "seqs_val") !=
GDK_SUCCEED ||
+ (ids = BATsetaccess(ids, BAT_READ)) == NULL ||
+ (vals = BATsetaccess(vals, BAT_READ)) == NULL) {
logbat_destroy(ids);
logbat_destroy(vals);
GDKfree(n);
@@ -1887,6 +1892,11 @@ log_load(int debug, const char *fn, cons
GDKerror("cannot create catalog bats");
goto error;
}
+ if ((lg->catalog_bid = BATsetaccess(lg->catalog_bid, BAT_READ))
== NULL ||
+ (lg->catalog_id = BATsetaccess(lg->catalog_id, BAT_READ))
== NULL ||
+ (lg->dcatalog = BATsetaccess(lg->dcatalog, BAT_READ)) ==
NULL) {
+ goto error;
+ }
if (debug & 1)
fprintf(stderr, "#create %s catalog\n", fn);
@@ -1988,10 +1998,15 @@ log_load(int debug, const char *fn, cons
if (BBPretain(bid) == 0 && /* any bid in the
catalog_bid, needs one logical ref */
BUNfnd(lg->dcatalog, &pos) == BUN_NONE &&
- BUNappend(lg->dcatalog, &pos, false) !=
GDK_SUCCEED)
+ BUNappend(lg->dcatalog, &pos, true) !=
GDK_SUCCEED)
goto error;
}
}
+ if ((lg->catalog_bid = BATsetaccess(lg->catalog_bid, BAT_READ))
== NULL ||
+ (lg->catalog_id = BATsetaccess(lg->catalog_id, BAT_READ))
== NULL ||
+ (lg->dcatalog = BATsetaccess(lg->dcatalog, BAT_READ)) ==
NULL) {
+ goto error;
+ }
BBPretain(lg->catalog_bid->batCacheid);
BBPretain(lg->catalog_id->batCacheid);
BBPretain(lg->dcatalog->batCacheid);
@@ -2043,6 +2058,11 @@ log_load(int debug, const char *fn, cons
}
needcommit = true;
}
+ if ((lg->seqs_val = BATsetaccess(lg->seqs_val, BAT_READ)) == NULL ||
+ (lg->seqs_id = BATsetaccess(lg->seqs_id, BAT_READ)) == NULL ||
+ (lg->dseqs = BATsetaccess(lg->dseqs, BAT_READ)) == NULL) {
+ goto error;
+ }
dbg = GDKdebug;
GDKdebug &= ~CHECKMASK;
if (needcommit && bm_commit(lg) != GDK_SUCCEED) {
@@ -3044,13 +3064,7 @@ log_add_bat(logger *lg, BAT *b, log_id i
lng cnt = 0;
lng lid = lng_nil;
- assert(b->batRestricted != BAT_WRITE ||
- b == lg->catalog_bid ||
- b == lg->catalog_id ||
- b == lg->dcatalog ||
- b == lg->seqs_id ||
- b == lg->seqs_val ||
- b == lg->dseqs);
+ assert(b->batRestricted != BAT_WRITE);
assert(b->batRole == PERSISTENT);
if (bid < 0)
return GDK_FAIL;
@@ -3068,8 +3082,8 @@ log_add_bat(logger *lg, BAT *b, log_id i
assert(log_find(lg->catalog_bid, lg->dcatalog, bid) == BUN_NONE);
if (BUNappend(lg->catalog_bid, &bid, true) != GDK_SUCCEED ||
BUNappend(lg->catalog_id, &id, true) != GDK_SUCCEED ||
- BUNappend(lg->catalog_cnt, &cnt, true) != GDK_SUCCEED ||
- BUNappend(lg->catalog_lid, &lid, true) != GDK_SUCCEED)
+ BUNappend(lg->catalog_cnt, &cnt, false) != GDK_SUCCEED ||
+ BUNappend(lg->catalog_lid, &lid, false) != GDK_SUCCEED)
return GDK_FAIL;
lg->cnt++;
BBPretain(bid);
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
@@ -379,11 +379,11 @@ log_read_seq(old_logger *lg, logformat *
} else {
if (p != BUN_NONE) {
oid pos = p;
- if (BUNappend(lg->dseqs, &pos, false) != GDK_SUCCEED)
+ if (BUNappend(lg->dseqs, &pos, true) != GDK_SUCCEED)
return LOG_ERR;
}
- if (BUNappend(lg->seqs_id, &seq, false) != GDK_SUCCEED ||
- BUNappend(lg->seqs_val, &val, false) != GDK_SUCCEED)
+ if (BUNappend(lg->seqs_id, &seq, true) != GDK_SUCCEED ||
+ BUNappend(lg->seqs_val, &val, true) != GDK_SUCCEED)
return LOG_ERR;
}
return LOG_OK;
@@ -726,7 +726,7 @@ la_bat_destroy(old_logger *lg, logaction
assert(BBPfarms[b->tvheap->farmid].roles & (1
<< PERSISTENT));
}
#endif
- if (BUNappend(lg->dsnapshots, &pos, false) !=
GDK_SUCCEED)
+ if (BUNappend(lg->dsnapshots, &pos, true) !=
GDK_SUCCEED)
return GDK_FAIL;
}
}
@@ -847,18 +847,18 @@ la_bat_use(old_logger *lg, logaction *la
if ((p = log_find(lg->snapshots_bid, lg->dsnapshots, b->batCacheid)) !=
BUN_NONE &&
p >= lg->snapshots_bid->batInserted) {
assert(lg->snapshots_tid->hseqbase == 0);
- if (BUNreplace(lg->snapshots_tid, p, &lg->tid, false) !=
GDK_SUCCEED)
+ if (BUNreplace(lg->snapshots_tid, p, &lg->tid, true) !=
GDK_SUCCEED)
goto bailout;
} else {
if (p != BUN_NONE) {
oid pos = p;
- if (BUNappend(lg->dsnapshots, &pos, false) !=
GDK_SUCCEED)
+ if (BUNappend(lg->dsnapshots, &pos, true) !=
GDK_SUCCEED)
goto bailout;
}
/* move to the dirty new part of the snapshots list,
* new snapshots will get flushed to disk */
- if (BUNappend(lg->snapshots_bid, &b->batCacheid, false) !=
GDK_SUCCEED ||
- BUNappend(lg->snapshots_tid, &lg->tid, false) !=
GDK_SUCCEED)
+ if (BUNappend(lg->snapshots_bid, &b->batCacheid, true) !=
GDK_SUCCEED ||
+ BUNappend(lg->snapshots_tid, &lg->tid, true) != GDK_SUCCEED)
goto bailout;
}
logbat_destroy(b);
@@ -1469,11 +1469,12 @@ logger_load(const char *fn, char filenam
BBPretain(d->batCacheid);
}
- lg->catalog_bid = b;
- lg->catalog_nme = n;
- lg->catalog_tpe = t;
- lg->catalog_oid = o;
- lg->dcatalog = d;
+ if ((lg->catalog_bid = BATsetaccess(b, BAT_READ)) == NULL ||
+ (lg->catalog_nme = BATsetaccess(n, BAT_READ)) == NULL ||
+ (lg->catalog_tpe = BATsetaccess(t, BAT_READ)) == NULL ||
+ (lg->catalog_oid = BATsetaccess(o, BAT_READ)) == NULL ||
+ (lg->dcatalog = BATsetaccess(d, BAT_READ)) == NULL)
+ goto error;
if (BUNappend(lg->del, &b->batCacheid, false) != GDK_SUCCEED)
goto error;
BBPretain(b->batCacheid);
@@ -1489,7 +1490,7 @@ logger_load(const char *fn, char filenam
if (BUNfnd(lg->dcatalog, &pos) == BUN_NONE &&
BBPretain(bid) == 0 &&
- BUNappend(lg->dcatalog, &pos, false) != GDK_SUCCEED)
+ BUNappend(lg->dcatalog, &pos, true) != GDK_SUCCEED)
goto error;
}
@@ -1542,7 +1543,7 @@ logger_load(const char *fn, char filenam
} else {
lg->dsnapshots = logbat_new(TYPE_oid, 1, SYSTRANS);
if (lg->dsnapshots == NULL) {
- GDKerror("Logger_new: cannot create dsnapshot
bat");
+ GDKerror("Logger_new: cannot create dsnapshots
bat");
goto error;
}
}
@@ -1553,6 +1554,11 @@ logger_load(const char *fn, char filenam
goto error;
BBPretain(snapshots_tid);
}
+ if ((lg->snapshots_bid = BATsetaccess(lg->snapshots_bid, BAT_READ)) ==
NULL ||
+ (lg->snapshots_tid = BATsetaccess(lg->snapshots_tid, BAT_READ)) ==
NULL ||
+ (lg->dsnapshots = BATsetaccess(lg->dsnapshots, BAT_READ)) == NULL) {
+ goto error;
+ }
strconcat_len(bak, sizeof(bak), fn, "_seqs_id", NULL);
if (BBPindex(bak)) {
lg->seqs_id = BATdescriptor(BBPindex(bak));
@@ -1595,6 +1601,11 @@ logger_load(const char *fn, char filenam
goto error;
BBPretain(lg->dseqs->batCacheid);
}
+ if ((lg->seqs_val = BATsetaccess(lg->seqs_val, BAT_READ)) == NULL ||
+ (lg->seqs_id = BATsetaccess(lg->seqs_id, BAT_READ)) == NULL ||
+ (lg->dseqs = BATsetaccess(lg->dseqs, BAT_READ)) == NULL) {
+ goto error;
+ }
if (check_version(lg, fp, version) != GDK_SUCCEED) {
goto error;
@@ -1735,13 +1746,7 @@ old_logger_destroy(old_logger *lg)
BATloop(lg->add, p, q) {
b = BATdescriptor(bids[p]);
if (b) {
- if (b != lg->lg->catalog_bid &&
- b != lg->lg->catalog_id &&
- b != lg->lg->dcatalog &&
- b != lg->lg->seqs_id &&
- b != lg->lg->seqs_val &&
- b != lg->lg->dseqs)
- b = BATsetaccess(b, BAT_READ);
+ b = BATsetaccess(b, BAT_READ);
BATmode(b, false);
BBPunfix(bids[p]);
}
@@ -1917,18 +1922,7 @@ logger_add_bat(old_logger *lg, BAT *b, c
log_bid bid = old_logger_find_bat(lg, name, tpe, id);
lng lid = tpe ? (lng) id : 0;
- assert(b->batRestricted != BAT_WRITE ||
- b == lg->snapshots_bid ||
- b == lg->snapshots_tid ||
- b == lg->dsnapshots ||
- b == lg->catalog_bid ||
- b == lg->catalog_nme ||
- b == lg->catalog_tpe ||
- b == lg->catalog_oid ||
- b == lg->dcatalog ||
- b == lg->seqs_id ||
- b == lg->seqs_val ||
- b == lg->dseqs);
+ assert(b->batRestricted != BAT_WRITE);
assert(b->batRole == PERSISTENT);
if (bid < 0)
return GDK_FAIL;
@@ -1945,10 +1939,10 @@ logger_add_bat(old_logger *lg, BAT *b, c
fprintf(stderr, "#create %s\n", NAME(name, tpe, id));
assert(log_find(lg->catalog_bid, lg->dcatalog, bid) == BUN_NONE);
lg->changes += BATcount(b) + 1000;
- if (BUNappend(lg->catalog_bid, &bid, false) != GDK_SUCCEED ||
- BUNappend(lg->catalog_nme, name, false) != GDK_SUCCEED ||
- BUNappend(lg->catalog_tpe, &tpe, false) != GDK_SUCCEED ||
- BUNappend(lg->catalog_oid, &lid, false) != GDK_SUCCEED)
+ if (BUNappend(lg->catalog_bid, &bid, true) != GDK_SUCCEED ||
+ BUNappend(lg->catalog_nme, name, true) != GDK_SUCCEED ||
+ BUNappend(lg->catalog_tpe, &tpe, true) != GDK_SUCCEED ||
+ BUNappend(lg->catalog_oid, &lid, true) != GDK_SUCCEED)
return GDK_FAIL;
BBPretain(bid);
return GDK_SUCCEED;
@@ -1974,7 +1968,7 @@ logger_del_bat(old_logger *lg, log_bid b
if (p >= lg->catalog_bid->batInserted &&
(q = log_find(lg->snapshots_bid, lg->dsnapshots, bid)) != BUN_NONE)
{
pos = (oid) q;
- if (BUNappend(lg->dsnapshots, &pos, false) != GDK_SUCCEED) {
+ if (BUNappend(lg->dsnapshots, &pos, true) != GDK_SUCCEED) {
logbat_destroy(b);
return GDK_FAIL;
}
@@ -1999,6 +1993,6 @@ logger_del_bat(old_logger *lg, log_bid b
BBPunfix(b->batCacheid);
}
pos = (oid) p;
- return BUNappend(lg->dcatalog, &pos, false);
+ return BUNappend(lg->dcatalog, &pos, true);
/*assert(BBP_lrefs(bid) == 0);*/
}
diff --git a/sql/storage/bat/bat_logger.c b/sql/storage/bat/bat_logger.c
--- a/sql/storage/bat/bat_logger.c
+++ b/sql/storage/bat/bat_logger.c
@@ -94,7 +94,7 @@ replace_bat(old_logger *old_lg, logger *
if (old_lg != NULL) {
if ((rc = BUNappend(old_lg->del, &oldcolid, false)) ==
GDK_SUCCEED &&
(rc = BUNappend(old_lg->add, &newcol->batCacheid,
false)) == GDK_SUCCEED &&
- (rc = BUNreplace(lg->catalog_bid,
BUNfnd(lg->catalog_id, &colid), &newcol->batCacheid, false)) == GDK_SUCCEED) {
+ (rc = BUNreplace(lg->catalog_bid,
BUNfnd(lg->catalog_id, &colid), &newcol->batCacheid, true)) == GDK_SUCCEED) {
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]