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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list