Changeset: 2a307af114a0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2a307af114a0
Modified Files:
        monetdb5/mal/mal_dataflow.c
        monetdb5/mal/mal_instruction.h
        monetdb5/mal/mal_interpreter.c
        monetdb5/mal/mal_recycle.c
        monetdb5/mal/mal_resource.c
        monetdb5/mal/mal_resource.h
Branch: default
Log Message:

Catch timer and update resource management


diffs (137 lines):

diff --git a/monetdb5/mal/mal_dataflow.c b/monetdb5/mal/mal_dataflow.c
--- a/monetdb5/mal/mal_dataflow.c
+++ b/monetdb5/mal/mal_dataflow.c
@@ -255,7 +255,6 @@ DFLOWworker(void *t)
        str error = 0;
 
        int i;
-       lng usec = 0;
 
        thr = THRnew("DFLOWworker");
 
@@ -280,7 +279,6 @@ DFLOWworker(void *t)
                        continue;
                }
 
-               usec = GDKusec();
                /* skip all instructions when we have encontered an error */
                if (flow->error == 0) {
 #ifdef USE_MAL_ADMISSION
@@ -350,7 +348,8 @@ DFLOWworker(void *t)
                        if (todo->last == 0)
                                profilerHeartbeatEvent("wait");
                        else
-                               MALresourceFairness(usec);
+                       if ( flow->cntxt->idx > 1 )
+                                       MALresourceFairness(GDKusec()- 
flow->mb->starttime);
                }
        }
        GDKfree(GDKerrbuf);
diff --git a/monetdb5/mal/mal_instruction.h b/monetdb5/mal/mal_instruction.h
--- a/monetdb5/mal/mal_instruction.h
+++ b/monetdb5/mal/mal_instruction.h
@@ -145,6 +145,7 @@ typedef struct MALBLK {
        lng recid;                                      /* Recycler identifier 
*/
        lng legid;                                      /* Octopus control */
        sht trap;                                       /* call debugger when 
called */
+       lng starttime;                          /* track when the query 
started, for resource management */
        lng runtime;                            /* average execution time of 
block in ticks */
        int calls;                                      /* number of calls */
        lng optimize;                           /* total optimizer time */
diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c
--- a/monetdb5/mal/mal_interpreter.c
+++ b/monetdb5/mal/mal_interpreter.c
@@ -379,9 +379,8 @@ str runMAL(Client cntxt, MalBlkPtr mb, M
                env->cmd = stk->cmd;
        if (!stk->keepAlive && garbageControl(getInstrPtr(mb, 0)))
                garbageCollector(cntxt, mb, stk, env != stk);
-       if (stk && stk != env) {
+       if (stk && stk != env)
                GDKfree(stk);
-       }
        if (cntxt->qtimeout && GDKms() > cntxt->qtimeout)
                throw(MAL, "mal.interpreter", RUNTIME_QRY_TIMEOUT);
        return ret;
@@ -519,6 +518,7 @@ str runMALsequence(Client cntxt, MalBlkP
        if ( startpc == 1 ){
                runtimeProfileInit(cntxt, mb, stk);
                runtimeProfileBegin(cntxt, mb, stk, 0, &runtimeProfileFunction, 
1);
+               mb->starttime = GDKusec();
        } 
        stkpc = startpc;
        exceptionVar = -1;
@@ -545,6 +545,7 @@ str runMALsequence(Client cntxt, MalBlkP
                        }
                }
 
+               //Ensure we spread system resources over multiple users as well.
                runtimeProfileBegin(cntxt, mb, stk, stkpc, &runtimeProfile, 1);
         if (!RECYCLEentry(cntxt, mb, stk, pci,&runtimeProfile)){
                        /* The interpreter loop
@@ -765,9 +766,10 @@ str runMALsequence(Client cntxt, MalBlkP
                                }
 
                                /* If needed recycle intermediate result */
-                               if (pci->recycle > 0) {
+                               if (pci->recycle > 0) 
                                        RECYCLEexit(cntxt, mb, stk, pci, 
&runtimeProfile);
-                               }
+                               if ( cntxt->idx > 1 )
+                                       MALresourceFairness(GDKusec()- 
mb->starttime);
 
                                /* general garbage collection */
                                if (ret == MAL_SUCCEED && garbageControl(pci)) {
diff --git a/monetdb5/mal/mal_recycle.c b/monetdb5/mal/mal_recycle.c
--- a/monetdb5/mal/mal_recycle.c
+++ b/monetdb5/mal/mal_recycle.c
@@ -922,7 +922,7 @@ RECYCLEexitImpl(Client cntxt, MalBlkPtr 
 
        MT_lock_set(&recycleLock, "recycle");
        if ( (GDKmem_cursize() >  MEMORY_THRESHOLD * monet_memory  && 
recyclerMemoryUsed > MEMORY_THRESHOLD * monet_memory) || recycleBlk->stop == 
recycleCacheLimit)
-               RECYCLEcleanCache(cntxt, mb->profiler[0].clk);
+               RECYCLEcleanCache(cntxt, mb->starttime);
 
        if ( RECYCLEinterest(p)){
                /* infinite case, admit all new instructions */
diff --git a/monetdb5/mal/mal_resource.c b/monetdb5/mal/mal_resource.c
--- a/monetdb5/mal/mal_resource.c
+++ b/monetdb5/mal/mal_resource.c
@@ -196,15 +196,12 @@ MALresourceFairness(lng usec)
 #endif
 #endif
 
-       if ( usec > 0 && ( (usec = GDKusec()-usec)) <= TIMESLICE )
-               return;
-       threads = GDKnr_threads > 0 ? GDKnr_threads : 1;
-
        /* use GDKmem_cursize as MT_getrss(); is to expensive */
        rss = GDKmem_cursize();
        /* ample of memory available*/
-       if ( rss < MEMORY_THRESHOLD * monet_memory)
+       if ( rss < MEMORY_THRESHOLD * monet_memory && usec <= TIMESLICE)
                return;
+       threads = GDKnr_threads > 0 ? GDKnr_threads : 1;
 
        /* worker reporting time spent  in usec! */
        clk =  usec / 1000;
@@ -226,7 +223,7 @@ MALresourceFairness(lng usec)
                                }
                                MT_sleep_ms(delay);
                                rss = GDKmem_cursize();
-                       }
+                       } else break;
                        clk -= DELAYUNIT;
                }
                ATOMIC_INC_int(running, runningLock, "MALresourceFairness");
diff --git a/monetdb5/mal/mal_resource.h b/monetdb5/mal/mal_resource.h
--- a/monetdb5/mal/mal_resource.h
+++ b/monetdb5/mal/mal_resource.h
@@ -22,7 +22,7 @@
 
 #include "mal_interpreter.h"
 
-#define TIMESLICE  2000 /* ms */
+#define TIMESLICE  2000000 /* usec */
 #define DELAYUNIT 5 /* ms delay in parallel processing decisions */
 
 #define USE_MAL_ADMISSION
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to