Changeset: 362d90a8d17c for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=362d90a8d17c Modified Files: gdk/gdk_batop.c gdk/gdk_bbp.c gdk/gdk_logger.c gdk/gdk_storage.c monetdb5/mal/mal_authorize.c monetdb5/modules/mal/tablet.c sql/test/SQLite_regress/sqllogictest/Tests/select3.test.timeout sql/test/SQLite_regress/sqllogictest/Tests/select4.test.timeout sql/test/SQLite_regress/sqllogictest/Tests/select5.test.timeout testing/Mtest.py.in Branch: Jul2015 Log Message:
merged changes diffs (truncated from 474 to 300 lines): diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -777,8 +777,6 @@ BATappend(BAT *b, BAT *n, bit force) r++; } } - if (b->hseqbase != oid_nil) - b->hrevsorted = 0; } else { oid o = MAXoid(b); BATiter ni = bat_iterator(n); @@ -789,7 +787,6 @@ BATappend(BAT *b, BAT *n, bit force) o++; r++; } - b->hrevsorted = 0; } } else { BUN p, q; @@ -813,7 +810,6 @@ BATappend(BAT *b, BAT *n, bit force) i++; } } - b->hrevsorted = 0; } else { oid on = oid_nil; @@ -871,6 +867,8 @@ BATappend(BAT *b, BAT *n, bit force) b->tdense = b->tsorted = b->trevsorted = 0; } } + if (b->hseqbase != oid_nil) + b->hrevsorted = BATcount(b) <= 1; b->H->nonil &= n->H->nonil; b->T->nonil &= n->T->nonil; return GDK_SUCCEED; diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -808,12 +808,13 @@ vheapinit(COLrec *col, const char *buf, return n; } -static void +static int BBPreadEntries(FILE *fp, int *min_stamp, int *max_stamp, int oidsize, int bbpversion) { bat bid = 0; char buf[4096]; BATstore *bs; + int needcommit = 0; /* read the BBP.dir and insert the BATs into the BBP */ while (fgets(buf, sizeof(buf), fp) != NULL) { @@ -899,6 +900,21 @@ BBPreadEntries(FILE *fp, int *min_stamp, nread += vheapinit(&bs->H, buf + nread, Hhashash, bid); nread += vheapinit(&bs->T, buf + nread, Thashash, bid); + if (bs->S.count > 1) { + /* fix result of bug in BATappend not clearing + * revsorted property */ + if (bs->H.type == TYPE_void && bs->H.seq != oid_nil && bs->H.revsorted) { + bs->H.revsorted = 0; + bs->S.descdirty = 1; + needcommit = 1; + } + if (bs->T.type == TYPE_void && bs->T.seq != oid_nil && bs->T.revsorted) { + bs->T.revsorted = 0; + bs->S.descdirty = 1; + needcommit = 1; + } + } + if (buf[nread] != '\n' && buf[nread] != ' ') GDKfatal("BBPinit: invalid format for BBP.dir\n%s", buf); if (buf[nread] == ' ') @@ -931,6 +947,7 @@ BBPreadEntries(FILE *fp, int *min_stamp, BBP_refs(bid) = 0; BBP_lrefs(bid) = 1; /* any BAT we encounter here is persistent, so has a logical reference */ } + return needcommit; } #ifdef HAVE_HGE @@ -1042,6 +1059,7 @@ BBPinit(void) int bbpversion; int oidsize; oid BBPoid; + int needcommit; #ifdef NEED_MT_LOCK_INIT MT_lock_init(&GDKunloadLock, "GDKunloadLock"); @@ -1093,7 +1111,7 @@ BBPinit(void) BBPextend(0, FALSE); /* allocate BBP records */ ATOMIC_SET(BBPsize, 1, BBPsizeLock, "BBPinit"); - BBPreadEntries(fp, &min_stamp, &max_stamp, oidsize, bbpversion); + needcommit = BBPreadEntries(fp, &min_stamp, &max_stamp, oidsize, bbpversion); fclose(fp); /* normalize saved LRU stamps */ @@ -1122,7 +1140,7 @@ BBPinit(void) #else (void) oidsize; #endif - if (bbpversion < GDKLIBRARY) + if (bbpversion < GDKLIBRARY || needcommit) TMcommit(); return; @@ -2489,6 +2507,7 @@ getBBPdescriptor(bat i, int lock) /* clearing bits can be done without the lock */ BBP_status_off(j, BBPLOADING, "BBPdescriptor"); + CHECKDEBUG BATassertProps(b); } return b; } diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -823,6 +823,7 @@ static int logger_open(logger *lg) { char filename[BUFSIZ]; + bat bid; snprintf(filename, sizeof(filename), "%s%s." LLFMT, lg->dir, LOGFILE, lg->id); @@ -833,6 +834,19 @@ logger_open(logger *lg) fprintf(stderr, "!ERROR: logger_open: creating %s failed\n", filename); return LOG_ERR; } + if ((bid = logger_find_bat(lg, "seqs_id")) != 0) { + BAT *b = BATdescriptor(bid); + BATmode(b, TRANSIENT); + logger_del_bat(lg, bid); + logbat_destroy(b); + bid = logger_find_bat(lg, "seqs_val"); + b = BATdescriptor(bid); + BATmode(b, TRANSIENT); + logger_del_bat(lg, bid); + logbat_destroy(b); + if (bm_commit(lg) != LOG_OK) + return LOG_ERR; + } return LOG_OK; } @@ -1452,6 +1466,13 @@ logger_new(int debug, const char *fn, co BBPincref(bid, TRUE); } } + lg->freed = logbat_new(TYPE_int, 1, TRANSIENT); + if (lg->freed == NULL) + logger_fatal("Logger_new: failed to create freed bat", 0, 0, 0); + snprintf(bak, sizeof(bak), "%s_freed", fn); + if (BBPrename(lg->freed->batCacheid, bak) < 0) + logger_fatal("Logger_new: BBPrename to %s failed", + bak, 0, 0); snapshots_bid = logger_find_bat(lg, "snapshots_bid"); if (snapshots_bid == 0) { lg->seqs_id = logbat_new(TYPE_int, 1, TRANSIENT); @@ -1503,20 +1524,28 @@ logger_new(int debug, const char *fn, co bat seqs_val = logger_find_bat(lg, "seqs_val"); bat snapshots_tid = logger_find_bat(lg, "snapshots_tid"); bat dsnapshots = logger_find_bat(lg, "dsnapshots"); + int needcommit = 0; + int dbg = GDKdebug; if (seqs_id) { - BAT *o_id = BATdescriptor(seqs_id); - BAT *o_val = BATdescriptor(seqs_val); + 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) logger_fatal("Logger_new: inconsistent database: cannot find seqs bats", 0, 0, 0); - BATseqbase(o_id, 0); - BATseqbase(o_val, 0); lg->seqs_id = BATcopy(o_id, TYPE_void, TYPE_int, 1, TRANSIENT); lg->seqs_val = BATcopy(o_val, TYPE_void, TYPE_lng, 1, TRANSIENT); BBPunfix(o_id->batCacheid); BBPunfix(o_val->batCacheid); + BATseqbase(lg->seqs_id, 0); + BATseqbase(lg->seqs_val, 0); } else { lg->seqs_id = logbat_new(TYPE_int, 1, TRANSIENT); lg->seqs_val = logbat_new(TYPE_lng, 1, TRANSIENT); @@ -1528,12 +1557,41 @@ logger_new(int debug, const char *fn, co logger_fatal("Logger_new: cannot create seqs bats", 0, 0, 0); + GDKdebug &= ~CHECKMASK; lg->snapshots_bid = BATdescriptor(snapshots_bid); if (lg->snapshots_bid == 0) logger_fatal("Logger_new: inconsistent database, snapshots_bid does not exist", 0, 0, 0); lg->snapshots_tid = BATdescriptor(snapshots_tid); if (lg->snapshots_tid == 0) logger_fatal("Logger_new: inconsistent database, snapshots_tid does not exist", 0, 0, 0); + GDKdebug = dbg; + if (lg->snapshots_bid->htype == TYPE_oid) { + BAT *b; + assert(lg->snapshots_tid->htype == TYPE_oid); + b = BATcopy(lg->snapshots_bid, TYPE_void, lg->snapshots_bid->ttype, 1, PERSISTENT); + BATseqbase(b, 0); + BATsetaccess(b, BAT_READ); + snprintf(bak, sizeof(bak), "tmp_%o", lg->snapshots_bid->batCacheid); + BBPrename(lg->snapshots_bid->batCacheid, bak); + BATmode(lg->snapshots_bid, TRANSIENT); + snprintf(bak, sizeof(bak), "%s_snapshots_bid", fn); + BBPrename(b->batCacheid, bak); + logbat_destroy(lg->snapshots_bid); + lg->snapshots_bid = b; + logger_add_bat(lg, b, "snapshots_bid"); + b = BATcopy(lg->snapshots_tid, TYPE_void, lg->snapshots_tid->ttype, 1, PERSISTENT); + BATseqbase(b, 0); + BATsetaccess(b, BAT_READ); + snprintf(bak, sizeof(bak), "tmp_%o", lg->snapshots_tid->batCacheid); + BBPrename(lg->snapshots_tid->batCacheid, bak); + BATmode(lg->snapshots_tid, TRANSIENT); + snprintf(bak, sizeof(bak), "%s_snapshots_tid", fn); + BBPrename(b->batCacheid, bak); + logbat_destroy(lg->snapshots_tid); + lg->snapshots_tid = b; + logger_add_bat(lg, b, "snapshots_tid"); + needcommit = 1; + } if (dsnapshots) { lg->dsnapshots = BATdescriptor(dsnapshots); @@ -1545,18 +1603,13 @@ logger_new(int debug, const char *fn, co if (BBPrename(lg->dsnapshots->batCacheid, bak) < 0) logger_fatal("Logger_new: BBPrename to %s failed", bak, 0, 0); logger_add_bat(lg, lg->dsnapshots, "dsnapshots"); - - if (bm_subcommit(lg->catalog_bid, lg->catalog_nme, lg->catalog_bid, lg->catalog_nme, lg->dcatalog, NULL, lg->debug) != GDK_SUCCEED) - logger_fatal("Logger_new: commit failed", 0, 0, 0); + needcommit = 1; } + GDKdebug &= ~CHECKMASK; + if (needcommit && bm_commit(lg) != LOG_OK) + logger_fatal("Logger_new: commit failed", 0, 0, 0); + GDKdebug = dbg; } - lg->freed = logbat_new(TYPE_int, 1, TRANSIENT); - if (lg->freed == NULL) - logger_fatal("Logger_new: failed to create freed bat", 0, 0, 0); - snprintf(bak, sizeof(bak), "%s_freed", fn); - if (BBPrename(lg->freed->batCacheid, bak) < 0) - logger_fatal("Logger_new: BBPrename to %s failed", - bak, 0, 0); if (fp != NULL) { #if SIZEOF_OID == 8 @@ -2280,7 +2333,7 @@ log_abort(logger *lg) } static int -log_sequence_(logger *lg, int seq, lng val) +log_sequence_(logger *lg, int seq, lng val, int flush) { logformat l; @@ -2293,8 +2346,8 @@ log_sequence_(logger *lg, int seq, lng v if (log_write_format(lg, &l) == LOG_ERR || !mnstr_writeLng(lg->log, val) || - mnstr_flush(lg->log) || - mnstr_fsync(lg->log) || + (flush && mnstr_flush(lg->log)) || + (flush && mnstr_fsync(lg->log)) || pre_allocate(lg) != GDK_SUCCEED) { fprintf(stderr, "!ERROR: log_sequence_: write failed\n"); return LOG_ERR; @@ -2316,7 +2369,13 @@ log_sequence_nrs(logger *lg) oid pos = p; if (BUNfnd(lg->dseqs, &pos) == BUN_NONE) - ok &= log_sequence_(lg, *id, *val); + ok |= log_sequence_(lg, *id, *val, 0); + } + if (ok != LOG_OK || + mnstr_flush(lg->log) || + mnstr_fsync(lg->log)) { + fprintf(stderr, "!ERROR: log_sequence_nrs: write failed\n"); + return LOG_ERR; } return ok; } @@ -2341,7 +2400,7 @@ log_sequence(logger *lg, int seq, lng va BUNappend(lg->seqs_id, &seq, FALSE); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list