Changeset: c1690999ec21 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c1690999ec21
Modified Files:
        clients/Tests/exports.stable.out
        clients/mapiclient/ReadlineTools.c
        clients/mapiclient/dotmonetdb.c
        common/options/monet_options.c
        gdk/gdk_atoms.c
        gdk/gdk_bat.c
        gdk/gdk_bbp.c
        gdk/gdk_bbp.h
        gdk/gdk_hash.c
        gdk/gdk_imprints.c
        gdk/gdk_logger.c
        gdk/gdk_orderidx.c
        gdk/gdk_private.h
        gdk/gdk_storage.c
        gdk/gdk_system.c
        gdk/gdk_system.h
        gdk/gdk_utils.c
        monetdb5/extras/rapi/rapi.c
        monetdb5/mal/mal_client.c
        monetdb5/mal/mal_client.h
        monetdb5/mal/mal_dataflow.c
        monetdb5/mal/mal_exception.c
        monetdb5/mal/mal_linker.c
        monetdb5/mal/mal_profiler.c
        monetdb5/modules/kernel/Tests/status.malC
        monetdb5/modules/kernel/status.c
        monetdb5/modules/mal/bbp.c
        monetdb5/modules/mal/mal_mapi.c
        monetdb5/modules/mal/querylog.c
        monetdb5/modules/mal/tokenizer.c
        monetdb5/modules/mal/wlc.c
        monetdb5/optimizer/opt_querylog.c
        monetdb5/tools/Tests/mserver5--help.stable.err
        monetdb5/tools/Tests/mserver5--help.stable.err.Windows
        sql/backends/monet5/UDF/pyapi/pyapi.c
        sql/backends/monet5/vaults/bam/bam_loader.c
        sql/backends/monet5/wlr.c
        sql/server/sql_mvc.c
        tools/mserver/mserver5.1.in
        tools/mserver/mserver5.c
        tools/mserver/shutdowntest.c
Branch: translate-scripts
Log Message:

Merge with default.


