Changeset: 849eaf61ce90 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/849eaf61ce90
Branch: iso
Log Message:
Merged with Jul2021
diffs (truncated from 2965 to 300 lines):
diff --git a/gdk/gdk_analytic_func.c b/gdk/gdk_analytic_func.c
--- a/gdk/gdk_analytic_func.c
+++ b/gdk/gdk_analytic_func.c
@@ -89,14 +89,14 @@ ntile##IMP##TPE: \
#define ANALYTICAL_NTILE_SINGLE_IMP(TPE, LNG_HGE, UPCAST) \
do { \
TPE ntl = *(TPE*) ntile; \
- if (!is_##TPE##_nil(ntl) && ntl < 0) goto invalidntile; \
+ if (!is_##TPE##_nil(ntl) && ntl <= 0) goto invalidntile; \
ANALYTICAL_NTILE(SINGLE, TPE, ntl, LNG_HGE, UPCAST, ;); \
} while (0)
#define ANALYTICAL_NTILE_MULTI_IMP(TPE, LNG_HGE, UPCAST) \
do { \
TPE *restrict nn = (TPE*)Tloc(n, 0); \
- ANALYTICAL_NTILE(MULTI, TPE, nn[k], LNG_HGE, UPCAST, if (val <
0) goto invalidntile;); \
+ ANALYTICAL_NTILE(MULTI, TPE, nn[k], LNG_HGE, UPCAST, if (val <=
0) goto invalidntile;); \
} while (0)
gdk_return
@@ -1838,7 +1838,7 @@ GDKanalyticalsum(BAT *r, BAT *p, BAT *o,
bailout:
GDKerror("42000!error while calculating floating-point sum\n");
res = GDK_FAIL;
- goto cleanup;
+ goto cleanup;
calc_overflow:
GDKerror("22003!overflow in calculation.\n");
res = GDK_FAIL;
diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c
--- a/gdk/gdk_atoms.c
+++ b/gdk/gdk_atoms.c
@@ -914,9 +914,10 @@ mskWrite(const msk *a, stream *s, size_t
}
static void *
-mskRead(msk *a, size_t *dstlen, stream *s, size_t cnt)
+mskRead(msk *A, size_t *dstlen, stream *s, size_t cnt)
{
int8_t v;
+ msk *a = A;
if (cnt != 1)
return NULL;
if (a == NULL || *dstlen == 0) {
@@ -924,8 +925,11 @@ mskRead(msk *a, size_t *dstlen, stream *
return NULL;
*dstlen = 1;
}
- if (mnstr_readBte(s, &v) != 1)
+ if (mnstr_readBte(s, &v) != 1) {
+ if (a != A)
+ GDKfree(a);
return NULL;
+ }
*a = v != 0;
return a;
}
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -999,7 +999,9 @@ movestrbats(void)
continue;
char *oldpath = GDKfilepath(0, BATDIR,
BBP_physical(b->batCacheid), "tail");
char *newpath = GDKfilepath(0, BATDIR, b->theap->filename,
NULL);
- int ret = MT_rename(oldpath, newpath);
+ int ret = -1;
+ if (oldpath != NULL && newpath != NULL)
+ ret = MT_rename(oldpath, newpath);
GDKfree(oldpath);
GDKfree(newpath);
if (ret < 0)
@@ -3134,8 +3136,11 @@ BBPsync(int cnt, bat *restrict subcommit
MT_lock_set(&GDKswapLock(i));
}
BAT *b = dirty_bat(&i, subcommit != NULL);
- if (i <= 0)
+ if (i <= 0) {
+ if (lock)
+ MT_lock_unset(&GDKswapLock(subcommit ?
subcommit[idx] : idx));
break;
+ }
if (BBP_status(i) & BBPEXISTING) {
if (b != NULL && BBPbackup(b, subcommit !=
NULL) != GDK_SUCCEED) {
BBP_status_off(i, BBPSYNCING);
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -922,7 +922,12 @@ logger_create_types_file(logger *lg, con
#elif defined(HAVE_FSYNC)
&& fsync(fileno(fp)) < 0
#endif
- ) || fclose(fp) < 0) {
+ )) {
+ MT_remove(filename);
+ GDKerror("flushing log file %s failed", filename);
+ return GDK_FAIL;
+ }
+ if (fclose(fp) < 0) {
MT_remove(filename);
GDKerror("closing log file %s failed", filename);
return GDK_FAIL;
@@ -1242,6 +1247,7 @@ check_version(logger *lg, FILE *fp, cons
assert(!lg->inmemory);
if (fscanf(fp, "%6d", &version) != 1) {
GDKerror("Could not read the version number from the file
'%s/log'.\n", lg->dir);
+ fclose(fp);
return GDK_FAIL;
}
if (version < 52300) { /* first CATALOG_VERSION for "new" log format */
@@ -1250,8 +1256,10 @@ check_version(logger *lg, FILE *fp, cons
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");
+ fclose(fp);
return GDK_FAIL;
}
+ /* old_logger_load always closes fp */
if (old_logger_load(lg, fn, logdir, fp, version, filename) !=
GDK_SUCCEED) {
//loads drop no longer needed catalog, snapshots bats
//convert catalog_oid -> catalog_id (lng->int)
@@ -1269,6 +1277,7 @@ check_version(logger *lg, FILE *fp, cons
"this server supports version %06d.\n%s",
version, lg->version,
version < lg->version ? "Maybe you need to
upgrade to an intermediate release first.\n" : "");
+ fclose(fp);
return GDK_FAIL;
}
} else {
@@ -1276,8 +1285,8 @@ check_version(logger *lg, FILE *fp, cons
}
if (fgetc(fp) != '\n' || /* skip \n */
fgetc(fp) != '\n') { /* skip \n */
+ GDKerror("Badly formatted log file");
fclose(fp);
- GDKerror("Badly formatted log file");
return GDK_FAIL;
}
if (logger_read_types_file(lg, fp) != GDK_SUCCEED) {
@@ -1384,8 +1393,11 @@ bm_subcommit(logger *lg)
const lng *cnts = NULL, *lids = NULL;
int cleanup = 0;
- if (n == NULL)
+ if (n == NULL || sizes == NULL) {
+ GDKfree(n);
+ GDKfree(sizes);
return GDK_FAIL;
+ }
sizes[i] = 0;
n[i++] = 0; /* n[0] is not used */
@@ -1433,6 +1445,8 @@ bm_subcommit(logger *lg)
if ((lb = BATdescriptor(bids[pos])) == NULL ||
BATmode(lb, true/*transient*/) != GDK_SUCCEED) {
logbat_destroy(lb);
+ GDKfree(n);
+ GDKfree(sizes);
return GDK_FAIL;
}
//assert(BBP_lrefs(bid) == lb->batSharecnt + 1 &&
BBP_refs(bid) <= lb->batSharecnt);
@@ -1718,11 +1732,7 @@ logger_load(int debug, const char *fn, c
* shouldn't exist */
if (fp != NULL) {
GDKerror("there is no logger catalog, "
- "but there is a log file. "
- "Are you sure you are using the correct "
- "combination of database "
- "(--dbpath) and log directory "
- "(--set %s_logdir)?\n", fn);
+ "but there is a log file.\n");
goto error;
}
@@ -1786,23 +1796,18 @@ logger_load(int debug, const char *fn, c
/* the catalog exists, and so should the log file */
if (fp == NULL && !LOG_DISABLED(lg)) {
- GDKerror("there is a logger catalog, but no log file. "
- "Are you sure you are using the correct
combination of database "
- "(--dbpath) and log directory (--set
%s_logdir)? "
- "If you have done a recent update of the
server, it may be that your "
- "logs are in an old location. You should then
either use "
- "--set %s_logdir=<path to old log directory>
or move the old log "
- "directory to the new location (%s).\n",
- fn, fn, lg->dir);
+ GDKerror("There is a logger catalog, but no log
file.\n");
goto error;
}
- if (fp != NULL && check_version(lg, fp, fn, logdir, filename)
!= GDK_SUCCEED) { /* closes the file */
+ if (fp != NULL) {
+ /* check_version always closes fp */
+ if (check_version(lg, fp, fn, logdir, filename) !=
GDK_SUCCEED) {
+ fp = NULL;
+ goto error;
+ }
+ readlogs = true;
fp = NULL;
- goto error;
}
- if (fp)
- readlogs = true;
- fp = NULL;
if (lg->catalog_bid == NULL && lg->catalog_id == NULL &&
lg->dcatalog == NULL) {
b = BATdescriptor(catalog_bid);
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
@@ -1651,16 +1651,19 @@ logger_new(logger *lg, const char *fn, c
assert(lg != NULL);
if (GDKinmemory(0)) {
TRC_CRITICAL(GDK, "old logger can only be used with a
disk-based database\n");
+ fclose(fp);
return NULL;
}
if (MT_path_absolute(logdir)) {
TRC_CRITICAL(GDK, "logdir must be relative path\n");
+ fclose(fp);
return NULL;
}
old_lg = GDKmalloc(sizeof(struct old_logger));
if (old_lg == NULL) {
TRC_CRITICAL(GDK, "allocating logger structure failed\n");
+ fclose(fp);
return NULL;
}
@@ -1695,6 +1698,7 @@ logger_new(logger *lg, const char *fn, c
logbat_destroy(old_lg->add);
logbat_destroy(old_lg->del);
GDKfree(old_lg);
+ fclose(fp);
return NULL;
}
@@ -1704,6 +1708,7 @@ old_logger_destroy(old_logger *lg)
BUN p, q;
BAT *b = NULL;
const log_bid *bids;
+ gdk_return rc;
bat *subcommit = GDKmalloc(sizeof(log_bid) * (BATcount(lg->add) +
BATcount(lg->del) + 1));
if (subcommit == NULL) {
@@ -1748,26 +1753,31 @@ old_logger_destroy(old_logger *lg)
BBPrename(lg->lg->catalog_id->batCacheid, bak) < 0 ||
strconcat_len(bak, sizeof(bak), lg->lg->fn, "_dcatalog", NULL) >=
sizeof(bak) ||
BBPrename(lg->lg->dcatalog->batCacheid, bak) < 0) {
+ GDKfree(subcommit);
return GDK_FAIL;
}
- if (GDKmove(0, lg->lg->dir, LOGFILE, NULL, lg->lg->dir, LOGFILE, "bak",
true) != GDK_SUCCEED) {
+ if ((rc = GDKmove(0, lg->lg->dir, LOGFILE, NULL, lg->lg->dir, LOGFILE,
"bak", true)) != GDK_SUCCEED) {
TRC_CRITICAL(GDK, "logger_destroy failed\n");
- return GDK_FAIL;
+ GDKfree(subcommit);
+ return rc;
}
- if (logger_create_types_file(lg->lg, lg->filename) != GDK_SUCCEED) {
+ if ((rc = logger_create_types_file(lg->lg, lg->filename)) !=
GDK_SUCCEED) {
TRC_CRITICAL(GDK, "logger_destroy failed\n");
- return GDK_FAIL;
+ GDKfree(subcommit);
+ return rc;
}
lg->lg->id = (ulng) lg->id;
lg->lg->saved_id = lg->lg->id;
- if (TMsubcommit_list(subcommit, NULL, i, lg->lg->saved_id,
lg->lg->saved_tid) != GDK_SUCCEED) {
+ rc = TMsubcommit_list(subcommit, NULL, i, lg->lg->saved_id,
lg->lg->saved_tid);
+ GDKfree(subcommit);
+ if (rc != GDK_SUCCEED) {
TRC_CRITICAL(GDK, "logger_destroy failed\n");
- return GDK_FAIL;
+ return rc;
}
snprintf(bak, sizeof(bak), "bak-" LLFMT, lg->id);
- if (GDKmove(0, lg->lg->dir, LOGFILE, "bak", lg->lg->dir, LOGFILE, bak,
true) != GDK_SUCCEED) {
+ if ((rc = GDKmove(0, lg->lg->dir, LOGFILE, "bak", lg->lg->dir, LOGFILE,
bak, true)) != GDK_SUCCEED) {
TRC_CRITICAL(GDK, "logger_destroy failed\n");
- return GDK_FAIL;
+ return rc;
}
if (logger_cleanup(lg) != GDK_SUCCEED)
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -20,6 +20,8 @@
if (BATextend((B), \
MIN(BATcapacity(B) + (G), \
(M))) != GDK_SUCCEED) { \
+ if (locked) \
+ MT_rwlock_rdunlock(&b->thashlock); \
BBPreclaim(B); \
return (R); \
} \
@@ -106,6 +108,7 @@ hashselect(BAT *b, struct canditer *rest
BUN l, h, d = 0;
oid seq;
int (*cmp)(const void *, const void *);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list