Changeset: 8bb93d21f81b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8bb93d21f81b
Modified Files:
        gdk/gdk_bat.c
        gdk/gdk_bbp.c
        gdk/gdk_private.h
        gdk/gdk_storage.c
Branch: default
Log Message:

A little cleanup: don't keep bat locked during backup, use iterator instead.


diffs (180 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -180,6 +180,28 @@ BATsetdims(BAT *b, uint16_t width)
 }
 
 const char *
+gettailnamebi(const BATiter *bi)
+{
+       if (bi->type == TYPE_str) {
+               switch (bi->width) {
+               case 1:
+                       return "tail1";
+               case 2:
+                       return "tail2";
+#if SIZEOF_VAR_T == 8
+               case 4:
+                       return "tail4";
+#endif
+               case 8:
+                       break;
+               default:
+                       MT_UNREACHABLE();
+               }
+       }
+       return "tail";
+}
+
+const char *
 gettailname(const BAT *b)
 {
        if (b->ttype == TYPE_str) {
@@ -192,8 +214,10 @@ gettailname(const BAT *b)
                case 4:
                        return "tail4";
 #endif
+               case 8:
+                       break;
                default:
-                       break;
+                       MT_UNREACHABLE();
                }
        }
        return "tail";
@@ -222,8 +246,10 @@ settailname(Heap *restrict tail, const c
                                      ".tail4", NULL);
                        return;
 #endif
+               case 8:
+                       break;
                default:
-                       break;
+                       MT_UNREACHABLE();
                }
        }
        strconcat_len(tail->filename, sizeof(tail->filename), physnme,
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -3746,52 +3746,37 @@ do_backup(const char *srcdir, const char
 static gdk_return
 BBPbackup(BAT *b, bool subcommit)
 {
-       char *srcdir;
-       long_str nme;
-       const char *s = BBP_physical(b->batCacheid);
-       size_t slen;
-       bool locked = false;
-
-       if (BBPprepare(subcommit) != GDK_SUCCEED) {
-               return GDK_FAIL;
+       gdk_return rc;
+
+       if ((rc = BBPprepare(subcommit)) != GDK_SUCCEED) {
+               return rc;
        }
        if (!b->batCopiedtodisk || b->batTransient) {
                return GDK_SUCCEED;
        }
        /* determine location dir and physical suffix */
-       if (!(srcdir = GDKfilepath(NOFARM, BATDIR, s, NULL)))
-               goto fail;
-       s = strrchr(srcdir, DIR_SEP);
-       if (!s)
-               goto fail;
-
-       slen = strlen(++s);
-       if (slen >= sizeof(nme))
-               goto fail;
-       memcpy(nme, s, slen + 1);
-       srcdir[s - srcdir] = 0;
-
-       MT_lock_set(&b->theaplock);
-       locked = true;
-       if (b->ttype != TYPE_void &&
-           do_backup(srcdir, nme, gettailname(b), b->theap,
-                     b->batDirtydesc || b->theap->dirty,
-                     subcommit) != GDK_SUCCEED)
-               goto fail;
-       if (b->tvheap &&
-           do_backup(srcdir, nme, "theap", b->tvheap,
-                     b->batDirtydesc || b->tvheap->dirty,
-                     subcommit) != GDK_SUCCEED)
-               goto fail;
-       MT_lock_unset(&b->theaplock);
+       char *srcdir;
+       if ((srcdir = GDKfilepath(NOFARM, BATDIR, BBP_physical(b->batCacheid), 
NULL)) != NULL) {
+               char *nme = strrchr(srcdir, DIR_SEP);
+               assert(nme != NULL);
+               *nme++ = '\0';  /* split into directory and file name */
+
+               BATiter bi = bat_iterator(b);
+               if (bi.type != TYPE_void) {
+                       rc = do_backup(srcdir, nme, gettailnamebi(&bi), bi.h,
+                                      b->batDirtydesc || bi.h->dirty,
+                                      subcommit);
+                       if (rc == GDK_SUCCEED && bi.vh != NULL)
+                               rc = do_backup(srcdir, nme, "theap", bi.vh,
+                                              b->batDirtydesc || bi.vh->dirty,
+                                              subcommit);
+               }
+               bat_iterator_end(&bi);
+       } else {
+               rc = GDK_FAIL;
+       }
        GDKfree(srcdir);
-       return GDK_SUCCEED;
-  fail:
-       if (locked)
-               MT_lock_unset(&b->theaplock);
-       if(srcdir)
-               GDKfree(srcdir);
-       return GDK_FAIL;
+       return rc;
 }
 
 /*
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -256,6 +256,8 @@ gdk_return rangejoin(BAT *r1, BAT *r2, B
        __attribute__((__visibility__("hidden")));
 const char *gettailname(const BAT *b)
        __attribute__((__visibility__("hidden")));
+const char *gettailnamebi(const BATiter *bi)
+       __attribute__((__visibility__("hidden")));
 void settailname(Heap *restrict tail, const char *restrict physnme, int tt, 
int width)
        __attribute__((__visibility__("hidden")));
 void strCleanHash(Heap *hp, bool rebuild)
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -763,27 +763,6 @@ BATmsync(BAT *b)
 #endif /* DISABLE_MSYNC */
 }
 
-static inline const char *
-gettailnamebi(const BATiter *bi)
-{
-       if (bi->type != TYPE_str)
-               return "tail";
-       switch (bi->width) {
-       case 1:
-               return "tail1";
-       case 2:
-               return "tail2";
-#if SIZEOF_VAR_T == 8
-       case 4:
-               return "tail4";
-#endif
-       case 8:
-               return "tail";
-       default:
-               MT_UNREACHABLE();
-       }
-}
-
 gdk_return
 BATsave_locked(BAT *b, BATiter *bi, BUN size)
 {
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to