Changeset: f6ddcb764592 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f6ddcb764592
Modified Files:
        gdk/gdk_logger.c
        gdk/gdk_logger.h
        gdk/gdk_qsort.c
        gdk/gdk_qsort_impl.h
        sql/common/sql_list.c
        sql/server/rel_optimizer.c
        sql/server/sql_parser.y
        tools/mserver/monet_version.c.in
Branch: client-filetrans
Log Message:

Merge with default branch.


diffs (truncated from 700 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
@@ -936,8 +936,6 @@ tr_commit(logger *lg, trans *tr)
        return tr_destroy(tr);
 }
 
-static gdk_return log_sequence_nrs(logger *lg);
-
 #ifdef _MSC_VER
 #define access(file, mode)     _access(file, mode)
 #endif
@@ -991,7 +989,6 @@ logger_open(logger *lg)
 {
        char id[BUFSIZ];
        char *filename;
-       bat bid;
 
        snprintf(id, sizeof(id), LLFMT, lg->id);
        filename = GDKfilepath(BBPselectfarm(lg->dbfarm_role, 0, offheap), 
lg->dir, LOGFILE, id);
@@ -1003,36 +1000,12 @@ logger_open(logger *lg)
        }
        lg->end = 0;
 
-       if (lg->log == NULL || mnstr_errnr(lg->log) || log_sequence_nrs(lg) != 
GDK_SUCCEED) {
+       if (lg->log == NULL || mnstr_errnr(lg->log)) {
                fprintf(stderr, "!ERROR: logger_open: creating %s failed\n", 
filename);
                GDKfree(filename);
                return GDK_FAIL;
        }
        GDKfree(filename);
-       if ((bid = logger_find_bat(lg, "seqs_id", 0, 0)) != 0) {
-               int dbg = GDKdebug;
-               BAT *b;
-               GDKdebug &= ~CHECKMASK;
-               if ((b = BATdescriptor(bid)) == NULL ||
-                   BATmode(b, TRANSIENT) != GDK_SUCCEED ||
-                   logger_del_bat(lg, bid) != GDK_SUCCEED) {
-                       logbat_destroy(b);
-                       return GDK_FAIL;
-               }
-               logbat_destroy(b);
-               b = NULL;
-               if ((bid = logger_find_bat(lg, "seqs_val", 0, 0)) == 0 ||
-                   (b = BATdescriptor(bid)) == NULL ||
-                   BATmode(b, TRANSIENT) != GDK_SUCCEED ||
-                   logger_del_bat(lg, bid) != GDK_SUCCEED) {
-                       logbat_destroy(b);
-                       return GDK_FAIL;
-               }
-               logbat_destroy(b);
-               GDKdebug = dbg;
-               if (bm_commit(lg) != GDK_SUCCEED)
-                       return GDK_FAIL;
-       }
        return GDK_SUCCEED;
 }
 
@@ -1044,7 +1017,7 @@ logger_close(logger *lg)
 }
 
 static gdk_return
