Changeset: 64db91f17817 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/64db91f17817
Modified Files:
        monetdb5/mal/mal_profiler.c
Branch: Oct2020
Log Message:

Merge with Jun2020 branch.


diffs (298 lines):

diff --git a/monetdb5/mal/mal_profiler.c b/monetdb5/mal/mal_profiler.c
--- a/monetdb5/mal/mal_profiler.c
+++ b/monetdb5/mal/mal_profiler.c
@@ -31,17 +31,18 @@
 
 #include <string.h>
 
-static str myname = 0; // avoid tracing the profiler module
+static const char *myname = 0; // avoid tracing the profiler module
 
 /* The JSON rendering can be either using '\n' separators between
  * each key:value pair or as a single line.
  * The current stethoscope implementation requires the first option and
- * also the term rendering  to be set to ''
+ * also the term rendering to be set to ''
  */
 
 /* When the MAL block contains a BARRIER block we may end up with tons
  * of profiler events. To avoid this, we stop emitting the events
- * when we reached the HIGHWATERMARK. Leaving a message in the log. */
+ * when we reached the HIGHWATERMARK. Leaving a message in the log.
+ */
 #define HIGHWATERMARK 5
 
 
@@ -60,18 +61,17 @@ static struct rusage prevUsage;
 #define LOGLEN 8192
 
 // The heart beat events should be sent to all outstanding channels.
-static void logjsonInternal(char *logbuffer)
+static void logjsonInternal(char *logbuffer, bool flush)
 {
        size_t len;
        len = strlen(logbuffer);
 
-       MT_lock_set(&mal_profileLock);
        if (maleventstream) {
-       // upon request the log record is sent over the profile stream
+               // upon request the log record is sent over the profile stream
                (void) mnstr_write(maleventstream, logbuffer, 1, len);
-               (void) mnstr_flush(maleventstream, MNSTR_FLUSH_DATA);
+               if (flush)
+                       (void) mnstr_flush(maleventstream, MNSTR_FLUSH_DATA);
        }
-       MT_lock_unset(&mal_profileLock);
 }
 
 /*
@@ -141,7 +141,7 @@ logadd(struct logbuf *logbuf, const char
                        /* includes first time when logbuffer == NULL and 
logcap = 0 */
                        char *alloc_buff;
                        if (logbuf->loglen > 0)
-                               logjsonInternal(logbuf->logbuffer);
+                               logjsonInternal(logbuf->logbuffer, false);
                        logbuf->logcap = (size_t) tmp_len + (size_t) tmp_len/2;
                        if (logbuf->logcap < LOGLEN)
                                logbuf->logcap = LOGLEN;
@@ -156,7 +156,7 @@ logadd(struct logbuf *logbuf, const char
                        logbuf->logbuffer = alloc_buff;
                        lognew(logbuf);
                } else {
-                       logjsonInternal(logbuf->logbuffer);
+                       logjsonInternal(logbuf->logbuffer, false);
                        lognew(logbuf);
                }
        }
