Changeset: 061de9dda6ec for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/061de9dda6ec
Modified Files:
        gdk/gdk_logger.c
Branch: Jul2021
Log Message:

improve logging (large sets) of strings.


diffs (153 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -329,6 +329,36 @@ log_read_id(logger *lg, log_id *id)
 #endif
 
 static log_return
+string_reader(logger *lg, BAT *b, lng nr)
+{
+       int sz = 0;
+       log_return res = LOG_OK;
+
+       if (mnstr_readInt(lg->input_log, &sz) != 1)
+               return LOG_EOF;
+       char *buf = GDKmalloc(sz);
+
+       if (!buf || mnstr_read(lg->input_log, buf, sz, 1) != 1) {
+               GDKfree(buf);
+               return LOG_EOF;
+       }
+       /* handle strings */
+       if (b) {
+               char *t = buf;
+               for(int i=0; i<nr && res == LOG_OK; i++) {
+                       if (BUNappend(b, t, true) != GDK_SUCCEED)
+                               res = LOG_ERR;
+                       /* find next */
+                       while(*t)
+                               t++;
+                       t++;
+               }
+       }
+       GDKfree(buf);
+       return res;
+}
+
+static log_return
 log_read_updates(logger *lg, trans *tr, logformat *l, log_id id, lng offset)
 {
        log_return res = LOG_OK;
@@ -427,6 +457,9 @@ log_read_updates(logger *lg, trans *tr, 
                                                if (r && BUNappendmulti(r, t, 
cnt, true) != GDK_SUCCEED)
                                                        res = LOG_ERR;
                                        }
+                               } else if (tpe == TYPE_str) {
+                                       /* efficient string */
+                                       res = string_reader(lg, r, nr);
                                } else {
                                        for (; res == LOG_OK && nr > 0; nr--) {
                                                size_t tlen = lg->bufsize;
@@ -487,6 +520,9 @@ log_read_updates(logger *lg, trans *tr, 
                                                break;
                                        }
                                }
+                       } else if (tpe == TYPE_str) {
+                               /* efficient string */
+                               res = string_reader(lg, r, nr);
                        } else {
                                for (; res == LOG_OK && nr > 0; nr--) {
                                        size_t tlen = lg->bufsize;
@@ -2297,6 +2333,33 @@ log_constant(logger *lg, int type, ptr v
 }
 
 static gdk_return
+string_writer(logger *lg, BAT *b, lng offset, lng nr)
+{
+       int sz = 0;
+       BUN end = (BUN)(offset + nr);
+
+       BATiter bi = bat_iterator(b);
+       for(BUN p = (BUN)offset; p < end; p++) {
+               char *s = BUNtail(bi, p);
+               sz += strlen(s)+1; /* we need a seperator */
+       }
+       char *buf = GDKmalloc(sz), *dst = buf;
+       if (buf) {
+               for(BUN p = (BUN)offset; p < end; p++) {
+                       char *s = BUNtail(bi, p);
+                       strcpy(dst, s);
+                       dst += strlen(s)+1;
+               }
+       }
+       gdk_return res = GDK_FAIL;
+       if (buf && mnstr_writeInt(lg->output_log, (int) sz) && 
mnstr_write(lg->output_log, buf, sz, 1) == 1)
+               res = GDK_SUCCEED;
+       GDKfree(buf);
+       bat_iterator_end(&bi);
+       return res;
+}
+
+static gdk_return
 internal_log_bat(logger *lg, BAT *b, log_id id, lng offset, lng cnt, int 
sliced)
 {
        bte tpe = find_type(lg, b->ttype);
@@ -2323,7 +2386,6 @@ internal_log_bat(logger *lg, BAT *b, log
                return GDK_SUCCEED;
        }
 
-       BATiter bi = bat_iterator(b);
        gdk_return (*wt) (const void *, stream *, size_t) = 
BATatoms[b->ttype].atomWrite;
 
        if (is_row)
@@ -2340,6 +2402,7 @@ internal_log_bat(logger *lg, BAT *b, log
        if (sliced)
                offset = 0;
        if (b->ttype == TYPE_msk) {
+               BATiter bi = bat_iterator(b);
                if (offset % 32 == 0) {
                        if (!mnstr_writeIntArray(lg->output_log, (int *) ((char 
*) bi.base + offset / 32), (size_t) ((nr + 31) / 32)))
                                ok = GDK_FAIL;
@@ -2354,24 +2417,31 @@ internal_log_bat(logger *lg, BAT *b, log
                                }
                        }
                }
+               bat_iterator_end(&bi);
        } else if (b->ttype < TYPE_str && !isVIEW(b)) {
+               BATiter bi = bat_iterator(b);
                const void *t = BUNtail(bi, (BUN)offset);
 
                ok = wt(t, lg->output_log, (size_t)nr);
+               bat_iterator_end(&bi);
+       } else if (b->ttype == TYPE_str) {
+               /* efficient string writes */
+               ok = string_writer(lg, b, offset, nr);
        } else {
+               BATiter bi = bat_iterator(b);
                BUN end = (BUN)(offset+nr);
                for (p = (BUN)offset; p < end && ok == GDK_SUCCEED; p++) {
                        const void *t = BUNtail(bi, p);
 
                        ok = wt(t, lg->output_log, 1);
                }
+               bat_iterator_end(&bi);
        }
 
        if (lg->debug & 1)
                fprintf(stderr, "#Logged %d " LLFMT " inserts\n", id, nr);
 
   bailout:
-       bat_iterator_end(&bi);
        if (ok != GDK_SUCCEED) {
                const char *err = mnstr_peek_error(lg->output_log);
                TRC_CRITICAL(GDK, "write failed%s%s\n", err ? ": " : "", err ? 
err : "");
@@ -2498,6 +2568,9 @@ log_delta(logger *lg, BAT *uid, BAT *uva
        if (uval->ttype == TYPE_msk) {
                if (!mnstr_writeIntArray(lg->output_log, vi.base, 
(BUNlast(uval) + 31) / 32))
                        ok = GDK_FAIL;
+       } else if (uval->ttype == TYPE_str) {
+               /* efficient string writes */
+               ok = string_writer(lg, uval, 0, nr);
        } else {
                for (p = 0; p < BUNlast(uid) && ok == GDK_SUCCEED; p++) {
                        const void *val = BUNtail(vi, p);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to