Changeset: 42b7d8db8df1 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=42b7d8db8df1
Modified Files:
        gdk/gdk_bbp.c
        gdk/gdk_heap.c
        gdk/gdk_tm.c
        sql/storage/bat/bat_utils.c
        sql/storage/store.c
Branch: Jun2016
Log Message:

Merge with Jul2015 branch.


diffs (215 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -113,6 +113,12 @@ static BAT *getBBPdescriptor(bat i, int 
 static gdk_return BBPbackup(BAT *b, bit subcommit);
 static gdk_return BBPdir(int cnt, bat *subcommit);
 
+#ifdef HAVE_HGE
+/* start out by saying we have no hge, but as soon as we've seen one,
+ * we'll always say we do have it */
+static int havehge = 0;
+#endif
+
 #define BBPnamecheck(s) (BBPtmpcheck(s) ? ((s)[3] == '_' ? strtol((s) + 4, 
NULL, 8) : -strtol((s) + 5, NULL, 8)) : 0)
 
 #ifdef ATOMIC_LOCK
@@ -944,6 +950,10 @@ heapinit(COLrec *col, const char *buf, i
        /* silently convert chr columns to bte */
        if (strcmp(type, "chr") == 0)
                strcpy(type, "bte");
+#ifdef HAVE_HGE
+       else if (strcmp(type, "hge") == 0)
+               havehge = 1;
+#endif
        if ((t = ATOMindex(type)) < 0)
                t = ATOMunknown_find(type);
        else if (var != (t == TYPE_void || BATatoms[t].atomPut != NULL))
@@ -1588,7 +1598,11 @@ static gdk_return
 BBPdir_header(FILE *f, int n)
 {
        if (fprintf(f, "BBP.dir, GDKversion %d\n%d %d %d\n",
-                   GDKLIBRARY, SIZEOF_SIZE_T, SIZEOF_OID, SIZEOF_MAX_INT) < 0 
||
+                   GDKLIBRARY, SIZEOF_SIZE_T, SIZEOF_OID,
+#ifdef HAVE_HGE
+                   havehge ? SIZEOF_HGE :
+#endif
+                   SIZEOF_LNG) < 0 ||
            OIDwrite(f) < 0 ||
            fprintf(f, " BBPsize=%d\n", n) < 0 ||
            ferror(f)) {
@@ -2124,6 +2138,11 @@ BBPinsert(BATstore *bs)
        BBP_refs(i) = 1;        /* new bats have 1 pin */
        BBP_lrefs(i) = 0;       /* ie. no logical refs */
 
+#ifdef HAVE_HGE
+       if (bs->T.type == TYPE_hge)
+               havehge = 1;
+#endif
+
        if (BBP_bak(i) == NULL) {
                s = BBPtmpname(dirname, 64, i);
                BBP_logical(i) = GDKstrdup(s);
@@ -3605,8 +3624,8 @@ BBPprepare(bit subcommit)
 }
 
 static gdk_return
-do_backup(const char *srcdir, const char *nme, const char *extbase,
-         Heap *h, int tp, int dirty, bit subcommit)
+do_backup(const char *srcdir, const char *nme, const char *ext,
+         Heap *h, int dirty, bit subcommit)
 {
        gdk_return ret = GDK_SUCCEED;
 
@@ -3614,10 +3633,11 @@ do_backup(const char *srcdir, const char
          * protection); however, if we're backing up for subcommit
          * and a backup already exists in the main backup directory
          * (see GDKupgradevarheap), move the file */
-       if (subcommit && file_exists(h->farmid, BAKDIR, nme, extbase)) {
-               if (file_move(h->farmid, BAKDIR, SUBDIR, nme, extbase) != 
GDK_SUCCEED)
+       if (subcommit && file_exists(h->farmid, BAKDIR, nme, ext)) {
+               if (file_move(h->farmid, BAKDIR, SUBDIR, nme, ext) != 
GDK_SUCCEED)
                        return GDK_FAIL;
-       } else if (h->storage != STORE_MMAP) {
+       }
+       if (h->storage != STORE_MMAP) {
                /* STORE_PRIV saves into X.new files. Two cases could
                 * happen. The first is when a valid X.new exists
                 * because of an access change or a previous
@@ -3627,23 +3647,34 @@ do_backup(const char *srcdir, const char
                 * X.new files (after a crash). To protect against
                 * these we write X.new.kill files in the backup
                 * directory (see heap_move). */
-               char ext[16];
+               char extnew[16];
                gdk_return mvret = GDK_SUCCEED;
 
-               if (h->filename && h->newstorage == STORE_PRIV)
-                       snprintf(ext, sizeof(ext), "%s.new", extbase);
-               else
-                       snprintf(ext, sizeof(ext), "%s", extbase);
-               if (tp && dirty && !file_exists(h->farmid, BAKDIR, nme, ext)) {
-                       /* file will be saved (is dirty), move the old
-                        * image into backup */
-                       mvret = heap_move(h, srcdir, subcommit ? SUBDIR : 
BAKDIR, nme, ext);
-               } else if (subcommit && tp &&
-                          (dirty || file_exists(h->farmid, BAKDIR, nme, ext))) 
{
-                       /* file is clean. move the backup into the
-                        * subcommit dir (commit should eliminate
-                        * backup) */
-                       mvret = file_move(h->farmid, BAKDIR, SUBDIR, nme, ext);
+               snprintf(extnew, sizeof(extnew), "%s.new", ext);
+               if (dirty &&
+                   !file_exists(h->farmid, BAKDIR, nme, extnew) &&
+                   !file_exists(h->farmid, BAKDIR, nme, ext)) {
+                       /* if the heap is dirty and there is no heap
+                        * file (with or without .new extension) in
+                        * the BAKDIR, move the heap (preferably with
+                        * .new extension) to the correct backup
+                        * directory */
+                       if (file_exists(h->farmid, srcdir, nme, extnew))
+                               mvret = heap_move(h, srcdir,
+                                                 subcommit ? SUBDIR : BAKDIR,
+                                                 nme, extnew);
+                       else
+                               mvret = heap_move(h, srcdir,
+                                                 subcommit ? SUBDIR : BAKDIR,
+                                                 nme, ext);
+               } else if (subcommit) {
+                       /* if subcommit, wqe may need to move an
+                        * already made backup from BAKDIR to
+                        * SUBSIR */
+                       if (file_exists(h->farmid, BAKDIR, nme, extnew))
+                               mvret = file_move(h->farmid, BAKDIR, SUBDIR, 
nme, extnew);
+                       else if (file_exists(h->farmid, BAKDIR, nme, ext))
+                               mvret = file_move(h->farmid, BAKDIR, SUBDIR, 
nme, ext);
                }
                /* there is a situation where the move may fail,
                 * namely if this heap was not supposed to be existing
@@ -3690,20 +3721,20 @@ BBPbackup(BAT *b, bit subcommit)
        nme[sizeof(nme) - 1] = 0;
        srcdir[s - srcdir] = 0;
 
-       if (do_backup(srcdir, nme, "head", &b->H->heap, b->htype,
+       if (b->htype != TYPE_void &&
+           do_backup(srcdir, nme, "head", &b->H->heap,
                      b->batDirty || b->H->heap.dirty, subcommit) != 
GDK_SUCCEED)
                goto fail;
-       if (do_backup(srcdir, nme, "tail", &b->T->heap, b->ttype,
+       if (b->ttype != TYPE_void &&
+           do_backup(srcdir, nme, "tail", &b->T->heap,
                      b->batDirty || b->T->heap.dirty, subcommit) != 
GDK_SUCCEED)
                goto fail;
        if (b->H->vheap &&
            do_backup(srcdir, nme, "hheap", b->H->vheap,
-                     b->htype && b->hvarsized,
                      b->batDirty || b->H->vheap->dirty, subcommit) != 
GDK_SUCCEED)
                goto fail;
        if (b->T->vheap &&
            do_backup(srcdir, nme, "theap", b->T->vheap,
-                     b->ttype && b->tvarsized,
                      b->batDirty || b->T->vheap->dirty, subcommit) != 
GDK_SUCCEED)
                goto fail;
        GDKfree(srcdir);
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -582,6 +582,10 @@ HEAPfree(Heap *h, int remove)
                        if (path && unlink(path) < 0 && errno != ENOENT)
                                perror(path);
                        GDKfree(path);
+                       path = GDKfilepath(h->farmid, BATDIR, h->filename, 
"new");
+                       if (path && unlink(path) < 0 && errno != ENOENT)
+                               perror(path);
+                       GDKfree(path);
                }
                GDKfree(h->filename);
                h->filename = NULL;
diff --git a/gdk/gdk_tm.c b/gdk/gdk_tm.c
--- a/gdk/gdk_tm.c
+++ b/gdk/gdk_tm.c
@@ -148,7 +148,7 @@ TMcommit(void)
  * @- TMsubcommit
  *
  * Create a new checkpoint that is equal to the previous, with the
- * expection that for the passed list of batnames, the current state
+ * exception that for the passed list of batnames, the current state
  * will be reflected in the new checkpoint.
  *
  * On the bats in this list we assume exclusive access during the
diff --git a/sql/storage/bat/bat_utils.c b/sql/storage/bat/bat_utils.c
--- a/sql/storage/bat/bat_utils.c
+++ b/sql/storage/bat/bat_utils.c
@@ -8,6 +8,7 @@
 
 #include "monetdb_config.h"
 #include "bat_utils.h"
+#include "mal.h"               /* for have_hge */
 
 void
 bat_destroy(BAT *b)
@@ -175,7 +176,11 @@ bat_utils_init(void)
        int t;
 
        for (t=1; t<GDKatomcnt; t++) {
-               if (t != TYPE_bat && BATatoms[t].name[0]) {
+               if (t != TYPE_bat && BATatoms[t].name[0]
+#ifdef HAVE_HGE
+                   && (have_hge || t != TYPE_hge)
+#endif
+               ) {
                        ebats[t] = bat_new(TYPE_void, t, 0, TRANSIENT);
                        bat_set_access(ebats[t], BAT_READ);
                }
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1085,7 +1085,7 @@ insert_functions(sql_trans *tr, sql_tabl
                char arg_nme[] = "arg_0";
 
                if (f->s)
-                        table_funcs.table_insert(tr, sysfunc, &f->base.id, 
f->base.name, f->imp, f->mod, &lang, &f->type, &se,&f->varres, &f->vararg, 
&f->s->base.id);
+                       table_funcs.table_insert(tr, sysfunc, &f->base.id, 
f->base.name, f->imp, f->mod, &lang, &f->type, &se, &f->varres, &f->vararg, 
&f->s->base.id);
                else
                        table_funcs.table_insert(tr, sysfunc, &f->base.id, 
f->base.name, f->imp, f->mod, &lang, &f->type, &se, &f->varres, &f->vararg, 
&zero);
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to