Changeset: 1f666ca11550 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1f666ca11550
Modified Files:
        sql/storage/bat/bat_logger.c
        sql/storage/store.c
Branch: pax-log
Log Message:

Merge with default.


diffs (truncated from 386 to 300 lines):

diff --git a/sql/storage/bat/bat_logger.c b/sql/storage/bat/bat_logger.c
--- a/sql/storage/bat/bat_logger.c
+++ b/sql/storage/bat/bat_logger.c
@@ -19,6 +19,7 @@
 #define CATALOG_JUN2020_MMT 52206      /* only in Jun2020-mmt */
 #define CATALOG_OCT2020 52205  /* first in Oct2020 */
 #define CATALOG_JUL2021 52300  /* first in Jul2021 */
+#define CATALOG_JAN2022 52301  /* first in Jan2022 */
 
 /* Note, CATALOG version 52300 is the first one where the basic system
  * tables (the ones created in store.c) have fixed and unchangeable
@@ -71,6 +72,14 @@ bl_preversion(sqlstore *store, int oldve
        }
 #endif
 
+#ifdef CATALOG_JAN2022
+       if (oldversion == CATALOG_JAN2022) {
+               /* upgrade to default releases */
+               store->catalog_version = oldversion;
+               return GDK_SUCCEED;
+       }
+#endif
+
        return GDK_FAIL;
 }
 