@@ -170,20 +170,20 @@ logadd(struct logbuf *logbuf, const char
 
 /* JSON rendering method of performance data.
  * The eventparser may assume this layout for ease of parsing
-EXAMPLE:
-{
-"event":6        ,
-"thread":3,
-"function":"user.s3_1",
-"pc":1,
-"tag":10397,
-"state":"start",
-"usec":0,
-}
-"stmt":"X_41=0@0:void := querylog.define(\"select count(*) from 
tables;\":str,\"default_pipe\":str,30:int);",
+ EXAMPLE:
+ {
+ "event":6        ,
+ "thread":3,
+ "function":"user.s3_1",
+ "pc":1,
+ "tag":10397,
+ "state":"start",
+ "usec":0,
+ }
+ "stmt":"X_41=0@0:void := querylog.define(\"select count(*) from 
tables;\":str,\"default_pipe\":str,30:int);",
 */
 static void
-renderProfilerEvent(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, 
int start)
+prepareProfilerEvent(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, 
int start)
 {
        struct logbuf logbuf;
        str c;
@@ -202,9 +202,9 @@ renderProfilerEvent(Client cntxt, MalBlk
                return;
        }
 
-/* The stream of events can be complete read by the DBA,
- * all other users can only see events assigned to their account
- */
+       /* The stream of events can be complete read by the DBA,
+        * all other users can only see events assigned to their account
+        */
        if(malprofileruser!= MAL_ADMIN && malprofileruser != cntxt->user)
                return;
 
@@ -303,7 +303,7 @@ renderProfilerEvent(Client cntxt, MalBlk
                        c =getVarName(mb, getArg(pci,j));
                        if(getVarSTC(mb,getArg(pci,j))){
                                InstrPtr stc = getInstrPtr(mb, 
getVarSTC(mb,getArg(pci,j)));
-                               if (stc &&
+                               if (stc && getModuleId(stc) &&
                                        strcmp(getModuleId(stc),"sql") ==0 &&
                                        strncmp(getFunctionId(stc),"bind",4)==0 
&&
                                        !logadd(&logbuf, 
",\"alias\":\"%s.%s.%s\"",
@@ -317,13 +317,16 @@ renderProfilerEvent(Client cntxt, MalBlk
                                tname = getTypeName(getBatType(tpe));
                                ok = logadd(&logbuf, ",\"type\":\"bat[:%s]\"", 
tname);
                                GDKfree(tname);
-                               if (!ok)
+                               if (!ok) {
+                                       if (d)
+                                               BBPunfix(d->batCacheid);
                                        return;
+                               }
                                if(d) {
                                        BAT *v;
                                        cnt = BATcount(d);
                                        if(isVIEW(d)){
-                                               v= BBPquickdesc(VIEWtparent(d), 
false);
+                                               v= BBP_cache(VIEWtparent(d));
                                                if (!logadd(&logbuf,
                                                                        
",\"view\":\"true\""
                                                                        
",\"parent\":%d"
@@ -331,11 +334,15 @@ renderProfilerEvent(Client cntxt, MalBlk
                                                                        
",\"mode\":\"%s\"",
                                                                        
VIEWtparent(d),
                                                                        
d->hseqbase,
-                                                                       v && 
!v->batTransient ? "persistent" : "transient"))
+                                                                       v && 
!v->batTransient ? "persistent" : "transient")) {
+                                                       BBPunfix(d->batCacheid);
                                                        return;
+                                               }
                                        } else {
-                                               if (!logadd(&logbuf, 
",\"mode\":\"%s\"", (d->batTransient ? "transient" : "persistent")))
+                                               if (!logadd(&logbuf, 
",\"mode\":\"%s\"", (d->batTransient ? "transient" : "persistent"))) {
+                                                       BBPunfix(d->batCacheid);
                                                        return;
+                                               }
                                        }
                                        if (!logadd(&logbuf,
                                                                ",\"sorted\":%d"
@@ -347,26 +354,38 @@ renderProfilerEvent(Client cntxt, MalBlk
                                                                d->trevsorted,
                                                                d->tnonil,
                                                                d->tnil,
-                                                               d->tkey))
+                                                               d->tkey)) {
+                                               BBPunfix(d->batCacheid);
                                                return;
+                                       }
                                        cv = 
VALformat(&stk->stk[getArg(pci,j)]);
                                        c = strchr(cv, '>');
                                        if (c)          /* unlikely that this 
isn't true */
                                                *c = 0;
                                        ok = logadd(&logbuf, 
",\"file\":\"%s\"", cv + 1);
                                        GDKfree(cv);
-                                       if (!ok)
+                                       if (!ok) {
+                                               BBPunfix(d->batCacheid);
                                                return;
-                                       total += cnt * d->twidth;
-                                       if (!logadd(&logbuf, ",\"width\":%d", 
d->twidth))
+                                       }
+                                       total += cnt << d->tshift;
+                                       if (!logadd(&logbuf, ",\"width\":%d", 
d->twidth)) {
+                                               BBPunfix(d->batCacheid);
                                                return;
+                                       }
                                        /* keeping information about the 
individual auxiliary heaps is helpful during analysis. */
-                                       if( d->thash && !logadd(&logbuf, 
",\"hash\":" LLFMT, (lng) hashinfo(d->thash, d->batCacheid)))
+                                       if( d->thash && !logadd(&logbuf, 
",\"hash\":" LLFMT, (lng) hashinfo(d->thash, d->batCacheid))) {
+                                               BBPunfix(d->batCacheid);
                                                return;
-                                       if( d->tvheap && !logadd(&logbuf, 
",\"vheap\":" LLFMT, (lng) heapinfo(d->tvheap, d->batCacheid)))
+                                       }
+                                       if( d->tvheap && !logadd(&logbuf, 
",\"vheap\":" LLFMT, (lng) heapinfo(d->tvheap, d->batCacheid))) {
+                                               BBPunfix(d->batCacheid);
                                                return;
-                                       if( d->timprints && !logadd(&logbuf, 
",\"imprints\":" LLFMT, (lng) IMPSimprintsize(d)))
+                                       }
+                                       if( d->timprints && !logadd(&logbuf, 
",\"imprints\":" LLFMT, (lng) IMPSimprintsize(d))) {
+                                               BBPunfix(d->batCacheid);
                                                return;
+                                       }
                                        /* if (!logadd(&logbuf, 
"\"debug\":\"%s\",", d->debugmessages)) return; */
                                        BBPunfix(d->batCacheid);
                                }
@@ -407,10 +426,18 @@ renderProfilerEvent(Client cntxt, MalBlk
        }
        if (!logadd(&logbuf, "}\n")) // end marker
                return;
-       logjsonInternal(logbuf.logbuffer);
+       logjsonInternal(logbuf.logbuffer, true);
        logdel(&logbuf);
 }
 
+static void
+renderProfilerEvent(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, 
int start)
+{
+       MT_lock_set(&mal_profileLock);
+       prepareProfilerEvent(cntxt, mb, stk, pci, start);
+       MT_lock_unset(&mal_profileLock);
+}
+
 /* the OS details on cpu load are read from /proc/stat
  * We should use an OS define to react to the maximal cores
  */
@@ -509,7 +536,7 @@ profilerHeartbeatEvent(char *alter)
 
        if (!logadd(&logbuf, "{"))      // fill in later with the event counter
                return;
-       if (!GDKinmemory() && !GDKembedded()) {
+       if (!GDKinmemory()) {
                char *uuid = NULL, *err;
                if ((err = msab_getUUID(&uuid)) == NULL) {
                        bool ok = logadd(&logbuf, "\"session\":\"%s\",", uuid);
@@ -544,7 +571,7 @@ profilerHeartbeatEvent(char *alter)
                                "}\n",                  // end marker
                                alter, cpuload))
                return;
-       logjsonInternal(logbuf.logbuffer);
+       logjsonInternal(logbuf.logbuffer, true);
        logdel(&logbuf);
 }
 
@@ -577,16 +604,19 @@ openProfilerStream(Client cntxt)
        getrusage(RUSAGE_SELF, &infoUsage);
        prevUsage = infoUsage;
 #endif
+       MT_lock_set(&mal_profileLock);
        if (myname == 0){
                myname = putName("profiler");
-               logjsonInternal(monet_characteristics);
+               logjsonInternal(monet_characteristics, true);
        }
        if(maleventstream){
                /* The DBA can always grab the stream, others have to wait */
-               if (cntxt->user == MAL_ADMIN)
+               if (cntxt->user == MAL_ADMIN) {
                        closeProfilerStream(cntxt);
-               else
+               } else {
+                       MT_lock_unset(&mal_profileLock);
                        throw(MAL,"profiler.start","Profiler already running, 
stream not available");
+               }
        }
        malProfileMode = -1;
        maleventstream = cntxt->fdout;
@@ -598,10 +628,11 @@ openProfilerStream(Client cntxt)
        /* this code is not thread safe, because the inprogress administration 
may change concurrently */
        MT_lock_set(&mal_delayLock);
        for(j = 0; j <THREADS; j++)
-       if(workingset[j].mb)
-               /* show the event */
-               profilerEvent(workingset[j].cntxt, workingset[j].mb, 
workingset[j].stk, workingset[j].pci, 1);
+               if(workingset[j].mb)
+                       /* show the event */
+                       profilerEvent(workingset[j].cntxt, workingset[j].mb, 
workingset[j].stk, workingset[j].pci, 1);
        MT_lock_unset(&mal_delayLock);
+       MT_lock_unset(&mal_profileLock);
        return MAL_SUCCEED;
 }
 
@@ -635,8 +666,8 @@ startProfiler(Client cntxt)
                myname = putName("profiler");
        }
        malProfileMode = 1;
+       logjsonInternal(monet_characteristics, true);
        MT_lock_unset(&mal_profileLock);
-       logjsonInternal(monet_characteristics);
        // reset the trace table
        clearTrace(cntxt);
 
@@ -795,6 +826,7 @@ sqlProfilerEvent(Client cntxt, MalBlkPtr
        MT_lock_set(&mal_profileLock);
        if (cntxt->profticks == NULL) {
                MT_lock_unset(&mal_profileLock);
+               GDKfree(stmt);
                return;
        }
        errors += BUNappend(cntxt->profticks, &pci->ticks, false) != 
GDK_SUCCEED;
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to