Changeset: b746bce46c2a for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b746bce46c2a Modified Files: gdk/gdk_logger.c gdk/gdk_logger_old.c sql/storage/bat/bat_logger.c Branch: default Log Message:
Fix some reference counting in the upgrade. diffs (truncated from 518 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 @@ -1657,6 +1657,18 @@ logger_load(int debug, const char *fn, c GDKerror("cannot create type bats"); goto error; } + strconcat_len(bak, sizeof(bak), fn, "_type_id", NULL); + if (BBPrename(lg->type_id->batCacheid, bak) < 0) { + goto error; + } + strconcat_len(bak, sizeof(bak), fn, "_type_nme", NULL); + if (BBPrename(lg->type_nme->batCacheid, bak) < 0) { + goto error; + } + strconcat_len(bak, sizeof(bak), fn, "_type_nr", NULL); + if (BBPrename(lg->type_nr->batCacheid, bak) < 0) { + goto error; + } /* this is intentional - if catalog_bid is 0, force it to find * the persistent catalog */ @@ -1779,20 +1791,20 @@ logger_load(int debug, const char *fn, c lg->catalog_bid = b; lg->catalog_id = o; lg->dcatalog = d; + const log_bid *bids = (const log_bid *) Tloc(lg->catalog_bid, 0); + BATloop(lg->catalog_bid, p, q) { + bat bid = bids[p]; + oid pos = p; + + if (BBPretain(bid) == 0 && /* any bid in the catalog_bid, needs one logical ref */ + BUNfnd(lg->dcatalog, &pos) == BUN_NONE && + BUNappend(lg->dcatalog, &pos, false) != GDK_SUCCEED) + goto error; + } } BBPretain(lg->catalog_bid->batCacheid); BBPretain(lg->catalog_id->batCacheid); BBPretain(lg->dcatalog->batCacheid); - const log_bid *bids = (const log_bid *) Tloc(lg->catalog_bid, 0); - BATloop(lg->catalog_bid, p, q) { - bat bid = bids[p]; - oid pos = p; - - if (BBPretain(bid) == 0 && /* any bid in the catalog_bid, needs one logical ref */ - BUNfnd(lg->dcatalog, &pos) == BUN_NONE && - BUNappend(lg->dcatalog, &pos, false) != GDK_SUCCEED) - goto error; - } } lg->catalog_cnt = logbat_new(TYPE_lng, 1, TRANSIENT); if (lg->catalog_cnt == NULL) { diff --git a/gdk/gdk_logger_old.c b/gdk/gdk_logger_old.c --- a/gdk/gdk_logger_old.c +++ b/gdk/gdk_logger_old.c @@ -1660,8 +1660,11 @@ logger_load(const char *fn, char filenam goto error; } lg->with_ids = false; - } else if (BUNappend(lg->del, &t->batCacheid, false) != GDK_SUCCEED) - goto error; + } else { + if (BUNappend(lg->del, &t->batCacheid, false) != GDK_SUCCEED) + goto error; + BBPretain(t->batCacheid); + } strconcat_len(bak, sizeof(bak), fn, "_catalog_oid", NULL); catalog_oid = BBPindex(bak); @@ -1684,8 +1687,11 @@ logger_load(const char *fn, char filenam goto error; } lg->with_ids = false; - } else if (BUNappend(lg->del, &o->batCacheid, false) != GDK_SUCCEED) - goto error; + } else { + if (BUNappend(lg->del, &o->batCacheid, false) != GDK_SUCCEED) + goto error; + BBPretain(o->batCacheid); + } strconcat_len(bak, sizeof(bak), fn, "_dcatalog", NULL); dcatalog = BBPindex(bak); @@ -1710,17 +1716,23 @@ logger_load(const char *fn, char filenam BBPunfix(o->batCacheid); goto error; } - } else if (BUNappend(lg->del, &d->batCacheid, false) != GDK_SUCCEED) - goto error; + } else { + if (BUNappend(lg->del, &d->batCacheid, false) != GDK_SUCCEED) + goto error; + BBPretain(d->batCacheid); + } lg->catalog_bid = b; lg->catalog_nme = n; lg->catalog_tpe = t; lg->catalog_oid = o; lg->dcatalog = d; - if (BUNappend(lg->del, &b->batCacheid, false) != GDK_SUCCEED || - BUNappend(lg->del, &n->batCacheid, false) != GDK_SUCCEED) + if (BUNappend(lg->del, &b->batCacheid, false) != GDK_SUCCEED) goto error; + BBPretain(b->batCacheid); + if (BUNappend(lg->del, &n->batCacheid, false) != GDK_SUCCEED) + goto error; + BBPretain(n->batCacheid); const log_bid *bids; bids = (const log_bid *) Tloc(b, 0); @@ -1779,6 +1791,7 @@ logger_load(const char *fn, char filenam } if (BUNappend(lg->del, &dsnapshots, false) != GDK_SUCCEED) goto error; + BBPretain(dsnapshots); } else { lg->dsnapshots = logbat_new(TYPE_oid, 1, TRANSIENT); if (lg->dsnapshots == NULL) { @@ -1786,9 +1799,12 @@ logger_load(const char *fn, char filenam goto error; } } - if (BUNappend(lg->del, &snapshots_bid, false) != GDK_SUCCEED || - BUNappend(lg->del, &snapshots_tid, false) != GDK_SUCCEED) + if (BUNappend(lg->del, &snapshots_bid, false) != GDK_SUCCEED) goto error; + BBPretain(snapshots_bid); + if (BUNappend(lg->del, &snapshots_tid, false) != GDK_SUCCEED) + goto error; + BBPretain(snapshots_tid); } strconcat_len(bak, sizeof(bak), fn, "_seqs_id", NULL); if (BBPindex(bak)) { @@ -1822,10 +1838,15 @@ logger_load(const char *fn, char filenam if (BBPrename(lg->dseqs->batCacheid, bak) < 0) { goto error; } - if (BUNappend(lg->add, &lg->seqs_id->batCacheid, false) != GDK_SUCCEED || - BUNappend(lg->add, &lg->seqs_val->batCacheid, false) != GDK_SUCCEED || - BUNappend(lg->add, &lg->dseqs->batCacheid, false) != GDK_SUCCEED) + if (BUNappend(lg->add, &lg->seqs_id->batCacheid, false) != GDK_SUCCEED) + goto error; + BBPretain(lg->seqs_id->batCacheid); + if (BUNappend(lg->add, &lg->seqs_val->batCacheid, false) != GDK_SUCCEED) goto error; + BBPretain(lg->seqs_val->batCacheid); + if (BUNappend(lg->add, &lg->dseqs->batCacheid, false) != GDK_SUCCEED) + goto error; + BBPretain(lg->dseqs->batCacheid); } if (check_version(lg, fp, version) != GDK_SUCCEED) { @@ -1843,10 +1864,15 @@ logger_load(const char *fn, char filenam goto error; lg->lg->postfuncp = NULL; /* not again */ - if (BUNappend(lg->add, &lg->lg->catalog_bid->batCacheid, false) != GDK_SUCCEED || - BUNappend(lg->add, &lg->lg->catalog_id->batCacheid, false) != GDK_SUCCEED || - BUNappend(lg->add, &lg->lg->dcatalog->batCacheid, false) != GDK_SUCCEED) + if (BUNappend(lg->add, &lg->lg->catalog_bid->batCacheid, false) != GDK_SUCCEED) + goto error; + BBPretain(lg->lg->catalog_bid->batCacheid); + if (BUNappend(lg->add, &lg->lg->catalog_id->batCacheid, false) != GDK_SUCCEED) goto error; + BBPretain(lg->lg->catalog_id->batCacheid); + if (BUNappend(lg->add, &lg->lg->dcatalog->batCacheid, false) != GDK_SUCCEED) + goto error; + BBPretain(lg->lg->dcatalog->batCacheid); /* done reading the log, revert to "normal" behavior */ geomisoldversion = false; @@ -1867,7 +1893,15 @@ logger_load(const char *fn, char filenam logbat_destroy(lg->seqs_id); logbat_destroy(lg->seqs_val); logbat_destroy(lg->dseqs); + bids = (const log_bid *) Tloc(lg->add, 0); + BATloop(lg->add, p, q) { + BBPrelease(bids[p]); + } logbat_destroy(lg->add); + bids = (const log_bid *) Tloc(lg->del, 0); + BATloop(lg->del, p, q) { + BBPrelease(bids[p]); + } logbat_destroy(lg->del); GDKfree(lg->local_dir); GDKfree(lg); @@ -1940,7 +1974,7 @@ old_logger_destroy(old_logger *lg) BAT *b = NULL; const log_bid *bids; - bat *subcommit = GDKmalloc(sizeof(log_bid) * (BATcount(lg->add) + BATcount(lg->del) + BATcount(lg->lg->catalog_bid) + 1)); + bat *subcommit = GDKmalloc(sizeof(log_bid) * (BATcount(lg->add) + BATcount(lg->del) + 1)); if (subcommit == NULL) { TRC_CRITICAL(GDK, "logger_destroy failed\n"); return GDK_FAIL; @@ -1966,12 +2000,6 @@ old_logger_destroy(old_logger *lg) } subcommit[i++] = bids[p]; } - bids = (const log_bid *) Tloc(lg->lg->catalog_bid, 0); - BATloop(lg->lg->catalog_bid, p, q) { - b = BBPquickdesc(bids[p], false); - if (BATdirty(b)) - subcommit[i++] = bids[p]; - } /* give the catalog bats names so we can find them * next time */ char bak[IDLENGTH]; @@ -2008,24 +2036,29 @@ old_logger_destroy(old_logger *lg) TRC_CRITICAL(GDK, "logger_destroy failed\n"); return GDK_FAIL; } - bids = (const log_bid *) Tloc(lg->lg->catalog_bid, 0); - BATloop(lg->lg->catalog_bid, p, q) { - if (BBP_lrefs(bids[p]) > 1) - BBPrelease(bids[p]); - } if (logger_cleanup(lg) != GDK_SUCCEED) TRC_CRITICAL(GDK, "logger_cleanup failed\n"); /* free resources */ - bids = (const log_bid *) Tloc(b, 0); - BATloop(b, p, q) { + bids = (const log_bid *) Tloc(lg->catalog_bid, 0); + BATloop(lg->catalog_bid, p, q) { bat bid = bids[p]; oid pos = p; if (BUNfnd(lg->dcatalog, &pos) == BUN_NONE) BBPrelease(bid); } + bids = (const log_bid *) Tloc(lg->add, 0); + BATloop(lg->add, p, q) { + BBPrelease(bids[p]); + } + logbat_destroy(lg->add); + bids = (const log_bid *) Tloc(lg->del, 0); + BATloop(lg->del, p, q) { + BBPrelease(bids[p]); + } + logbat_destroy(lg->del); logbat_destroy(lg->catalog_bid); logbat_destroy(lg->catalog_nme); @@ -2033,7 +2066,12 @@ old_logger_destroy(old_logger *lg) logbat_destroy(lg->catalog_oid); logbat_destroy(lg->dcatalog); logbat_destroy(lg->freed); - + logbat_destroy(lg->seqs_id); + logbat_destroy(lg->seqs_val); + logbat_destroy(lg->dseqs); + logbat_destroy(lg->snapshots_bid); + logbat_destroy(lg->snapshots_tid); + logbat_destroy(lg->dsnapshots); lg->lg->id = (ulng) lg->id; GDKfree(lg); diff --git a/sql/storage/bat/bat_logger.c b/sql/storage/bat/bat_logger.c --- a/sql/storage/bat/bat_logger.c +++ b/sql/storage/bat/bat_logger.c @@ -57,7 +57,7 @@ bl_preversion(sqlstore *store, int oldve #if defined CATALOG_JUN2020 || defined CATALOG_OCT2020 static gdk_return -tabins(logger *lg, int tt, int nid, ...) +tabins(logger *lg, old_logger *old_lg, bool first, int tt, int nid, ...) { va_list va; int cid; @@ -72,6 +72,29 @@ tabins(logger *lg, int tt, int nid, ...) va_end(va); return GDK_FAIL; } + if (first && BUNfnd(old_lg->add, &b->batCacheid) == BUN_NONE) { + BAT *bn = COLcopy(b, b->ttype, true, PERSISTENT); + if (bn == NULL || + BUNappend(old_lg->add, &bn->batCacheid, false) != GDK_SUCCEED || + BUNappend(old_lg->del, &b->batCacheid, false) != GDK_SUCCEED) { + va_end(va); + bat_destroy(b); + bat_destroy(bn); + return GDK_FAIL; + } + BBPretain(bn->batCacheid); + /* logical refs of b stay the same: it is moved from catalog_bid to del */ + bat_destroy(b); + BUN p = BUNfnd(lg->catalog_id, &cid); + assert(p != BUN_NONE); + if (BUNreplace(lg->catalog_bid, p, &bn->batCacheid, false) != GDK_SUCCEED) { + va_end(va); + bat_destroy(bn); + return GDK_FAIL; + } + BBPretain(bn->batCacheid); + b = bn; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list