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]

Reply via email to