Changeset: 3dcc8168dda2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3dcc8168dda2
Branch: unlock
Log Message:
merged
diffs (truncated from 2092 to 300 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1407,6 +1407,7 @@ gdk_export BBPrec *BBP[N_BBPINIT];
#define BBPRENAME_ALREADY (-1)
#define BBPRENAME_ILLEGAL (-2)
#define BBPRENAME_LONG (-3)
+#define BBPRENAME_MEMORY (-4)
gdk_export void BBPlock(void);
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -677,24 +677,29 @@ BBPreadEntries(FILE *fp, unsigned bbpver
if (buf[nread] == ' ')
options = buf + nread + 1;
+ if (snprintf(BBP_bak(bid), sizeof(BBP_bak(bid)), "tmp_%o",
(unsigned) bid) >= (int) sizeof(BBP_bak(bid))) {
+ BATdestroy(bn);
+ TRC_CRITICAL(GDK, "BBP logical filename directory is
too large, on line %d\n", lineno);
+ return GDK_FAIL;
+ }
if ((s = strchr(headname, '~')) != NULL && s == headname) {
- int len = snprintf(logical, sizeof(logical), "tmp_%o",
(unsigned) bid);
- if (len == -1 || len >= (int) sizeof(logical)) {
- BATdestroy(bn);
- TRC_CRITICAL(GDK, "BBP logical filename
directory is too large, on line %d\n", lineno);
- return GDK_FAIL;
- }
+ /* sizeof(logical) > sizeof(BBP_bak(bid)), so
+ * this fits */
+ strcpy(logical, BBP_bak(bid));
} else {
if (s)
*s = 0;
strcpy_len(logical, headname, sizeof(logical));
}
- s = logical;
- BBP_logical(bid) = GDKstrdup(s);
- if (BBP_logical(bid) == NULL) {
- BATdestroy(bn);
- TRC_CRITICAL(GDK, "GDKstrdup failed\n");
- return GDK_FAIL;
+ if (strcmp(logical, BBP_bak(bid)) == 0) {
+ BBP_logical(bid) = BBP_bak(bid);
+ } else {
+ BBP_logical(bid) = GDKstrdup(logical);
+ if (BBP_logical(bid) == NULL) {
+ BATdestroy(bn);
+ TRC_CRITICAL(GDK, "GDKstrdup failed\n");
+ return GDK_FAIL;
+ }
}
/* tailname is ignored */
strcpy_len(BBP_physical(bid), filename,
sizeof(BBP_physical(bid)));
@@ -1924,9 +1929,8 @@ BBPclear(bat i)
/*
* @- BBP rename
*
- * Each BAT has a logical name that is globally unique. Its reverse
- * view can also be assigned a name, that also has to be globally
- * unique. The batId is the same as the logical BAT name.
+ * Each BAT has a logical name that is globally unique.
+ * The batId is the same as the logical BAT name.
*
* The default logical name of a BAT is tmp_X, where X is the
* batCacheid. Apart from being globally unique, new logical bat
@@ -1954,6 +1958,16 @@ BBPrename(bat bid, const char *nme)
if (b == NULL)
return 0;
+ if (nme == NULL) {
+ if (BBP_bak(bid)[0] == 0 &&
+ snprintf(BBP_bak(bid), sizeof(BBP_bak(bid)), "tmp_%o",
(unsigned) bid) >= (int) sizeof(BBP_bak(bid))) {
+ /* cannot happen */
+ TRC_CRITICAL(GDK, "BBP default filename too long\n");
+ return BBPRENAME_LONG;
+ }
+ nme = BBP_bak(bid);
+ }
+
/* If name stays same, do nothing */
if (BBP_logical(bid) && strcmp(BBP_logical(bid), nme) == 0)
return 0;
@@ -1968,6 +1982,7 @@ BBPrename(bat bid, const char *nme)
GDKerror("illegal temporary name: '%s'\n", nme);
return BBPRENAME_LONG;
}
+
idx = threadmask(MT_getpid());
MT_lock_set(&GDKtrimLock(idx));
MT_lock_set(&GDKnameLock);
@@ -1979,13 +1994,25 @@ BBPrename(bat bid, const char *nme)
return BBPRENAME_ALREADY;
}
+ char *nnme;
+ if (nme == BBP_bak(bid) || strcmp(nme, BBP_bak(bid)) == 0) {
+ nnme = BBP_bak(bid);
+ } else {
+ nnme = GDKstrdup(nme);
+ if (nnme == NULL) {
+ MT_lock_unset(&GDKnameLock);
+ MT_lock_unset(&GDKtrimLock(idx));
+ return BBPRENAME_MEMORY;
+ }
+ }
+
/* carry through the name change */
if (BBP_logical(bid) && BBPtmpcheck(BBP_logical(bid)) == 0) {
BBP_delete(bid);
}
if (BBP_logical(bid) != BBP_bak(bid))
GDKfree(BBP_logical(bid));
- BBP_logical(bid) = GDKstrdup(nme);
+ BBP_logical(bid) = nnme;
if (tmpid == 0) {
BBP_insert(bid);
}
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -95,13 +95,13 @@ typedef enum {LOG_OK, LOG_EOF, LOG_ERR}
static gdk_return bm_commit(logger *lg);
static gdk_return tr_grow(trans *tr);
-static void
+static inline void
logger_lock(logger *lg)
{
MT_lock_set(&lg->lock);
}
-static void
+static inline void
logger_unlock(logger *lg)
{
MT_lock_unset(&lg->lock);
@@ -897,8 +897,7 @@ logger_create_types_file(logger *lg, con
static gdk_return
logger_open_output(logger *lg)
{
- int len;
- char id[BUFSIZ];
+ char id[32];
char *filename;
if (LOG_DISABLED(lg)) {
@@ -907,8 +906,7 @@ logger_open_output(logger *lg)
lg->id--;
return GDK_SUCCEED;
}
- len = snprintf(id, sizeof(id), LLFMT, lg->id);
- if (len == -1 || len >= BUFSIZ) {
+ if (snprintf(id, sizeof(id), LLFMT, lg->id) >= (int) sizeof(id)) {
TRC_CRITICAL(GDK, "filename is too large\n");
return GDK_FAIL;
}
@@ -1207,6 +1205,13 @@ check_version(logger *lg, FILE *fp, cons
}
if (version < 52300) { /* first CATALOG_VERSION for "new" log format */
fclose(fp);
+ lg->catalog_bid = logbat_new(TYPE_int, BATSIZE, PERSISTENT);
+ lg->catalog_id = logbat_new(TYPE_int, BATSIZE, PERSISTENT);
+ lg->dcatalog = logbat_new(TYPE_oid, BATSIZE, PERSISTENT);
+ if (lg->catalog_bid == NULL || lg->catalog_id == NULL ||
lg->dcatalog == NULL) {
+ GDKerror("cannot create catalog bats");
+ return GDK_FAIL;
+ }
if (old_logger_load(lg, fn, logdir) != GDK_SUCCEED) {
//loads drop no longer needed catalog, snapshots bats
//convert catalog_oid -> catalog_id (lng->int)
@@ -1216,6 +1221,18 @@ check_version(logger *lg, FILE *fp, cons
version < lg->version ? "Maybe you need to
upgrade to an intermediate release first.\n" : "");
return GDK_FAIL;
}
+ /* give the catalog bats names so we can find them
+ * next time */
+ char bak[IDLENGTH];
+ if (strconcat_len(bak, sizeof(bak), fn, "_catalog_bid", NULL)
>= sizeof(bak) ||
+ BBPrename(lg->catalog_bid->batCacheid, bak) < 0 ||
+ strconcat_len(bak, sizeof(bak), fn, "_catalog_id", NULL) >=
sizeof(bak) ||
+ BBPrename(lg->catalog_id->batCacheid, bak) < 0 ||
+ strconcat_len(bak, sizeof(bak), fn, "_dcatalog", NULL) >=
sizeof(bak) ||
+ BBPrename(lg->dcatalog->batCacheid, bak) < 0) {
+ return GDK_FAIL;
+ }
+
if (logger_create_types_file(lg, filename) != GDK_SUCCEED)
return GDK_FAIL;
return GDK_SUCCEED;
@@ -1258,23 +1275,18 @@ bm_tids(BAT *b, BAT *d)
static gdk_return
logger_switch_bat(BAT *old, BAT *new, const char *fn, const char *name)
{
- int len;
- char bak[BUFSIZ];
+ char bak[IDLENGTH];
if (BATmode(old, true) != GDK_SUCCEED) {
- GDKerror("Logger_new: cannot convert old %s to transient",
name);
+ GDKerror("cannot convert old %s to transient", name);
return GDK_FAIL;
}
- len = snprintf(bak, sizeof(bak), "tmp_%o", (unsigned) old->batCacheid);
- if (len == -1 || len >= BUFSIZ) {
- GDKerror("Logger_new: filename is too large");
+ if (strconcat_len(bak, sizeof(bak), fn, "_", name, NULL) >=
sizeof(bak)) {
+ GDKerror("name %s_%s too long\n", fn, name);
return GDK_FAIL;
}
- if (BBPrename(old->batCacheid, bak) != 0) {
- return GDK_FAIL;
- }
- strconcat_len(bak, sizeof(bak), fn, "_", name, NULL);
- if (BBPrename(new->batCacheid, bak) != 0) {
+ if (BBPrename(old->batCacheid, NULL) != 0 ||
+ BBPrename(new->batCacheid, bak) != 0) {
return GDK_FAIL;
}
return GDK_SUCCEED;
@@ -1721,7 +1733,9 @@ logger_load(int debug, const char *fn, c
* require a logical reference we also add a logical
* reference for the persistent bats */
BUN p, q;
- BAT *b = BATdescriptor(catalog_bid), *o, *d;
+ BAT *b, *o, *d;
+
+ assert(!lg->inmemory);
/* the catalog exists, and so should the log file */
if (fp == NULL && !LOG_DISABLED(lg)) {
@@ -1735,46 +1749,48 @@ logger_load(int debug, const char *fn, c
fn, fn, lg->dir);
goto error;
}
- if (check_version(lg, fp, fn, logdir, filename) != GDK_SUCCEED)
{ /* closes the file */
+ if (fp != NULL && check_version(lg, fp, fn, logdir, filename)
!= GDK_SUCCEED) { /* closes the file */
fp = NULL;
goto error;
}
readlogs = 1;
fp = NULL;
- assert(!lg->inmemory);
- if (b == NULL) {
- GDKerror("inconsistent database, catalog does not
exist");
- goto error;
- }
+ if (lg->catalog_bid == NULL && lg->catalog_id == NULL &&
lg->dcatalog == NULL) {
+ b = BATdescriptor(catalog_bid);
+ if (b == NULL) {
+ GDKerror("inconsistent database, catalog does
not exist");
+ goto error;
+ }
- strconcat_len(bak, sizeof(bak), fn, "_catalog_id", NULL);
- catalog_id = BBPindex(bak);
- o = BATdescriptor(catalog_id);
- if (o == NULL) {
- BBPunfix(b->batCacheid);
- GDKerror("inconsistent database, catalog_id does not
exist");
- goto error;
+ strconcat_len(bak, sizeof(bak), fn, "_catalog_id",
NULL);
+ catalog_id = BBPindex(bak);
+ o = BATdescriptor(catalog_id);
+ if (o == NULL) {
+ BBPunfix(b->batCacheid);
+ GDKerror("inconsistent database, catalog_id
does not exist");
+ goto error;
+ }
+
+ strconcat_len(bak, sizeof(bak), fn, "_dcatalog", NULL);
+ dcatalog = BBPindex(bak);
+ d = BATdescriptor(dcatalog);
+ if (d == NULL) {
+ GDKerror("cannot create dcatalog bat");
+ BBPunfix(b->batCacheid);
+ BBPunfix(o->batCacheid);
+ goto error;
+ }
+
+ lg->catalog_bid = b;
+ lg->catalog_id = o;
+ lg->dcatalog = d;
}
-
- strconcat_len(bak, sizeof(bak), fn, "_dcatalog", NULL);
- dcatalog = BBPindex(bak);
- d = BATdescriptor(dcatalog);
- if (d == NULL) {
- GDKerror("cannot create dcatalog bat");
- BBPunfix(b->batCacheid);
- BBPunfix(o->batCacheid);
- goto error;
- }
-
- lg->catalog_bid = b;
- lg->catalog_id = o;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list