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

Reply via email to