-logger_readlog(logger *lg, char *filename)
+logger_readlog(logger *lg, char *filename, bool *filemissing)
 {
        trans *tr = NULL;
        logformat l;
@@ -1067,6 +1040,7 @@ logger_readlog(logger *lg, char *filenam
                close_stream(lg->log);
                lg->log = NULL;
                GDKdebug = dbg;
+               *filemissing = true;
                return GDK_SUCCEED;
        }
        short byteorder;
@@ -1276,7 +1250,7 @@ logger_readlogs(logger *lg, FILE *fp, ch
                fprintf(stderr, "#logger_readlogs logger id is " LLFMT "\n", 
lg->id);
        }
 
-       while (fgets(id, sizeof(id), fp) != NULL) {
+       if (fgets(id, sizeof(id), fp) != NULL) {
                char log_filename[FILENAME_MAX];
                lng lid = strtoll(id, NULL, 10);
 
@@ -1285,13 +1259,20 @@ logger_readlogs(logger *lg, FILE *fp, ch
                }
 
                if (!lg->shared && lid >= lg->id) {
+                       bool filemissing = false;
+
                        lg->id = lid;
-                       snprintf(log_filename, sizeof(log_filename), "%s." 
LLFMT, filename, lg->id);
-                       res = logger_readlog(lg, log_filename);
+                       while (res == GDK_SUCCEED && !filemissing) {
+                               snprintf(log_filename, sizeof(log_filename), 
"%s." LLFMT, filename, lg->id);
+                               res = logger_readlog(lg, log_filename, 
&filemissing);
+                               if (!filemissing)
+                                       lg->id++;
+                       }
                } else {
+                       bool filemissing = false;
                        while (lid >= lg->id && res == GDK_SUCCEED) {
                                snprintf(log_filename, sizeof(log_filename), 
"%s." LLFMT, filename, lg->id);
-                               if ((res = logger_readlog(lg, log_filename)) != 
GDK_SUCCEED && lg->shared && lg->id > 1) {
+                               if ((res = logger_readlog(lg, log_filename, 
&filemissing)) != GDK_SUCCEED && lg->shared && lg->id > 1) {
                                        /* The only special case is if
                                         * the file is missing
                                         * altogether and the logger
@@ -1327,24 +1308,9 @@ logger_readlogs(logger *lg, FILE *fp, ch
 static gdk_return
 logger_commit(logger *lg)
 {
-       int id = LOG_SID;
-       BUN p;
-
        if (lg->debug & 1)
                fprintf(stderr, "#logger_commit\n");
 
-       p = log_find(lg->seqs_id, lg->dseqs, id);
-       if (p >= lg->seqs_val->batInserted) {
-               if (BUNinplace(lg->seqs_val, p, &lg->id, false) != GDK_SUCCEED)
-                       return GDK_FAIL;
-       } else {
-               oid pos = p;
-               if (BUNappend(lg->dseqs, &pos, false) != GDK_SUCCEED ||
-                   BUNappend(lg->seqs_id, &id, false) != GDK_SUCCEED ||
-                   BUNappend(lg->seqs_val, &lg->id, false) != GDK_SUCCEED)
-                       return GDK_FAIL;
-       }
-
        /* cleanup old snapshots */
        if (BATcount(lg->snapshots_bid)) {
                if (BATclear(lg->snapshots_bid, true) != GDK_SUCCEED ||
@@ -1431,7 +1397,7 @@ static gdk_return
 bm_subcommit(logger *lg, BAT *list_bid, BAT *list_nme, BAT *catalog_bid, BAT 
*catalog_nme, BAT *catalog_tpe, BAT *catalog_oid, BAT *dcatalog, BAT *extra, 
int debug)
 {
        BUN p, q;
-       BUN nn = 10 + BATcount(list_bid) + (extra ? BATcount(extra) : 0);
+       BUN nn = 13 + BATcount(list_bid) + (extra ? BATcount(extra) : 0);
        bat *n = GDKmalloc(sizeof(bat) * nn);
        int i = 0;
        BATiter iter = (list_nme)?bat_iterator(list_nme):bat_iterator(list_bid);
@@ -1475,6 +1441,7 @@ bm_subcommit(logger *lg, BAT *list_bid, 
                n[i++] = catalog_oid->batCacheid;
        }
        n[i++] = dcatalog->batCacheid;
+
        if (BATcount(dcatalog) > (BATcount(catalog_nme)/2) &&
            catalog_bid == list_bid &&
            catalog_nme == list_nme &&
@@ -1540,6 +1507,59 @@ bm_subcommit(logger *lg, BAT *list_bid, 
                lg->catalog_tpe = catalog_tpe = tpes;
                lg->catalog_oid = catalog_oid = oids;
        }
+       if (lg->seqs_id && list_nme) {
+               n[i++] = lg->seqs_id->batCacheid;
+               n[i++] = lg->seqs_val->batCacheid;
+               n[i++] = lg->dseqs->batCacheid;
+       }
+       if (list_nme && lg->seqs_id && BATcount(lg->dseqs) > 
(BATcount(lg->seqs_id)/2)) {
+               BAT *tids, *ids, *vals;
+
+               tids = bm_tids(lg->seqs_id, lg->dseqs);
+               if (tids == NULL) {
+                       GDKfree(n);
+                       return GDK_FAIL;
+               }
+               ids = logbat_new(TYPE_int, BATcount(tids), PERSISTENT);
+               vals = logbat_new(TYPE_lng, BATcount(tids), PERSISTENT);
+
+               if (ids == NULL || vals == NULL) {
+                       logbat_destroy(tids);
+                       logbat_destroy(ids);
+                       logbat_destroy(vals);
+                       GDKfree(n);
+                       return GDK_FAIL;
+               }
+
+               if (BATappend(ids, lg->seqs_id, tids, true) != GDK_SUCCEED ||
+                   BATappend(vals, lg->seqs_val, tids, true) != GDK_SUCCEED) { 
+                       logbat_destroy(tids);
+                       logbat_destroy(ids);
+                       logbat_destroy(vals);
+                       GDKfree(n);
+                       return GDK_FAIL;
+               }
+               logbat_destroy(tids);
+               BATclear(lg->dseqs, true);
+
+               if (logger_switch_bat(lg->seqs_id, ids, lg->fn, "seqs_id") != 
GDK_SUCCEED ||
+                   logger_switch_bat(lg->seqs_val, vals, lg->fn, "seqs_val") 
!= GDK_SUCCEED) {
+                       logbat_destroy(ids);
+                       logbat_destroy(vals);
+                       GDKfree(n);
+                       return GDK_FAIL;
+               }
+               n[i++] = ids->batCacheid;
+               n[i++] = vals->batCacheid;
+               n[i++] = lg->dseqs->batCacheid;
+
+               logbat_destroy(lg->seqs_id);
+               logbat_destroy(lg->seqs_val);
+
+               lg->seqs_id = ids;
+               lg->seqs_val = vals;
+       }
+
        assert((BUN) i <= nn);
        BATcommit(catalog_bid);
        BATcommit(catalog_nme);
@@ -1606,13 +1626,14 @@ logger_set_logdir_path(char *filename, c
 static gdk_return
 logger_load(int debug, const char *fn, char filename[FILENAME_MAX], logger *lg)
 {
-       int id = LOG_SID;
        FILE *fp = NULL;
        char bak[FILENAME_MAX];
        str filenamestr = NULL;
        log_bid snapshots_bid = 0;
        bat catalog_bid, catalog_nme, catalog_tpe, catalog_oid, dcatalog, bid;
        int farmid = BBPselectfarm(lg->dbfarm_role, 0, offheap);
+       bool needcommit = false;
+       int dbg = GDKdebug;
 
        if(!(filenamestr = GDKfilepath(farmid, lg->dir, LOGFILE, NULL)))
                goto error;
@@ -1904,24 +1925,6 @@ logger_load(int debug, const char *fn, c
        }
        snapshots_bid = logger_find_bat(lg, "snapshots_bid", 0, 0);
        if (snapshots_bid == 0) {
-               lg->seqs_id = logbat_new(TYPE_int, 1, TRANSIENT);
-               lg->seqs_val = logbat_new(TYPE_lng, 1, TRANSIENT);
-               lg->dseqs = logbat_new(TYPE_oid, 1, TRANSIENT);
-               if (lg->seqs_id == NULL ||
-                   lg->seqs_val == NULL ||
-                   lg->dseqs == NULL) {
-                       GDKerror("Logger_new: cannot create seqs bats");
-                       goto error;
-               }
-
-               /* create LOG_SID sequence number */
-               if (BUNappend(lg->seqs_id, &id, false) != GDK_SUCCEED ||
-                   BUNappend(lg->seqs_val, &lg->id, false) != GDK_SUCCEED) {
-                       GDKerror("logger_load: failed to append value to "
-                                "sequences bat");
-                       goto error;
-               }
-
                lg->snapshots_bid = logbat_new(TYPE_int, 1, PERSISTENT);
                lg->snapshots_tid = logbat_new(TYPE_int, 1, PERSISTENT);
                lg->dsnapshots = logbat_new(TYPE_oid, 1, PERSISTENT);
@@ -1968,47 +1971,8 @@ logger_load(int debug, const char *fn, c
                        goto error;
                }
        } else {
-               bat seqs_id = logger_find_bat(lg, "seqs_id", 0, 0);
-               bat seqs_val = logger_find_bat(lg, "seqs_val", 0, 0);
                bat snapshots_tid = logger_find_bat(lg, "snapshots_tid", 0, 0);
                bat dsnapshots = logger_find_bat(lg, "dsnapshots", 0, 0);
-               bool needcommit = false;
-               int dbg = GDKdebug;
-
-               if (seqs_id) {
-                       BAT *o_id;
-                       BAT *o_val;
-
-                       /* don't check these bats since they will be fixed */
-                       GDKdebug &= ~CHECKMASK;
-                       o_id = BATdescriptor(seqs_id);
-                       o_val = BATdescriptor(seqs_val);
-                       GDKdebug = dbg;
-
-                       if (o_id == NULL || o_val == NULL) {
-                               GDKerror("Logger_new: inconsistent database: 
cannot find seqs bats");
-                               logbat_destroy(o_id);
-                               logbat_destroy(o_val);
-                               goto error;
-                       }
-
-                       lg->seqs_id = COLcopy(o_id, TYPE_int, true, TRANSIENT);
-                       lg->seqs_val = COLcopy(o_val, TYPE_lng, true, 
TRANSIENT);
-                       BBPunfix(o_id->batCacheid);
-                       BBPunfix(o_val->batCacheid);
-                       BAThseqbase(lg->seqs_id, 0);
-                       BAThseqbase(lg->seqs_val, 0);
-               } else {
-                       lg->seqs_id = logbat_new(TYPE_int, 1, TRANSIENT);
-                       lg->seqs_val = logbat_new(TYPE_lng, 1, TRANSIENT);
-               }
-               lg->dseqs = logbat_new(TYPE_oid, 1, TRANSIENT);
-               if (lg->seqs_id == NULL ||
-                   lg->seqs_val == NULL ||
-                   lg->dseqs == NULL) {
-                       GDKerror("Logger_new: cannot create seqs bats");
-                       goto error;
-               }
 
                GDKdebug &= ~CHECKMASK;
                lg->snapshots_bid = BATdescriptor(snapshots_bid);
@@ -2046,13 +2010,47 @@ logger_load(int debug, const char *fn, c
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to