Changeset: a042c361d218 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a042c361d218
Added Files:
monetdb5/optimizer/opt_profiler.c
monetdb5/optimizer/opt_profiler.h
Modified Files:
clients/mapiclient/eventparser.c
clients/mapiclient/tachograph.c
monetdb5/mal/mal_profiler.c
Branch: profiler
Log Message:
Reduce and reshuffle functionality.
Tachograph now only provides progressbar. MAL analysis belongs to profiler
itself.
diffs (truncated from 728 to 300 lines):
diff --git a/clients/mapiclient/eventparser.c b/clients/mapiclient/eventparser.c
--- a/clients/mapiclient/eventparser.c
+++ b/clients/mapiclient/eventparser.c
@@ -225,6 +225,7 @@ resetEventRecord(EventRecord *ev)
if( ev->fcn) free(ev->fcn);
if( ev->numa) free(ev->numa);
memset( (char*) ev, 0, sizeof(EventRecord));
+ clearArguments();
}
/* simple json key:value object parser for event record.
@@ -233,7 +234,7 @@ resetEventRecord(EventRecord *ev)
* Returns 1 if the closing bracket is found. 0 to continue, -1 upon error
*/
#define skipto(C) { while(*c && *c != C) c++; if (*c != C) return -1;}
-#define skipstr() { c= strrchr(c, (int) '"'); if (*c != '"') return -1;}
+#define skipstr() { while (*c && *c !='"') {if (*c =='\\') c++;c++;} if (*c !=
'"') return -1;}
int
keyvalueparser(char *txt, EventRecord *ev)
{
@@ -315,11 +316,12 @@ keyvalueparser(char *txt, EventRecord *e
if( strstr(key,"majflt")) { ev->majflt= atol(val); return 0;}
if( strstr(key,"swaps")) { ev->swaps= atol(val); return 0;}
if( strstr(key,"nvcsw")) { ev->csw= atol(val); return 0;}
- if( strstr(key,"stmt")) { ev->stmt= strdup(val);
+ if( strstr(key,"stmt")) {
+ ev->stmt= strdup(val);
+ ev->fcn = strdup(val);
c = ev->stmt;
- parseArguments((*c ==')'?c++:c),-1);
+ parseArguments((*c =='('?c++:c),-1);
malretc = malargc;
- ev->fcn = strdup(val);
c = strchr(ev->fcn, (int) '(');
if (c) {
parseArguments(c+1,1);
diff --git a/clients/mapiclient/tachograph.c b/clients/mapiclient/tachograph.c
--- a/clients/mapiclient/tachograph.c
+++ b/clients/mapiclient/tachograph.c
@@ -67,13 +67,10 @@
static stream *conn = NULL;
static char hostname[128];
-static char *prefix = "tachograph";
static char *dbname;
-static int beat = 5000;
static int delay = 0; // ms
static Mapi dbh;
static MapiHdl hdl = NULL;
-static int interactive = 1;
static int capturing=0;
static int lastpc;
static int pccount;
@@ -96,61 +93,6 @@ typedef struct {
Source *sources; // original column name
int srctop, srcmax;
-static void
-addSource(char *varname, char *sch, char *tbl, char *col)
-{
- char buf[BUFSIZ];
-
- if(srctop == srcmax){
- if( srcmax == 0)
- sources = (Source *) malloc(2048 * sizeof(Source));
- else
- sources = (Source *) realloc(sources, srcmax+2048);
- srcmax+= 2048;
- }
- assert(sources);
- sources[srctop].varname = strdup(varname);
- snprintf(buf,BUFSIZ,"%s%s%s%s%s", (strcmp(sch,"sys")== 0? "": sch),
(strcmp(sch,"sys")== 0? "": "."), tbl,(col?".":""),col?col:"");
- sources[srctop].source = strdup(buf);
- //fprintf(stderr,"addSource %s at %d %s\n",varname, srctop, buf);
- srctop++;
-}
-
-static void
-addSourcePair(char *varname, char *name)
-{
- int i;
-
- if( name ==0 ) return;
- if( varname ==0 ) return;
-
- if(srctop == srcmax){
- if( srcmax == 0)
- sources = (Source *) malloc(1024 * sizeof(Source));
- else
- sources = (Source *) realloc((void *)sources,
(srcmax+1024) * sizeof(Source));
- srcmax+= 1024;
- }
- for( i=0; i< srctop; i++)
- if( strcmp(name, sources[i].varname)==0){
- sources[srctop].varname = strdup(varname);
- sources[srctop].source = strdup(sources[i].source);
- srctop++;
- return;
- }
-}
-static char *
-fndSource(char *varname)
-{
- int i;
-
- if(debug)
- fprintf(stderr,"fndSource %s\n",varname);
- for( i=0; i< srctop; i++)
- if( strcmp(varname, sources[i].varname)==0)
- return strdup(sources[i].source);
- return strdup(varname);
-}
/*
* Parsing the argument list of a MAL call to obtain un-quoted string values
*/
@@ -163,9 +105,6 @@ usageTachograph(void)
fprintf(stderr, " -u | --user=<user>\n");
fprintf(stderr, " -p | --port=<portnr>\n");
fprintf(stderr, " -h | --host=<hostname>\n");
- fprintf(stderr, " -b | --beat=<delay> in milliseconds (default
5000)\n");
- fprintf(stderr, " -i | --interactive=<o | 1> show trace on stdout\n");
- fprintf(stderr, " -o | --output=<webfile>\n");
fprintf(stderr, " -w | --wait=<delay time> in milliseconds\n");
fprintf(stderr, " -? | --help\n");
exit(-1);
@@ -204,9 +143,6 @@ size_t txtlength=0;
static int querypool = QUERYPOOL;
int queryid= 0;
-static FILE *tachomal;
-static FILE *tachostmt;
-
static void resetTachograph(void){
int i;
if (debug)
@@ -229,10 +165,6 @@ static void resetTachograph(void){
starttime = 0;
finishtime = 0;
duration =0;
- fclose(tachomal);
- tachomal = 0;
- fclose(tachostmt);
- tachostmt = 0;
prevprogress = 0;
txtlength =0;
prevlevel=0;
@@ -265,191 +197,12 @@ rendertime(lng ticks, int flg)
#define MSGLEN 100
-/*
- * Render the output of the stethoscope into a more user-friendly format.
- * This involves removal of MAL variables and possibly renaming the MAL
functions
- * by more general alternatives.
- * If mode is set then we go for a minimal base-table related display
- */
-static struct{
- char *name;
- int length;
- char *alias;
- int newl;
- int mode;
-}mapping[]={
- {"algebra.leftfetchjoinPath", 25, "join",4, 0},
- {"algebra.thetasubselect", 22, "select",6, 0},
- {"algebra.leftfetchjoin", 21, "join",4, 0},
- {"dataflow.language", 17, "parallel", 8, 0},
- {"algebra.subselect", 17, "select",6, 0},
- {"sql.projectdelta", 16, "project",7, 0},
- {"algebra.subjoin", 15, "join",4, 0},
- {"language.pass(nil)", 18, "release", 7, 0},
- {"mat.packIncrement", 17, "pack",4, 0},
- {"language.pass", 13, "release", 7, 0},
- {"aggr.subcount", 13, "count", 5, 0},
- {"sql.subdelta", 12, "project",7, 0},
- {"bat.append", 10, "append", 6, 0},
- {"aggr.subavg", 11, "average", 7, 0},
- {"aggr.subsum", 11, "sum", 3, 0},
- {"aggr.submin", 11, "minimum", 7, 0},
- {"aggr.submax", 11, "maximum", 7, 0},
- {"aggr.count", 10, "count", 5, 0},
- {"calc.lng", 8, "long", 4, 0},
- {"sql.bind", 8, "bind", 4, 0},
- {"batcalc.hge", 11, "hugeint", 7, 0},
- {"batcalc.dbl", 11, "real", 4, 0},
- {"batcalc.flt", 11, "real", 4, 0},
- {"batcalc.lng", 11, "bigint",6, 0},
- {"batcalc.", 8, "", 0, 0},
- {"calc.", 5, "", 0, 0},
- {"sql.", 4, "", 0, 0},
- {"bat.", 4, "", 0, 0},
- {"aggr.", 5, "", 0, 0},
- {"group.sub", 9, "", 0, 0},
- {"group.", 6, "", 0, 0},
- {"mtime.", 6, "", 0, 0},
- {0,0,0,0,0}};
-
-static void
-renderArgs(char *c, char *l, size_t len)
-{
- char varname[BUFSIZ]={0}, *v=0;
- char *limit = l + len-1;
- int i;
-
- // we always start at a parameter list
- for(; *c && *c !=')' && l < limit; ){
- varname[0] = 0;
- if( *c == ',')*l++ = *c++;
- // take out the variable name
- if(isalpha((int)*c) || *c == '_' ){
- for( i = 0; i < BUFSIZ-1 && *c && (isalnum((int)*c) ||
*c=='_') ; i++)
- varname[i] = *c++;
- varname[i]=0;
- }
- // handle value part
- if( *c == '=') c++;
- // BAT result
- if( *c == '<'){
- while(*c && *c !='>') c++;
- if(*c) c++;
- if (varname[0]){
- v= fndSource(varname);
- l+= snprintf(l, limit - l-2,"%s",v);
- free(v);
- }
- // copy the count
- while(*c && *c !=']' && l < limit -2) *l++ = *c++;
- while(*c && *c != ']') c++;
- if( *c == ']' ) *l++ = *c++;
- while(*c && *c != ':') c++;
- } else
- // string constant
- if (*c == '"' ) {
- *l++ = *c++;
- while(*c && *c !='"' && *(c-1) !='\\' && l < limit-2 )
*l++ =*c++;
- while(*c && *c !='"') c++;
- } else{
- // all else
- while(*c && *c !=':' && *c !=',' && l < limit-2) *l++ =
*c++;
- while(*c && *c !=':' && *c !=',' ) c++;
- }
- // skip type descriptor
- if (*c == ':'){
- if( strncmp(c,":bat",4)== 0){
- while(*c && *c !=']') c++;
- if( *c == ']') c++;
- }
- while(*c && *c != ',' && *c != '{' && *c != ')') c++;
- }
-
- // copy the literals
- if( strcmp(varname,"nil") == 0 || strcmp(varname,"true")==0 ||
strcmp(varname,"false")==0)
- for(v = varname; *v; ) *l++ = *v++;
- // drop the properties
- if( *c == '{'){
- while(*c && *c !='}') c++;
- if(*c) c++;
- }
- }
- if(*c) *l++ = *c;
- *l=0;
-}
-
-static void
-renderCall(char *line, int len, char *stmt, int state, int mode)
-{
- char *limit= line + len, *l = line, *c = stmt, *s;
- int i;
-
- (void) state;
- // skip MAL keywords
- if( strncmp(c,"function ",10) == 0 ) {
- while( *c && l < limit -1) *l++ = *c++;
- *l = 0;
- return;
- }
- if( strncmp(c,"end ",4) == 0 ) {
- while( *c && l < limit -1) *l++ = *c++;
- *l = 0;
- return;
- }
- if( strncmp(c,"barrier ",8) == 0 ) c +=8;
- if( strncmp(c,"redo ",5) == 0 ) c +=5;
- if( strncmp(c,"leave ",6) == 0 ) c +=6;
- if( strncmp(c,"return ",7) == 0 ) c +=7;
- if( strncmp(c,"yield ",6) == 0 ) c +=6;
- if( strncmp(c,"catch ",6) == 0 ) c +=6;
- if( strncmp(c,"raise ",6) == 0 ) c +=6;
- stmt = c;
- // look for assignment
- c = strstr(c," :=");
- if( c) {
- if(state){
- // for finished instructions show the result targets too
- *c =0;
- s = stmt;
- while(*s && isspace((int) *s)) s++;
- if( *s == '(') *l++ = *s++;
- renderArgs(s, l, limit - l);
- while(*l) l++;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list