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
> [email protected]
> 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:[email protected]
url: http://www.cwi.nl/~niels e-mail: [email protected]
pgpq0yTGRWinV.pgp
Description: PGP signature
_______________________________________________ Checkin-list mailing list [email protected] http://mail.monetdb.org/mailman/listinfo/checkin-list
