Changeset: 5e48034183ab for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5e48034183ab
Modified Files:
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_storage.h
        sql/storage/bat/bat_table.c
Branch: Oct2014
Log Message:

Cache (delta bats) only during catalog loading.
Added caching of tids bats, solves mserver5 startup performance problems


diffs (159 lines):

diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -31,14 +31,22 @@ timestamp_delta( sql_delta *d, int ts)
 {
        while (d->next && d->wtime > ts) 
                d = d->next;
+       if (0 && d && d->cached) {
+               bat_destroy(d->cached);
+               d->cached = NULL;
+       }
        return d;
 }
 
-static sql_dbat *
+sql_dbat *
 timestamp_dbat( sql_dbat *d, int ts)
 {
        while (d->next && d->wtime > ts) 
                d = d->next;
+       if (0 && d && d->cached) {
+               bat_destroy(d->cached);
+               d->cached = NULL;
+       }
        return d;
 }
 
@@ -646,6 +654,11 @@ delete_tab(sql_trans *tr, sql_table * t,
        }
                bat = t->data;
        /* delete all cached copies */
+
+       if (bat->cached) {
+               bat_destroy(bat->cached);
+               bat->cached = NULL;
+       }
        for (n = t->columns.set->h; n; n = n->next) {
                sql_column *c = n->data;
                sql_delta *bat;
@@ -1259,6 +1272,10 @@ destroy_dbat(sql_trans *tr, sql_dbat *ba
                _DELETE(bat->dname);
        if (bat->dbid)
                temp_destroy(bat->dbid);
+       if (bat->cached) {
+               bat_destroy(bat->cached);
+               bat->cached = NULL;
+       }
        bat->dbid = 0;
        bat->dname = NULL;
        _DELETE(bat);
@@ -1712,6 +1729,15 @@ tr_update_dbat(sql_trans *tr, sql_dbat *
 
        if (!fdb)
                return ok;
+
+       if (fdb->cached) {
+               bat_destroy(fdb->cached);
+               fdb->cached = NULL;
+       }
+       if (tdb->cached) {
+               bat_destroy(tdb->cached);
+               tdb->cached = NULL;
+       }
        assert(store_nr_active==1);
        db = temp_descriptor(fdb->dbid);
        if (BUNlast(db) > db->batInserted || cleared) {
diff --git a/sql/storage/bat/bat_storage.h b/sql/storage/bat/bat_storage.h
--- a/sql/storage/bat/bat_storage.h
+++ b/sql/storage/bat/bat_storage.h
@@ -40,6 +40,7 @@ typedef struct sql_dbat {
        char *dname;            /* name of the persistent deletes bat */
        int dbid;               /* bat with deletes */
        size_t cnt;
+       BAT *cached;            /* cached copy, used for schema bats only */
        int wtime;              /* time stamp */
        struct sql_dbat *next;  /* possibly older version of the same deletes */
 } sql_dbat;
@@ -49,6 +50,7 @@ extern int bat_storage_init( store_funct
 
 extern int dup_bat(sql_trans *tr, sql_table *t, sql_delta *obat, sql_delta 
*bat, int type, int oc_isnew, int c_isnew);
 extern sql_delta * timestamp_delta( sql_delta *d, int ts);
+extern sql_dbat * timestamp_dbat( sql_dbat *d, int ts);
 
 #endif /*BATSTORAGE_H */
 
diff --git a/sql/storage/bat/bat_table.c b/sql/storage/bat/bat_table.c
--- a/sql/storage/bat/bat_table.c
+++ b/sql/storage/bat/bat_table.c
@@ -23,7 +23,7 @@
 #include "bat_storage.h"
 
 static BAT *
-delta_cands(sql_trans *tr, sql_table *t)
+_delta_cands(sql_trans *tr, sql_table *t)
 {
        sql_column *c = t->columns.set->h->data;
        /* create void,void bat with length and oid's set */
@@ -54,7 +54,26 @@ delta_cands(sql_trans *tr, sql_table *t)
 }
 
 static BAT *
-delta_full_bat_( sql_column *c, sql_delta *bat, int temp)
+delta_cands(sql_trans *tr, sql_table *t)
+{
+       sql_dbat *d;
+       BAT *tids;
+
+       if (!t->data) {
+               sql_table *ot = tr_find_table(tr->parent, t);
+               t->data = timestamp_dbat(ot->data, tr->stime);
+       }
+       d = t->data;
+       if (d->cached && !tr->parent) 
+               return temp_descriptor(d->cached->batCacheid);
+       tids = _delta_cands(tr, t);
+       if (!d->cached && !tr->parent) /* only cache during catalog loading */
+               d->cached = temp_descriptor(tids->batCacheid);
+       return tids;
+}
+
+static BAT *
+delta_full_bat_( sql_trans *tr, sql_column *c, sql_delta *bat, int temp)
 {
        /* return full normalized column bat
         *      b := b.copy()
@@ -91,17 +110,17 @@ delta_full_bat_( sql_column *c, sql_delt
        }
        bat_destroy(u); 
        (void)c;
-       if (!bat->cached) 
+       if (!bat->cached && !tr->parent) 
                bat->cached = temp_descriptor(b->batCacheid);
        return b;
 }
 
 static BAT *
-delta_full_bat( sql_column *c, sql_delta *bat, int temp)
+delta_full_bat( sql_trans *tr, sql_column *c, sql_delta *bat, int temp)
 {
-       if (bat->cached) 
+       if (bat->cached && !tr->parent) 
                return temp_descriptor(bat->cached->batCacheid);
-       return delta_full_bat_( c, bat, temp);
+       return delta_full_bat_( tr, c, bat, temp);
 }
 
 static BAT *
@@ -109,9 +128,9 @@ full_column(sql_trans *tr, sql_column *c
 {
        if (!c->data) {
                sql_column *oc = tr_find_column(tr->parent, c);
-               c->data = oc->data;
+               c->data = timestamp_delta(oc->data, tr->stime);
        }
-       return delta_full_bat(c, c->data, isTemp(c));
+       return delta_full_bat(tr, c, c->data, isTemp(c));
 }
 
 static oid column_find_row(sql_trans *tr, sql_column *c, const void *value, 
...);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to