On Wed, Jul 18, 2012 at 12:55:31PM +0200, Niels Nes wrote: > Changeset: 982fdf69e13b for MonetDB > URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=982fdf69e13b > Modified Files: > gdk/gdk_logger.c > gdk/gdk_logger.h > sql/server/rel_optimizer.c > sql/storage/bat/bat_logger.c > sql/storage/restrict/restrict_logger.c > Branch: default > Log Message: > > Cleanup of logger code to split head and tail bat into 2 void headed bats
This checkin breaks the current on disk format, ie if your using the defaul branch a reload is needed. Before the (september) release we need to add updating functions for atleast SQL. Niels > > > diffs (truncated from 723 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 > @@ -73,7 +73,10 @@ > #include "gdk_logger.h" > #include <string.h> > > - > +static BUN BUNfndT( BAT *b, ptr v) > +{ > + return BUNfnd(BATmirror(b), v); > +} > /* > * @- > * The log record encoding is geared at reduced storage space, but > @@ -218,12 +221,11 @@ la_bat_clear(logger *lg, logaction *la) > BAT *b; > > /* do we need to skip these old updates */ > - if (BATcount(lg->snapshots)) { > - BUN p = BUNfnd(lg->snapshots, &bid); > + if (BATcount(lg->snapshots_bid)) { > + BUN p = BUNfndT(lg->snapshots_bid, &bid); > > if (p != BUN_NONE) { > - BATiter i = bat_iterator(lg->snapshots); > - int tid = *(int *) BUNtloc(i, p); > + int tid = *(int *) Tloc(lg->snapshots_tid, p); > > if (lg->tid <= tid) > return; > @@ -244,16 +246,18 @@ static int > log_read_seq(logger *lg, logformat *l) > { > int seq = l->nr; > - lng id; > + lng val; > + BUN p; > > - if (!mnstr_readLng(lg->log, &id)) > + if (!mnstr_readLng(lg->log, &val)) > return LOG_ERR; > > - if (BUNfnd(lg->seqs, &seq) != BUN_NONE) { > - BUNdelHead(lg->seqs, &seq, FALSE); > + if ((p = BUNfndT(lg->seqs_id, &seq)) != BUN_NONE) { > + BUNdelete(lg->seqs_id, p, FALSE); > + BUNdelete(lg->seqs_val, p, FALSE); > } > - BUNins(lg->seqs, &seq, &id, FALSE); > - > + BUNappend(lg->seqs_id, &seq, FALSE); > + BUNappend(lg->seqs_val, &val, FALSE); > return LOG_OK; > } > > @@ -404,12 +408,11 @@ la_bat_updates(logger *lg, logaction *la > return; /* ignore bats no longer in the catalog */ > > /* do we need to skip these old updates */ > - if (BATcount(lg->snapshots)) { > - BUN p = BUNfnd(lg->snapshots, &bid); > + if (BATcount(lg->snapshots_bid)) { > + BUN p = BUNfndT(lg->snapshots_bid, &bid); > > if (p != BUN_NONE) { > - BATiter i = bat_iterator(lg->snapshots); > - int tid = *(int *) BUNtloc(i, p); > + int tid = *(int *) Tloc(lg->snapshots_tid, p); > > if (lg->tid <= tid) > return; > @@ -477,10 +480,14 @@ la_bat_destroy(logger *lg, logaction *la > log_bid bid = logger_find_bat(lg, la->name); > > if (bid) { > + BUN p; > + > logger_del_bat(lg, bid); > - if (BUNfnd(lg->snapshots, &bid) != BUN_NONE) { > - BUNdelHead(lg->snapshots, &bid, FALSE); > - BUNins(lg->snapshots, &bid, &lg->tid, FALSE); > + if ((p = BUNfndT(lg->snapshots_bid, &bid)) != BUN_NONE) { > + BUNdelete(lg->snapshots_bid, p, FALSE); > + BUNdelete(lg->snapshots_tid, p, FALSE); > + BUNappend(lg->snapshots_bid, &bid, FALSE); > + BUNappend(lg->snapshots_tid, &lg->tid, FALSE); > } > } > } > @@ -564,15 +571,19 @@ la_bat_use(logger *lg, logaction *la) > { > log_bid bid = la->nr; > BAT *b = BATdescriptor(bid); > + BUN p; > > if (!b) { > GDKerror("logger: could not use bat (%d) for %s\n", (int) bid, > la->name); > return; > } > logger_add_bat(lg, b, la->name); > - if (BUNfnd(lg->snapshots, &b->batCacheid) != BUN_NONE) > - BUNdelHead(lg->snapshots, &b->batCacheid, FALSE); > - BUNins(lg->snapshots, &b->batCacheid, &lg->tid, FALSE); > + if ((p = BUNfndT(lg->snapshots_bid, &b->batCacheid)) != BUN_NONE) { > + BUNdelete(lg->snapshots_bid, p, FALSE); > + BUNdelete(lg->snapshots_tid, p, FALSE); > + } > + BUNappend(lg->snapshots_bid, &b->batCacheid, FALSE); > + BUNappend(lg->snapshots_tid, &lg->tid, FALSE); > logbat_destroy(b); > } > > @@ -875,17 +886,23 @@ static int > logger_commit(logger *lg) > { > int id = LOG_SID; > + BUN p; > > if (lg->debug & 1) > fprintf(stderr, "logger_commit\n"); > > - BUNdelHead(lg->seqs, &id, FALSE); > - BUNins(lg->seqs, &id, &lg->id, FALSE); > + p = BUNfndT(lg->seqs_id, &id); > + BUNdelete(lg->seqs_id, p, FALSE); > + BUNdelete(lg->seqs_val, p, FALSE); > + BUNappend(lg->seqs_id, &id, FALSE); > + BUNappend(lg->seqs_val, &lg->id, FALSE); > > /* cleanup old snapshots */ > - if (BATcount(lg->snapshots)) { > - BATclear(lg->snapshots, FALSE); > - BATcommit(lg->snapshots); > + if (BATcount(lg->snapshots_bid)) { > + BATclear(lg->snapshots_bid, FALSE); > + BATclear(lg->snapshots_tid, FALSE); > + BATcommit(lg->snapshots_bid); > + BATcommit(lg->snapshots_tid); > } > return bm_commit(lg); > } > @@ -919,34 +936,34 @@ check_version(logger *lg, FILE *fp) > } > > static int > -bm_subcommit(BAT *list, BAT *catalog, BAT *extra, int debug) > +bm_subcommit(BAT *list_bid, BAT *list_nme, BAT *catalog_bid, BAT > *catalog_nme, BAT *extra, int debug) > { > BUN p, q; > - BUN nn = 2 + (list->batFirst > list->batDeleted ? list->batFirst - > list->batDeleted : 0) + BATcount(list) + (extra ? BATcount(extra) : 0); > + BUN nn = 3 + (list_bid->batFirst > list_bid->batDeleted ? > list_bid->batFirst - list_bid->batDeleted : 0) + BATcount(list_bid) + (extra > ? BATcount(extra) : 0); > bat *n = (bat*)GDKmalloc(sizeof(bat) * nn); > int i = 0; > - BATiter iter = bat_iterator(list); > + BATiter iter = (list_nme)?bat_iterator(list_nme):bat_iterator(list_bid); > int res; > > n[i++] = 0; /* n[0] is not used */ > > /* first loop over deleted then over current and new */ > - for (p = list->batDeleted; p < list->batFirst; p++) { > - bat col = *(log_bid *) BUNhead(iter, p); > + for (p = list_bid->batDeleted; p < list_bid->batFirst; p++) { > + bat col = *(log_bid *) Tloc(list_bid, p); > > if (debug & 1) > fprintf(stderr, "commit deleted %s (%d) %s\n", > BBPname(col), col, > - (list == catalog) ? BUNtail(iter, p) : > "snapshot"); > + (list_bid == catalog_bid) ? BUNtail(iter, p) : > "snapshot"); > n[i++] = ABS(col); > } > - BATloop(list, p, q) { > - bat col = *(log_bid *) BUNhead(iter, p); > + BATloop(list_bid, p, q) { > + bat col = *(log_bid *) Tloc(list_bid, p); > > if (debug & 1) > fprintf(stderr, "commit new %s (%d) %s\n", > BBPname(col), col, > - (list == catalog) ? BUNtail(iter, p) : > "snapshot"); > + (list_bid == catalog_bid) ? BUNtail(iter, p) : > "snapshot"); > n[i++] = ABS(col); > } > if (extra) { > @@ -957,14 +974,16 @@ bm_subcommit(BAT *list, BAT *catalog, BA > if (debug & 1) > fprintf(stderr, "commit extra %s %s\n", > name, > - (list == catalog) ? BUNtail(iter, p) : > "snapshot"); > + (list_bid == catalog_bid) ? > BUNtail(iter, p) : "snapshot"); > n[i++] = ABS(BBPindex(name)); > } > } > /* now commit catalog, so it's also up to date on disk */ > - n[i++] = ABS(catalog->batCacheid); > + n[i++] = ABS(catalog_bid->batCacheid); > + n[i++] = ABS(catalog_nme->batCacheid); > assert((BUN) i <= nn); > - BATcommit(catalog); > + BATcommit(catalog_bid); > + BATcommit(catalog_nme); > res = TMsubcommit_list(n, i); > GDKfree(n); > return res; > @@ -992,8 +1011,8 @@ logger_new(int debug, char *fn, char *lo > FILE *fp; > char filename[BUFSIZ]; > char bak[BUFSIZ]; > - log_bid seqs = 0; > - bat catalog; > + log_bid seqs_id = 0; > + bat catalog_bid, catalog_nme; > > if (lg == NULL) > return NULL; > @@ -1022,9 +1041,12 @@ logger_new(int debug, char *fn, char *lo > lg->postfuncp = postfuncp; > lg->log = NULL; > lg->end = 0; > - lg->catalog = NULL; > - lg->snapshots = NULL; > - lg->seqs = NULL; > + lg->catalog_bid = NULL; > + lg->catalog_nme = NULL; > + lg->snapshots_bid = NULL; > + lg->snapshots_tid = NULL; > + lg->seqs_id = NULL; > + lg->seqs_val = NULL; > > snprintf(filename, BUFSIZ, "%s%s", lg->dir, LOGFILE); > snprintf(bak, BUFSIZ, "%s.bak", filename); > @@ -1040,10 +1062,10 @@ logger_new(int debug, char *fn, char *lo > } > fp = fopen(filename, "r"); > > - snprintf(bak, BUFSIZ, "%s_catalog", fn); > - catalog = BBPindex(bak); > + snprintf(bak, BUFSIZ, "%s_catalog_bid", fn); > + catalog_bid = BBPindex(bak); > > - if (catalog == 0) { > + if (catalog_bid == 0) { > log_bid bid = 0; > > /* catalog does not exist, so the log file also shouldn't exist > */ > @@ -1055,16 +1077,24 @@ logger_new(int debug, char *fn, char *lo > goto error; > } > > - lg->catalog = logbat_new(TYPE_int, TYPE_str, BATSIZE); > + lg->catalog_bid = logbat_new(TYPE_void, TYPE_int, BATSIZE); > + lg->catalog_nme = logbat_new(TYPE_void, TYPE_str, BATSIZE); > if (debug) > fprintf(stderr, "create %s catalog\n", fn); > > - bid = lg->catalog->batCacheid; > + /* Make persistent */ > + bid = lg->catalog_bid->batCacheid; > + BBPincref(bid, TRUE); > + BATmode(lg->catalog_bid, PERSISTENT); > + snprintf(bak, BUFSIZ, "%s_catalog_bid", fn); > + BBPrename(lg->catalog_bid->batCacheid, bak); > > /* Make persistent */ > + bid = lg->catalog_nme->batCacheid; > BBPincref(bid, TRUE); > - BATmode(lg->catalog, PERSISTENT); > - BBPrename(lg->catalog->batCacheid, bak); > + BATmode(lg->catalog_nme, PERSISTENT); > + snprintf(bak, BUFSIZ, "%s_catalog_nme", fn); > + BBPrename(lg->catalog_nme->batCacheid, bak); > > if (!GDKcreatedir(filename)) { > logger_fatal("logger_new: cannot create directory for > log file %s\n", > @@ -1082,7 +1112,7 @@ logger_new(int debug, char *fn, char *lo > fclose(fp); > fp = NULL; > > - if (bm_subcommit(lg->catalog, lg->catalog, NULL, lg->debug) != > 0) { > + if (bm_subcommit(lg->catalog_bid, lg->catalog_nme, > lg->catalog_bid, lg->catalog_nme, NULL, lg->debug) != 0) { > /* cannot commit catalog, so remove log */ > unlink(filename); > goto error; > @@ -1092,8 +1122,11 @@ logger_new(int debug, char *fn, char *lo > require a logical reference we also add a logical > reference for the persistent bats */ > BUN p, q; > - BAT *b = BATdescriptor(catalog); > - BATiter bi = bat_iterator(b); > + BAT *b = BATdescriptor(catalog_bid), *n; > + > + snprintf(bak, BUFSIZ, "%s_catalog_nme", fn); > + catalog_nme = BBPindex(bak); > + n = BATdescriptor(catalog_nme); > > /* the catalog exists, and so should the log file */ > if (fp == NULL) { > @@ -1107,42 +1140,63 @@ logger_new(int debug, char *fn, char *lo > _______________________________________________ > Checkin-list mailing list > Checkin-list@monetdb.org > http://mail.monetdb.org/mailman/listinfo/checkin-list -- Niels Nes, Centrum Wiskunde & Informatica (CWI) Science Park 123, 1098 XG Amsterdam, The Netherlands room L3.14, phone ++31 20 592-4098 sip:4...@sip.cwi.nl url: http://www.cwi.nl/~niels e-mail: niels....@cwi.nl
pgpq0yTGRWinV.pgp
Description: PGP signature
_______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list