diffs (truncated from 2091 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -186,12 +186,10 @@ gdk_return BBPaddfarm(const char *dirnam
 void BBPclear(bat bid);
 BAT *BBPdescriptor(bat b);
 int BBPfix(bat b);
-int BBPin;
 bat BBPindex(const char *nme);
 void BBPkeepref(bat i);
 bat BBPlimit;
 void BBPlock(void);
-int BBPout;
 BAT *BBPquickdesc(bat b, bool delaccess);
 int BBPreclaim(BAT *b);
 int BBPrelease(bat b);
@@ -278,8 +276,10 @@ void GDKregister(MT_Id pid);
 gdk_return GDKreleasemmap(void *ptr, size_t size, size_t id);
 gdk_return GDKreleasesem(int sem_id);
 void GDKreset(int status);
+void GDKsetdebug(int debug);
 gdk_return GDKsetenv(const char *name, const char *value);
 void GDKsetmallocsuccesscount(lng count);
+void GDKsetverbose(int verbosity);
 ssize_t GDKstrFromStr(unsigned char *restrict dst, const unsigned char 
*restrict src, ssize_t len);
 str GDKstrdup(const char *s) __attribute__((__warn_unused_result__));
 str GDKstrndup(const char *s, size_t n) 
__attribute__((__warn_unused_result__));
@@ -287,6 +287,7 @@ void GDKsyserror(_In_z_ _Printf_format_s
 size_t GDKuniqueid(size_t offset);
 gdk_return GDKupgradevarheap(BAT *b, var_t v, bool copyall, bool mayshare) 
__attribute__((__warn_unused_result__));
 lng GDKusec(void);
+int GDKverbose;
 const char *GDKversion(void);
 size_t GDKvm_cursize(void);
 void *GDKzalloc(size_t size) __attribute__((__malloc__)) 
__attribute__((__alloc_size__(1))) __attribute__((__warn_unused_result__));
@@ -302,7 +303,7 @@ size_t HEAPvmsize(Heap *h);
 void IMPSdestroy(BAT *b);
 lng IMPSimprintsize(BAT *b);
 int MT_check_nr_cores(void);
-int MT_create_thread(MT_Id *t, void (*function)(void *), void *arg, enum 
MT_thr_detach d);
+int MT_create_thread(MT_Id *t, void (*function)(void *), void *arg, enum 
MT_thr_detach d, const char *threadname);
 void MT_exiting_thread(void);
 MT_Id MT_getpid(void);
 size_t MT_getrss(void);
@@ -313,6 +314,9 @@ void *MT_mmap(const char *path, int mode
 int MT_munmap(void *p, size_t len);
 bool MT_path_absolute(const char *path);
 void MT_sleep_ms(unsigned int ms);
+bool MT_thread_init(void);
+const char *MT_thread_name(void);
+void MT_thread_setname(const char *name);
 void OIDXdestroy(BAT *b);
 ssize_t OIDfromStr(const char *src, size_t *len, oid **dst, bool external);
 ssize_t OIDtoStr(str *dst, size_t *len, const oid *src, bool external);
diff --git a/clients/mapiclient/ReadlineTools.c 
b/clients/mapiclient/ReadlineTools.c
--- a/clients/mapiclient/ReadlineTools.c
+++ b/clients/mapiclient/ReadlineTools.c
@@ -321,18 +321,25 @@ init_readline(Mapi mid, char *lang, int 
        }
 
        if (save_history) {
+               int len;
 #ifndef NATIVE_WIN32
                if (getenv("HOME") != NULL) {
-                       snprintf(_history_file, FILENAME_MAX,
+                       len = snprintf(_history_file, FILENAME_MAX,
                                 "%s/.mapiclient_history_%s",
                                 getenv("HOME"), language);
-                       _save_history = 1;
+                       if (len == -1 || len >= FILENAME_MAX)
+                               fprintf(stderr, "Warning: history filename path 
is too large\n");
+                       else
+                               _save_history = 1;
                }
 #else
-               snprintf(_history_file, FILENAME_MAX,
+               len = snprintf(_history_file, FILENAME_MAX,
                         "%s%c_mapiclient_history_%s",
                         mo_find_option(NULL, 0, "prefix"), DIR_SEP, language);
-               _save_history = 1;
+               if (len == -1 || len >= FILENAME_MAX)
+                       fprintf(stderr, "Warning: history filename path is too 
large\n");
+               else
+                       _save_history = 1;
 #endif
                if (_save_history) {
                        FILE *f;
diff --git a/clients/mapiclient/dotmonetdb.c b/clients/mapiclient/dotmonetdb.c
--- a/clients/mapiclient/dotmonetdb.c
+++ b/clients/mapiclient/dotmonetdb.c
@@ -15,18 +15,22 @@ parse_dotmonetdb(char **user, char **pas
 {
        char *cfile;
        FILE *config = NULL;
-       char buf[1024];
+       char buf[FILENAME_MAX];
 
        if ((cfile = getenv("DOTMONETDBFILE")) == NULL) {
                /* no environment variable: use a default */
                if ((config = fopen(".monetdb", "r")) == NULL) {
                        if ((cfile = getenv("HOME")) != NULL) {
-                               snprintf(buf, sizeof(buf), "%s%c.monetdb", 
cfile, DIR_SEP);
-                               config = fopen(buf, "r");
-                               if (config)
-                                       cfile = strdup(buf);
-                               else
+                               int len = snprintf(buf, sizeof(buf), 
"%s%c.monetdb", cfile, DIR_SEP);
+                               if (len == -1 || len >= FILENAME_MAX) {
                                        cfile = NULL;
+                               } else {
+                                       config = fopen(buf, "r");
+                                       if (config)
+                                               cfile = strdup(buf);
+                                       else
+                                               cfile = NULL;
+                               }
                        }
                } else {
                        cfile = strdup(".monetdb");
diff --git a/common/options/monet_options.c b/common/options/monet_options.c
--- a/common/options/monet_options.c
+++ b/common/options/monet_options.c
@@ -219,7 +219,7 @@ mo_builtin_settings(opt **Set)
        if (Set == NULL)
                return 0;
 
-#define N_OPTIONS      9       /*MUST MATCH # OPTIONS BELOW */
+#define N_OPTIONS      8       /*MUST MATCH # OPTIONS BELOW */
        set = malloc(sizeof(opt) * N_OPTIONS);
        if (set == NULL)
                return 0;
@@ -230,10 +230,6 @@ mo_builtin_settings(opt **Set)
                              "dbfarm" DIR_SEP_STR "demo");
        i++;
        set[i].kind = opt_builtin;
-       set[i].name = strdup("gdk_debug");
-       set[i].value = strdup("0");
-       i++;
-       set[i].kind = opt_builtin;
        set[i].name = strdup("monet_prompt");
        set[i].value = strdup(">");
        i++;
diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c
--- a/gdk/gdk_atoms.c
+++ b/gdk/gdk_atoms.c
@@ -1400,6 +1400,7 @@ ATOMunknown_find(const char *nme)
 str
 ATOMunknown_name(int i)
 {
+       assert(i < 0);
        assert(unknown[-i]);
        return unknown[-i];
 }
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -2065,7 +2065,6 @@ BATmode(BAT *b, bool transient)
                if (!transient) {
                        check_type(b->ttype);
                }
-               BBP_dirty = true;
 
                if (!transient && isVIEW(b)) {
                        if (VIEWreset(b) != GDK_SUCCEED) {
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -159,13 +159,6 @@ getBBPsize(void)
 
 
 /*
- * other globals
- */
-bool BBP_dirty = false;                /* BBP structures modified? */
-int BBPin = 0;                 /* bats loaded statistic */
-int BBPout = 0;                        /* bats saved statistic */
-
-/*
  * @+ BBP Consistency and Concurrency
  * While GDK provides the basic building blocks for an ACID system, in
  * itself it is not such a system, as we this would entail too much
@@ -543,6 +536,7 @@ fixfloatbats(void)
        char filename[FILENAME_MAX];
        FILE *fp;
        size_t len;
+       int written;
 
        for (bid = 1; bid < (bat) ATOMIC_GET(BBPsize, BBPsizeLock); bid++) {
                if ((b = BBP_desc(bid)) == NULL) {
@@ -557,10 +551,13 @@ fixfloatbats(void)
                         * logger that it also needs to do a
                         * conversion.  That is done by creating a
                         * file here based on the name of this BAT. */
-                       snprintf(filename, sizeof(filename),
+                       written = snprintf(filename, sizeof(filename),
                                 "%s/%.*s_nil-nan-convert",
                                 BBPfarms[0].dirname,
                                 (int) (len - 12), BBP_logical(bid));
+                       if (written == -1 || written >= FILENAME_MAX)
+                               GDKfatal("fixfloatbats: cannot create file %s 
has a very large pathname\n",
+                                                filename);
                        fp = fopen(filename, "w");
                        if (fp == NULL) {
                                GDKsyserror("fixfloatbats: cannot create file 
%s\n",
@@ -899,6 +896,60 @@ BBPreadEntries(FILE *fp, unsigned bbpver
        return GDK_SUCCEED;
 }
 
+/* check that the necessary files for all BATs exist and are large
+ * enough */
+static gdk_return
+BBPcheckbats(void)
+{
+       for (bat bid = 1; bid < (bat) ATOMIC_GET(BBPsize, BBPsizeLock); bid++) {
+               struct stat statb;
+               BAT *b;
+               char *path;
+
+               if ((b = BBP_desc(bid)) == NULL) {
+                       /* not a valid BAT */
+                       continue;
+               }
+               if (b->ttype == TYPE_void) {
+                       /* no files needed */
+                       continue;
+               }
+               path = GDKfilepath(0, BATDIR, BBP_physical(b->batCacheid), 
"tail");
+               if (path == NULL)
+                       return GDK_FAIL;
+               if (stat(path, &statb) < 0) {
+                       GDKsyserror("BBPcheckbats: cannot stat file %s\n",
+                                   path);
+                       GDKfree(path);
+                       return GDK_FAIL;
+               }
+               if ((size_t) statb.st_size < b->theap.free) {
+                       GDKerror("BBPcheckbats: file %s too small (expected 
%zu, actual %zu)\n", path, b->theap.free, (size_t) statb.st_size);
+                       GDKfree(path);
+                       return GDK_FAIL;
+               }
+               GDKfree(path);
+               if (b->tvheap != NULL) {
+                       path = GDKfilepath(0, BATDIR, 
BBP_physical(b->batCacheid), "theap");
+                       if (path == NULL)
+                               return GDK_FAIL;
+                       if (stat(path, &statb) < 0) {
+                               GDKsyserror("BBPcheckbats: cannot stat file 
%s\n",
+                                           path);
+                               GDKfree(path);
+                               return GDK_FAIL;
+                       }
+                       if ((size_t) statb.st_size < b->tvheap->free) {
+                               GDKerror("BBPcheckbats: file %s too small 
(expected %zu, actual %zu)\n", path, b->tvheap->free, (size_t) statb.st_size);
+                               GDKfree(path);
+                               return GDK_FAIL;
+                       }
+                       GDKfree(path);
+               }
+       }
+       return GDK_SUCCEED;
+}
+
 #ifdef HAVE_HGE
 #define SIZEOF_MAX_INT SIZEOF_HGE
 #else
@@ -1164,7 +1215,6 @@ BBPinit(void)
        BBPlimit = 0;
        memset(BBP, 0, sizeof(BBP));
        ATOMIC_SET(BBPsize, 1, BBPsizeLock);
-       BBP_dirty = true;
 
        if (!GDKinmemory()) {
                bbpversion = BBPheader(fp);
@@ -1192,6 +1242,9 @@ BBPinit(void)
                return GDK_FAIL;
        }
 
+       if (BBPcheckbats() != GDK_SUCCEED)
+               return GDK_FAIL;
+
        /* cleanup any leftovers (must be done after BBPrecover) */
        for (i = 0; i < MAXFARMS && BBPfarms[i].dirname != NULL; i++) {
                int j;
@@ -1817,7 +1870,7 @@ BBPinsert(BAT *bn)
        bool lock = locked_by == 0 || locked_by != pid;
        char dirname[24];
        bat i;
-       int idx = threadmask(pid);
+       int idx = threadmask(pid), len = 0;
 
        /* critical section: get a new BBP entry */
        if (lock) {
@@ -1883,7 +1936,9 @@ BBPinsert(BAT *bn)
 #endif
 
        if (*BBP_bak(i) == 0)
-               snprintf(BBP_bak(i), sizeof(BBP_bak(i)), "tmp_%o", (unsigned) 
i);
+               len = snprintf(BBP_bak(i), sizeof(BBP_bak(i)), "tmp_%o", 
(unsigned) i);
+       if (len == -1 || len >= FILENAME_MAX)
+               return 0;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to