Changeset: 6d53fa36fd1d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6d53fa36fd1d
Modified Files:
        gdk/gdk_logger.c
        monetdb5/optimizer/opt_dataflow.c
        monetdb5/optimizer/opt_reorder.c
Branch: Jul2021
Log Message:

use smaller chunks (if possible without additional malloc/frees) too write/read 
strings in the logger
cleanup some comments in dataflow/reorder


diffs (180 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -335,26 +335,28 @@ string_reader(logger *lg, BAT *b, lng nr
        lng SZ = 0;
        log_return res = LOG_OK;
 
-       if (mnstr_readLng(lg->input_log, &SZ) != 1)
-               return LOG_EOF;
-       sz = (size_t)SZ;
-       char *buf = GDKmalloc(sz);
+       for (; nr && res == LOG_OK; ) {
+               if (mnstr_readLng(lg->input_log, &SZ) != 1)
+                       return LOG_EOF;
+               sz = (size_t)SZ;
+               char *buf = lg->buf;
+               if (lg->bufsize < sz) {
+                       lg->buf = buf = GDKrealloc(buf, sz);
+                       lg->bufsize = sz;
+               }
 
-       if (!buf || mnstr_read(lg->input_log, buf, sz, 1) != 1) {
-               GDKfree(buf);
-               return LOG_EOF;
-       }
-       /* handle strings */
-       if (b) {
+               if (!buf || mnstr_read(lg->input_log, buf, sz, 1) != 1)
+                       return LOG_EOF;
+               /* handle strings */
                char *t = buf;
                /* chunked */
 #define CHUNK_SIZE 1024
                char *strings[CHUNK_SIZE];
                int cur = 0;
 
-               for(int i=0; i<nr && res == LOG_OK; i++) {
+               for(; nr>0 && res == LOG_OK && t < (buf+sz); nr--) {
                        strings[cur++] = t;
-                       if (cur == CHUNK_SIZE && BUNappendmulti(b, strings, 
cur, true) != GDK_SUCCEED)
+                       if (cur == CHUNK_SIZE && b && BUNappendmulti(b, 
strings, cur, true) != GDK_SUCCEED)
                                res = LOG_ERR;
                        if (cur == CHUNK_SIZE)
                                cur = 0;
@@ -363,10 +365,9 @@ string_reader(logger *lg, BAT *b, lng nr
                                t++;
                        t++;
                }
-               if (cur && BUNappendmulti(b, strings, cur, true) != GDK_SUCCEED)
+               if (cur && b && BUNappendmulti(b, strings, cur, true) != 
GDK_SUCCEED)
                        res = LOG_ERR;
        }
-       GDKfree(buf);
        return res;
 }
 
@@ -2357,27 +2358,43 @@ log_constant(logger *lg, int type, ptr v
 static gdk_return
 string_writer(logger *lg, BAT *b, lng offset, lng nr)
 {
-       size_t sz = 0;
+       size_t bufsz = lg->bufsize, resize = 0;
        BUN end = (BUN)(offset + nr);
+       char *buf = lg->buf;
+       gdk_return res = GDK_FAIL;
 
+       if (!buf)
+               return GDK_FAIL;
        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++) {
+       BUN p = (BUN)offset;
+       for ( ; p < end; ) {
+               size_t sz = 0;
+               if (resize) {
+                       lg->buf = buf = GDKrealloc(buf, resize);
+                       if (!buf) {
+                               res = GDK_FAIL;
+                               break;
+                       }
+                       lg->bufsize = bufsz = resize;
+                       resize = 0;
+               }
+               char *dst = buf;
+               for(; p < end && sz < bufsz; p++) {
                        char *s = BUNtail(bi, p);
                        size_t len = strlen(s)+1;
-                       memcpy(dst, s, len);
-                       dst += len;
+                       if ((sz+len) > bufsz) {
+                               if (len > bufsz)
+                                       resize = len+bufsz;
+                               break;
+                       } else {
+                               memcpy(dst, s, len);
+                               dst += len;
+                               sz += len;
+                       }
                }
+               if (sz && buf && mnstr_writeLng(lg->output_log, (lng) sz) && 
mnstr_write(lg->output_log, buf, sz, 1) == 1)
+                       res = GDK_SUCCEED;
        }
-       gdk_return res = GDK_FAIL;
-       if (buf && mnstr_writeLng(lg->output_log, (lng) sz) && 
mnstr_write(lg->output_log, buf, sz, 1) == 1)
-               res = GDK_SUCCEED;
-       GDKfree(buf);
        bat_iterator_end(&bi);
        return res;
 }
diff --git a/monetdb5/optimizer/opt_dataflow.c 
b/monetdb5/optimizer/opt_dataflow.c
--- a/monetdb5/optimizer/opt_dataflow.c
+++ b/monetdb5/optimizer/opt_dataflow.c
@@ -205,20 +205,21 @@ isSqlAppendUpdate(MalBlkPtr mb, InstrPtr
                return false;
 
        // pattern("sql", "append", mvc_append_wrap, false, "...", args(1,8, 
arg("",int),
-       //              arg("mvc",int
-       //              arg("sname",str
-       //              arg("tname",str
-       //              arg("cname",str
-       //              arg("offset",lng
+       //              arg("mvc",int),
+       //              arg("sname",str),
+       //              arg("tname",str),
+       //              arg("cname",str),
+       //              arg("offset",lng),
+       //              batarg("pos",oid),
        //              argany("ins",0))),
 
-       // pattern("sql", "update", mvc_update_wrap, false, "...", args(1,7, 
arg("",int
+       // pattern("sql", "update", mvc_update_wrap, false, "...", args(1,7, 
arg("",int),
        //              arg("mvc",int),
-       //              arg("sname",str
-       //              arg("tname",str
-       //              arg("cname",str
-       //              argany("rids",0
-       //              argany("upd",0))
+       //              arg("sname",str),
+       //              arg("tname",str),
+       //              arg("cname",str),
+       //              argany("rids",0),
+       //              argany("upd",0)))
 
        if ((p->fcnname == appendRef && p->argc != 8) || (p->fcnname == 
updateRef && p->argc != 7))
                return false;
diff --git a/monetdb5/optimizer/opt_reorder.c b/monetdb5/optimizer/opt_reorder.c
--- a/monetdb5/optimizer/opt_reorder.c
+++ b/monetdb5/optimizer/opt_reorder.c
@@ -53,7 +53,7 @@
  * for a linear plan. Future extensions could consider
  * re-ordering basic blocks only.
  *
- * For this purpose this optimizer should be run before 
+ * For this purpose this optimizer should be run before
  * the dataflow optimizer, because it adds barriers.
  */
 typedef struct{
@@ -111,7 +111,7 @@ OPTdependencies(Client cntxt, MalBlkPtr 
                        list[i]->stmt[j] = var[getArg(p,j)];
                        list[var[getArg(p,j)]]->used++;
                }
-               /* keep the assignment order 
+               /* keep the assignment order
                 * Duplicate assignment of a variable is not wanted
                 * but can not be avoided when loops are involved
                 * In this case we bail out*/
@@ -217,7 +217,7 @@ OPTbreadthfirst(Client cntxt, MalBlkPtr 
 }
 
 /* SQL appends are collected to create a better dataflow block */
-/* alternatively, we should postpone all mcv-chained actions */
+/* alternatively, we should postpone all mvc-chained actions */
 static int
 OPTpostponeAppends(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p)
 {
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to