@@ -3169,17 +3178,21 @@ bl_sequence(sqlstore *store, int seq, ln
 /* Write a plan entry to copy part of the given file.
  * That part of the file must remain unchanged until the plan is executed.
  */
-static void
+static gdk_return __attribute__((__warn_unused_result__))
 snapshot_lazy_copy_file(stream *plan, const char *name, uint64_t extent)
 {
-       mnstr_printf(plan, "c %" PRIu64 " %s\n", extent, name);
+       if (mnstr_printf(plan, "c %" PRIu64 " %s\n", extent, name) < 0) {
+               GDKerror("%s", mnstr_peek_error(plan));
+               return GDK_FAIL;
+       }
+       return GDK_SUCCEED;
 }
 
 /* Write a plan entry to write the current contents of the given file.
  * The contents are included in the plan so the source file is allowed to
  * change in the mean time.
  */
-static gdk_return
+static gdk_return __attribute__((__warn_unused_result__))
 snapshot_immediate_copy_file(stream *plan, const char *path, const char *name)
 {
        gdk_return ret = GDK_FAIL;
@@ -3207,26 +3220,25 @@ snapshot_immediate_copy_file(stream *pla
                goto end;
        }
 
-       mnstr_printf(plan, "w %zu %s\n", to_copy, name);
+       if (mnstr_printf(plan, "w %zu %s\n", to_copy, name) < 0) {
+               GDKerror("%s", mnstr_peek_error(plan));
+               goto end;
+       }
 
        while (to_copy > 0) {
                size_t chunk = (to_copy <= bufsize) ? to_copy : bufsize;
                ssize_t bytes_read = mnstr_read(s, buf, 1, chunk);
                if (bytes_read < 0) {
-                       char *err = mnstr_error(s);
-                       GDKerror("Reading bytes of component %s failed: %s", 
path, err);
-                       free(err);
+                       GDKerror("Reading bytes of component %s failed: %s", 
path, mnstr_peek_error(s));
                        goto end;
                } else if (bytes_read < (ssize_t) chunk) {
-                       char *err = mnstr_error(s);
-                       GDKerror("Read only %zu/%zu bytes of component %s: %s", 
(size_t) bytes_read, chunk, path, err);
-                       free(err);
+                       GDKerror("Read only %zu/%zu bytes of component %s: %s", 
(size_t) bytes_read, chunk, path, mnstr_peek_error(s));
                        goto end;
                }
 
                ssize_t bytes_written = mnstr_write(plan, buf, 1, chunk);
                if (bytes_written < 0) {
-                       GDKerror("Writing to plan failed");
+                       GDKerror("Writing to plan failed: %s", 
mnstr_peek_error(plan));
                        goto end;
                } else if (bytes_written < (ssize_t) chunk) {
                        GDKerror("write to plan truncated");
@@ -3244,7 +3256,7 @@ end:
 }
 
 /* Add plan entries for all relevant files in the Write Ahead Log */
-static gdk_return
+static gdk_return __attribute__((__warn_unused_result__))
 snapshot_wal(logger *bat_logger, stream *plan, const char *db_dir)
 {
        char log_file[FILENAME_MAX];
@@ -3255,7 +3267,8 @@ snapshot_wal(logger *bat_logger, stream 
                GDKerror("Could not open %s, filename is too large", log_file);
                return GDK_FAIL;
        }
-       snapshot_immediate_copy_file(plan, log_file, log_file + strlen(db_dir) 
+ 1);
+       if (snapshot_immediate_copy_file(plan, log_file, log_file + 
strlen(db_dir) + 1) != GDK_SUCCEED)
+               return GDK_FAIL;
 
        for (ulng id = bat_logger->saved_id+1; id <= bat_logger->id; id++) {
                struct stat statbuf;
@@ -3266,7 +3279,8 @@ snapshot_wal(logger *bat_logger, stream 
                        return GDK_FAIL;
                }
                if (MT_stat(log_file, &statbuf) == 0) {
-                       snapshot_lazy_copy_file(plan, log_file + strlen(db_dir) 
+ 1, statbuf.st_size);
+                       if (snapshot_lazy_copy_file(plan, log_file + 
strlen(db_dir) + 1, statbuf.st_size) != GDK_SUCCEED)
+                               return GDK_FAIL;
                } else {
                        GDKerror("Could not open %s", log_file);
                        return GDK_FAIL;
@@ -3275,7 +3289,7 @@ snapshot_wal(logger *bat_logger, stream 
        return GDK_SUCCEED;
 }
 
-static gdk_return
+static gdk_return __attribute__((__warn_unused_result__))
 snapshot_heap(stream *plan, const char *db_dir, uint64_t batid, const char 
*filename, const char *suffix, uint64_t extent)
 {
        char path1[FILENAME_MAX];
@@ -3296,8 +3310,7 @@ snapshot_heap(stream *plan, const char *
                return GDK_FAIL;
        }
        if (MT_stat(path1, &statbuf) == 0) {
-               snapshot_lazy_copy_file(plan, path1 + offset, extent);
-               return GDK_SUCCEED;
+               return snapshot_lazy_copy_file(plan, path1 + offset, extent);
        }
        if (errno != ENOENT) {
                GDKsyserror("Error stat'ing %s", path1);
@@ -3312,8 +3325,7 @@ snapshot_heap(stream *plan, const char *
                return GDK_FAIL;
        }
        if (MT_stat(path2, &statbuf) == 0) {
-               snapshot_lazy_copy_file(plan, path2 + offset, extent);
-               return GDK_SUCCEED;
+               return snapshot_lazy_copy_file(plan, path2 + offset, extent);
        }
        if (errno != ENOENT) {
                GDKsyserror("Error stat'ing %s", path2);
@@ -3327,7 +3339,7 @@ snapshot_heap(stream *plan, const char *
 /* Add plan entries for all persistent BATs by looping over the BBP.dir.
  * Also include the BBP.dir itself.
  */
-static gdk_return
+static gdk_return __attribute__((__warn_unused_result__))
 snapshot_bats(stream *plan, const char *db_dir)
 {
        char bbpdir[FILENAME_MAX];
@@ -3335,6 +3347,7 @@ snapshot_bats(stream *plan, const char *
        char line[1024];
        int gdk_version, len;
        gdk_return ret = GDK_FAIL;
+       ssize_t n = 0;
 
        len = snprintf(bbpdir, FILENAME_MAX, "%s/%s/%s", db_dir, BAKDIR, 
"BBP.dir");
        if (len == -1 || len >= FILENAME_MAX) {
@@ -3352,7 +3365,7 @@ snapshot_bats(stream *plan, const char *
                goto end;
        }
        if (mnstr_readline(cat, line, sizeof(line)) < 0) {
-               GDKerror("Could not read first line of %s", bbpdir);
+               GDKerror("Could not read first line of %s: %s", bbpdir, 
mnstr_peek_error(cat));
                goto end;
        }
        if (sscanf(line, "BBP.dir, GDKversion %d", &gdk_version) != 1) {
@@ -3370,21 +3383,21 @@ snapshot_bats(stream *plan, const char *
                goto end;
        }
        if (mnstr_readline(cat, line, sizeof(line)) < 0) {
-               GDKerror("Couldn't skip the second line of %s", bbpdir);
+               GDKerror("Couldn't skip the second line of %s: %s", bbpdir, 
mnstr_peek_error(cat));
                goto end;
        }
        if (mnstr_readline(cat, line, sizeof(line)) < 0) {
-               GDKerror("Couldn't skip the third line of %s", bbpdir);
+               GDKerror("Couldn't skip the third line of %s: %s", bbpdir, 
mnstr_peek_error(cat));
                goto end;
        }
 
        /* TODO get transaction id and last processed log file id */
        if (mnstr_readline(cat, line, sizeof(line)) < 0) {
-               GDKerror("Couldn't skip the 4th line of %s", bbpdir);
+               GDKerror("Couldn't skip the 4th line of %s: %s", bbpdir, 
mnstr_peek_error(cat));
                goto end;
        }
 
-       while (mnstr_readline(cat, line, sizeof(line)) > 0) {
+       while ((n = mnstr_readline(cat, line, sizeof(line))) > 0) {
                uint64_t batid;
                char type[16];
                uint16_t width;
@@ -3426,13 +3439,13 @@ snapshot_bats(stream *plan, const char *
                                /* fallthrough */
                        case 5:
                                // tail only
-                               snapshot_heap(plan, db_dir, batid, filename,
-                                                         strcmp(type, "str") 
== 0 ? width == 1 ? ".tail1" : width == 2 ? ".tail2" :
+                               ret = snapshot_heap(plan, db_dir, batid, 
filename,
+                                                                       
strcmp(type, "str") == 0 ? width == 1 ? ".tail1" : width == 2 ? ".tail2" :
 #if SIZEOF_VAR_T == 8
-                                                         width == 4 ? ".tail4" 
:
+                                                                       width 
== 4 ? ".tail4" :
 #endif
-                                                         ".tail" : ".tail",
-                                                         tail_free);
+                                                                       ".tail" 
: ".tail",
+                                                                       
tail_free);
                                if (ret != GDK_SUCCEED)
                                        goto end;
                                /* fallthrough */
@@ -3441,6 +3454,10 @@ snapshot_bats(stream *plan, const char *
                                break;
                }
        }
+       if (n < 0) {
+               GDKerror("%s", mnstr_peek_error(cat));
+               return GDK_FAIL;
+       }
 
 end:
        if (cat) {
@@ -3455,7 +3472,7 @@ end:
  * With this information, a replica initialized from this snapshot can
  * be configured to catch up with its master by replaying later transactions.
  */
-static gdk_return
+static gdk_return __attribute__((__warn_unused_result__))
 snapshot_wlc(stream *plan, const char *db_dir)
 {
        const char name[] = "wlr.config.in";
@@ -3473,13 +3490,16 @@ snapshot_wlc(stream *plan, const char *d
                , wlc_beat, wlc_batches
        );
 
-       mnstr_printf(plan, "w %d %s\n", len, name);
-       mnstr_write(plan, buf, 1, len);
+       if (mnstr_printf(plan, "w %d %s\n", len, name) < 0 ||
+               mnstr_write(plan, buf, 1, len) < 0) {
+               GDKerror("%s", mnstr_peek_error(plan));
+               return GDK_FAIL;
+       }
 
        return GDK_SUCCEED;
 }
 
-static gdk_return
+static gdk_return __attribute__((__warn_unused_result__))
 snapshot_vaultkey(stream *plan, const char *db_dir)
 {
        char path[FILENAME_MAX];
@@ -3492,8 +3512,7 @@ snapshot_vaultkey(stream *plan, const ch
                return GDK_FAIL;
        }
        if (MT_stat(path, &statbuf) == 0) {
-               snapshot_lazy_copy_file(plan, ".vaultkey", statbuf.st_size);
-               return GDK_SUCCEED;
+               return snapshot_lazy_copy_file(plan, ".vaultkey", 
statbuf.st_size);
        }
        if (errno == ENOENT) {
                // No .vaultkey? Fine.
@@ -3503,6 +3522,7 @@ snapshot_vaultkey(stream *plan, const ch
        GDKsyserror("Error stat'ing %s", path);
        return GDK_FAIL;
 }
+
 static gdk_return
 bl_snapshot(sqlstore *store, stream *plan)
 {
@@ -3513,14 +3533,19 @@ bl_snapshot(sqlstore *store, stream *pla
 
        // Farm 0 is always the persistent farm.
        db_dir = GDKfilepath(0, NULL, "", NULL);
+       if (db_dir == NULL)
+               return GDK_FAIL;
        db_dir_len = strlen(db_dir);
        if (db_dir[db_dir_len - 1] == DIR_SEP)
                db_dir[db_dir_len - 1] = '\0';
 
-       mnstr_printf(plan, "%s\n", db_dir);
-
-       // Please monetdbd
-       mnstr_printf(plan, "w 0 .uplog\n");
+       if (mnstr_printf(plan, "%s\n", db_dir) < 0 ||
+               // Please monetdbd
+               mnstr_printf(plan, "w 0 .uplog\n") < 0) {
+               GDKerror("%s", mnstr_peek_error(plan));
+               ret = GDK_FAIL;
+               goto end;
+       }
 
        ret = snapshot_vaultkey(plan, db_dir);
        if (ret != GDK_SUCCEED)
@@ -3540,8 +3565,7 @@ bl_snapshot(sqlstore *store, stream *pla
 
        ret = GDK_SUCCEED;
 end:
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to