Changeset: 93d47ac2c502 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=93d47ac2c502
Modified Files:
        sql/backends/monet5/sql.mx
        sql/backends/monet5/sql_optimizer.c
        sql/backends/monet5/sql_scenario.c
        sql/backends/monet5/vaults/fits.c
        sql/include/sql_catalog.h
        sql/server/rel_psm.c
        sql/server/rel_schema.c
        sql/server/rel_updates.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/storage/Makefile.ag
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_storage.h
        sql/storage/bat/bat_table.c
        sql/storage/bat/bat_table.h
        sql/storage/bat/bat_utils.c
        sql/storage/bat/bat_utils.h
        sql/storage/sql_catalog.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        
sql/test/BugTracker/Tests/set_sql_debug_64__breaking_the_DB.SF-1906287.stable.out
        sql/test/leaks/Tests/check0.stable.out
        sql/test/leaks/Tests/check1.stable.out
        sql/test/leaks/Tests/check2.stable.out
        sql/test/leaks/Tests/check3.stable.out
        sql/test/leaks/Tests/check4.stable.out
        sql/test/leaks/Tests/check5.stable.out
        sql/test/leaks/Tests/drop3.stable.out
        sql/test/leaks/Tests/select1.stable.out
        sql/test/leaks/Tests/select2.stable.out
        sql/test/leaks/Tests/temp1.stable.out
        sql/test/leaks/Tests/temp2.stable.out
        sql/test/leaks/Tests/temp3.stable.out
Branch: default
Log Message:

Instead of keeping 'delta' structures per running transaction we
now only keep 'delta's for committed transactions. These are then
used by running transactions. The multiple versions are cleaned up
once transactions which use them end.

Advantage, less copies / copying. Still far from perfect (ie
doesn't solve the vacuum problem and still an insert requires
to much copying)

With this change the restricted storage is removed, 'readonly' is
now only supported within the bat storage (ie the tables are
then automatically marked as readonly). Single user mode will
in the future return for maintenance mode.


diffs (truncated from 2824 to 300 lines):

diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx
--- a/sql/backends/monet5/sql.mx
+++ b/sql/backends/monet5/sql.mx
@@ -2000,7 +2000,7 @@ create_table_or_view( mvc *sql, char *sn
        sql_table *nt = NULL;
        node *n;
 
-       if (STORE_READONLY(active_store_type)) 
+       if (STORE_READONLY) 
                return sql_error(sql, 06, "25006!schema statements cannot be 
executed on a readonly database.");
 
        if (!s) 
@@ -2601,7 +2601,7 @@ SQLcatalog(Client cntxt, MalBlkPtr mb, M
        if (msg)
                return msg;
 
-       if (STORE_READONLY(active_store_type)) 
+       if (STORE_READONLY) 
                return sql_message("25006!schema statements cannot be executed 
on a readonly database.");
 
        switch (type) {
@@ -3731,12 +3731,12 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
                throw(SQL,"sql.tid","42S02!Table missing");
        c = t->columns.set->h->data;
 
-       nr = store_funcs.count_col(c, 1);
+       nr = store_funcs.count_col(tr, c, 1);
 
        if (isTable(t) && !readonly &&
           (t->base.flag != TR_NEW /* alter */) &&
            t->persistence == SQL_PERSIST && !t->commit_action) 
-               inr = store_funcs.count_col(c, 0);
+               inr = store_funcs.count_col(tr, c, 0);
        nr -= inr;
        if ( pci->argc == 6){ /* partitioned version */
                size_t cnt = nr;
@@ -3761,7 +3761,7 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
        tids->H->revsorted = 0;
        tids->T->revsorted = 0;
        
-       if (store_funcs.count_del(t)) {
+       if (store_funcs.count_del(tr, t)) {
                BAT *d = store_funcs.bind_del(tr, t, RD_INS);
                BAT *diff = BATkdiff(tids, BATmirror(d));
 
@@ -6856,7 +6856,6 @@ vacuum(Client cntxt, MalBlkPtr mb, MalSt
        sql_schema      *s;
        sql_table       *t;
        sql_column      *c;
-       sql_dbat *dbat;
        mvc *m = NULL;
        str msg = getSQLContext(cntxt,mb, &m, NULL);
        bat bid;
@@ -6882,31 +6881,11 @@ vacuum(Client cntxt, MalBlkPtr mb, MalSt
        if (!m->session->auto_commit)
                throw(SQL,name, "%s only allowed in auto commit mode", name + 
4);
 
-       /* lock the store, for single user/transaction */
-       store_lock();
-       while (store_nr_active > 1) {
-               store_unlock();
-               MT_sleep_ms(100);
-               store_lock();
-
-               /* flush old changes to disk */
-               sql_trans_end(m->session);
-               store_apply_deltas();
-               sql_trans_begin(m->session);
-       }
-
        tr = m->session->tr;
-       t->base.wtime = s->base.wtime = tr->wtime = tr->wstime;
-       t->base.rtime = s->base.rtime = tr->rtime = tr->stime;
 
        /* get the deletions BAT*/
        del = mvc_bind_dbat(m, *sch, *tbl, RD_INS);
-       dbat=t->data;
-
-       /* this code is insecure, because something may
-          go wrong while we compress the columns.
-          A two-phase action reduces the risks, but not all.
-          e.g. a crash during update of the catalog. */
+
        i=0;
        bids[i]=0;
        for (o = t->columns.set->h; o; o = o->next,i++) {
@@ -6919,7 +6898,6 @@ vacuum(Client cntxt, MalBlkPtr mb, MalSt
                        if (b)
                                BBPreleaseref(b->batCacheid);
                        BBPreleaseref(del->batCacheid);
-                       store_unlock();
                        if (!msg)
                                throw(SQL,name,"Can not access descriptor");
                        return msg;
@@ -6933,38 +6911,19 @@ vacuum(Client cntxt, MalBlkPtr mb, MalSt
        if ( i >= 2048 ) {
                for( i--; i>=0; i--)
                        BBPdecref(bids[i], TRUE);
-               store_unlock();
                throw(SQL,name,"Too many columns to handle, use copy instead");
        }
 
+       mvc_clear_table(m, t);
        for (o = t->columns.set->h, i=0; o; o = o->next, i++) {
                sql_column *c = o->data;
-               sql_delta *d = c->data;
-
-               if (d->bid)
-                       BBPdecref(d->bid, TRUE);
-               if (d->ibid)
-                       BBPdecref(d->ibid, TRUE);
-               d->bid = 0;
-               d->ibase = 0;
-               d->cnt -= dbat->cnt;
-               d->ibid = bids[i]; /* use the insert bat */
-               c->base.wtime = tr->wstime;
-               c->base.rtime = tr->stime;
-       }
-       BATclear(del, TRUE);
-       BBPreleaseref(del->batCacheid);
-       dbat->cnt = 0;
-       /* bat was cleared */
-       t->cleared = 1;
-
-       sql_trans_commit(m->session->tr);
-       /* write changes to disk */
-       sql_trans_end(m->session);
-       store_apply_deltas();
-       sql_trans_begin(m->session);
-       store_unlock();
-
+               BAT *ins = BATdescriptor(bids[i]); /* use the insert bat */
+
+               store_funcs.append_col(tr, c, ins, TYPE_bat);
+               BBPreleaseref(ins->batCacheid);
+               BBPdecref(bids[i], TRUE);
+       }
+       /* TODO indices */
        return MAL_SUCCEED;
 }
 
@@ -7285,7 +7244,7 @@ SQLrdfShred(Client cntxt, MalBlkPtr mb, 
        if (rid != oid_nil)
                throw(SQL, "sql.rdfShred", "graph name already exists in 
rdf.graph");
 
-       id = (int) store_funcs.count_col(gname, 1);
+       id = (int) store_funcs.count_col(m->session->tr, gname, 1);
        store_funcs.append_col(m->session->tr, gname, *name, TYPE_str);
        store_funcs.append_col(m->session->tr, gid, &id, TYPE_int);
 
diff --git a/sql/backends/monet5/sql_optimizer.c 
b/sql/backends/monet5/sql_optimizer.c
--- a/sql/backends/monet5/sql_optimizer.c
+++ b/sql/backends/monet5/sql_optimizer.c
@@ -89,6 +89,7 @@ SQLgetStatistics(Client cntxt, mvc *m, M
        InstrPtr *old = NULL;
        int oldtop, i, actions = 0, size = 0;
        lng clk = GDKusec();
+       sql_trans *tr = m->session->tr;
 
        old = mb->stmt;
        oldtop= mb->stop;
@@ -132,7 +133,7 @@ SQLgetStatistics(Client cntxt, mvc *m, M
 
                                /* skip alter on remote statements */
                                if (i && (!isRemote(i->t) && 
!isMergeTable(i->t))) {
-                                       cnt = store_funcs.count_idx(i, 1);
+                                       cnt = store_funcs.count_idx(tr, i, 1);
                                        assert(cnt <= (size_t) GDK_oid_max);
                                        b = 
store_funcs.bind_idx(m->session->tr,i,0);
                                        if ( b ) {
@@ -152,7 +153,7 @@ SQLgetStatistics(Client cntxt, mvc *m, M
                                if (c && (!isRemote(c->t) && 
!isMergeTable(c->t))) {
                                        not_null = !c->null;
 
-                                       cnt = store_funcs.count_col(c, 1);
+                                       cnt = store_funcs.count_col(tr, c, 1);
                                        assert(cnt <= (size_t) GDK_oid_max);
                                        b = 
store_funcs.bind_col(m->session->tr,c,0);
                                        if ( b ){
@@ -172,7 +173,7 @@ SQLgetStatistics(Client cntxt, mvc *m, M
                                if (t->columns.set->h) {
                                        c = t->columns.set->h->data;
 
-                                       cnt = store_funcs.count_col(c, 1);
+                                       cnt = store_funcs.count_col(tr, c, 1);
                                        rows = (wrd) cnt;
                                }
                        }
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -224,10 +224,7 @@ SQLinit(void)
                SQLdebug |= 64;
        if (readonly)
                SQLdebug |= 32;
-       if (((SQLdebug&96)==96 && (SQLnewcatalog = mvc_init(FALSE, store_suro, 
0)) < 0) ||
-                       ((SQLdebug&96)==64 && (SQLnewcatalog = mvc_init(FALSE, 
store_su, 0)) < 0) ||
-                       ((SQLdebug&96)==32 && (SQLnewcatalog = mvc_init(FALSE, 
store_ro, 0)) < 0) ||
-                       ((SQLdebug&112)==0 && (SQLnewcatalog = mvc_init(FALSE, 
store_bat, 0)) < 0))
+       if ((SQLnewcatalog = mvc_init(FALSE, store_bat, readonly, single_user, 
0)) < 0)
                throw(SQL, "SQLinit", "Catalogue initialization failed");
        SQLinitialized = TRUE;
        MT_lock_unset(&sql_contextLock, "SQL init");
diff --git a/sql/backends/monet5/vaults/fits.c 
b/sql/backends/monet5/vaults/fits.c
--- a/sql/backends/monet5/vaults/fits.c
+++ b/sql/backends/monet5/vaults/fits.c
@@ -201,6 +201,7 @@ str FITSexportTable(Client cntxt, MalBlk
        str msg = MAL_SUCCEED;
        str tname = *(str*) getArgReference(stk, pci, 1);
        mvc *m = NULL;
+       sql_trans *tr;
        sql_schema *sch;
        sql_table *tbl, *column, *tables = NULL;
        sql_column *col;
@@ -230,6 +231,7 @@ str FITSexportTable(Client cntxt, MalBlk
        if (msg)
                return msg;
 
+       tr = m->session->tr;
        sch = mvc_bind_schema(m, "sys");
 
        /* First step: look if the table exists in the database. If the table 
is not in the database, the export function cannot continue */
@@ -290,7 +292,7 @@ str FITSexportTable(Client cntxt, MalBlk
 
        col = mvc_bind_column(m, tbl, colname[0]);
 
-       nrows = store_funcs.count_col(col, 1);
+       nrows = store_funcs.count_col(tr, col, 1);
 
        snprintf(filename,BUFSIZ,"\n%s.fit",tname);
        mnstr_printf(GDKout, "Filename: %s\n", filename);
@@ -662,6 +664,7 @@ FITStest(int *res, str *fname)
 str FITSattach(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
        mvc *m = NULL;
+       sql_trans *tr;
        sql_schema *sch;
        sql_table *fits_tp, *fits_fl, *fits_tbl, *fits_col, *tbl = NULL;
        sql_column *col;
@@ -686,6 +689,7 @@ str FITSattach(Client cntxt, MalBlkPtr m
                return msg;
        }
 
+       tr = m->session->tr;
        sch = mvc_bind_schema(m, "sys");
 
        fits_fl = mvc_bind_table(m, sch, "fits_files");
@@ -708,14 +712,14 @@ str FITSattach(Client cntxt, MalBlkPtr m
 
        /* add row in the fits_files catalog table */
        col = mvc_bind_column(m, fits_fl, "id");
-       fid = store_funcs.count_col(col, 1) + 1;
+       fid = store_funcs.count_col(tr, col, 1) + 1;
        store_funcs.append_col(m->session->tr,
                mvc_bind_column(m, fits_fl, "id"), &fid, TYPE_int);
        store_funcs.append_col(m->session->tr,
                mvc_bind_column(m, fits_fl, "name"), fname, TYPE_str);
 
        col = mvc_bind_column(m, fits_tbl, "id");
-       tid = store_funcs.count_col(col, 1) + 1;
+       tid = store_funcs.count_col(tr, col, 1) + 1;
 
        if ((s = strrchr(fname, DIR_SEP)) == NULL)
                s = fname;
@@ -811,7 +815,7 @@ str FITSattach(Client cntxt, MalBlkPtr m
                /* read columns description */
                s = stmt;
                col = mvc_bind_column(m, fits_col, "id");
-               cid = store_funcs.count_col(col, 1) + 1;
+               cid = store_funcs.count_col(tr, col, 1) + 1;
                for (j = 1; j <= cnum; j++, cid++) {
                        fits_get_acolparms(fptr, j, cname, &tbcol, tunit, 
tform, &tscal, &tzero, tnull, tdisp, &status);
                        snprintf(stmt, BUFSIZ, FITS_INS_COL, (int)cid, cname, 
tform, tunit, j, (int)tid);
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -163,6 +163,7 @@ typedef int sqlid;
 typedef struct sql_base {
        int wtime;
        int rtime;
+       int allocated;
        int flag;
        sqlid id;
        char *name;
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -698,7 +698,7 @@ rel_create_func(mvc *sql, dlist *qname, 
        char *F = is_aggr?"AGGREGATE":(is_func?"FUNCTION":"PROCEDURE");
        char *KF = type==F_FILT?"FILTER ": type==F_UNION?"UNION ": "";
 
-       if (STORE_READONLY(active_store_type) && create) 
+       if (STORE_READONLY && create) 
                return sql_error(sql, 06, "schema statements cannot be executed 
on a readonly database.");
                        
        if (sname && !(s = mvc_bind_schema(sql, sname)))
@@ -1079,7 +1079,7 @@ rel_psm(mvc *sql, symbol *s)
                dlist *l = s->data.lval;
                int type = l->h->next->next->next->next->data.i_val;
 
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to