Changeset: 3396814abd0e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3396814abd0e
Branch: transaction_layer_revamp
Log Message:

merge with default


diffs (truncated from 315 to 300 lines):

diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -270,6 +270,7 @@ MCinitClientRecord(Client c, oid user, b
        c->qryctx.starttime = 0;
        ATOMIC_SET(&c->qryctx.datasize, 0);
        c->qryctx.maxmem = 0;
+       c->maxmem = 0;
        c->itrace = 0;
        c->errbuf = 0;
 
@@ -372,6 +373,7 @@ MCinitClientThread(Client c)
 Client
 MCforkClient(Client father)
 {
+       /* TO BE REMOVED: this function is not used anywhere */
        Client son = NULL;
        str prompt;
 
@@ -395,6 +397,7 @@ MCforkClient(Client father)
                son->memorylimit = father->memorylimit;
                son->qryctx.querytimeout = father->qryctx.querytimeout;
                son->qryctx.maxmem = father->qryctx.maxmem;
+               son->maxmem = father->maxmem;
                son->sessiontimeout = father->sessiontimeout;
 
                if (son->prompt)
@@ -571,27 +574,10 @@ MCactiveClients(void)
 size_t
 MCmemoryClaim(void)
 {
-       size_t claim = 0;
-       int active = 1;
-
-       Client cntxt = mal_clients;
-
-       MT_lock_set(&mal_contextLock);
-       for(cntxt = mal_clients;  cntxt<mal_clients+MAL_MAXCLIENTS; cntxt++) {
-               if( cntxt->idle == 0 && cntxt->mode == RUNCLIENT){
-                       if(cntxt->memorylimit){
-                               claim += cntxt->memorylimit;
-                               active ++;
-                       } else {
-                               MT_lock_unset(&mal_contextLock);
-                               return GDK_mem_maxsize;
-                       }
-               }
-       }
-       MT_lock_unset(&mal_contextLock);
-       if(active == 0 ||  claim  * LL_CONSTANT(1048576) >= GDK_mem_maxsize)
-               return GDK_mem_maxsize;
-       return claim * LL_CONSTANT(1048576);
+       /* TO BE REMOVED */
+       /* this function used to be more complex, but in the end it always
+        * returned GDK_mem_maxsize, so that's what we do now */
+       return GDK_mem_maxsize;
 }
 
 str
diff --git a/monetdb5/mal/mal_client.h b/monetdb5/mal/mal_client.h
--- a/monetdb5/mal/mal_client.h
+++ b/monetdb5/mal/mal_client.h
@@ -69,6 +69,7 @@ typedef struct CLIENT {
        char    optimizer[IDLENGTH];/* The optimizer pipe preferred for this 
session */
        int     workerlimit;            /* maximum number of workthreads 
processing a query */
        int             memorylimit;            /* Memory claim highwater mark, 
0 = no limit */
+       lng maxmem;                                     /* maximum memory from 
db_user_info table */
        lng         sessiontimeout;             /* session abort after x usec, 
0 = no limit */
        QryCtx  qryctx;                         /* per query limitations */
 
diff --git a/monetdb5/modules/mal/clients.c b/monetdb5/modules/mal/clients.c
--- a/monetdb5/modules/mal/clients.c
+++ b/monetdb5/modules/mal/clients.c
@@ -334,14 +334,18 @@ CLTsetmemorylimit(Client cntxt, MalBlkPt
                throw(MAL, "clients.setmemorylimit", "The memmory limit cannot 
be NULL");
        if( limit < 0)
                throw(MAL, "clients.setmemorylimit", "The memmory limit cannot 
be negative");
-       if( (size_t) limit > GDK_mem_maxsize / 1048576)
-               throw(MAL,"clients.setmemorylimit","Memory claim beyond 
physical memory");
 
        MT_lock_set(&mal_contextLock);
        if (mal_clients[idx].mode == FREECLIENT)
                msg = createException(MAL,"clients.setmemorylimit","Session not 
active anymore");
-       else
+       else if (cntxt->user != MAL_ADMIN &&
+                        mal_clients[idx].maxmem > 0 &&
+                        mal_clients[idx].maxmem < (lng) limit << 20)
+               msg = createException(MAL, "clients.setmemorylimit","Cannot 
increase memory limit");
+       else {
                mal_clients[idx].memorylimit = limit;
+               mal_clients[idx].qryctx.maxmem = (ATOMIC_BASE_TYPE) limit << 20;
+       }
        MT_lock_unset(&mal_contextLock);
        return msg;
 }
diff --git a/monetdb5/optimizer/opt_mergetable.c 
b/monetdb5/optimizer/opt_mergetable.c
--- a/monetdb5/optimizer/opt_mergetable.c
+++ b/monetdb5/optimizer/opt_mergetable.c
@@ -430,7 +430,8 @@ mat_apply1(MalBlkPtr mb, InstrPtr p, mat
                is_assign = (n >= 0);
        }
 
-       if((r = newInstructionArgs(mb, matRef, packRef, mat[m].mi->argc)) == 
NULL)
+       if(m < 0 ||
+          (r = newInstructionArgs(mb, matRef, packRef, mat[m].mi->argc)) == 
NULL)
                return -1;
        getArg(r, 0) = getArg(p,0);
        tpe = getArgType(mb,p,0);
@@ -501,6 +502,7 @@ mat_apply(MalBlkPtr mb, InstrPtr p, matl
                return mat_apply1(mb, p, ml, is_a_mat(getArg(p,1),ml), 1);
        assert(nrmats <= 8);
 
+       assert(p->retc < p->argc);      /* i.e. matvar[0] gets initialized */
        for(k=p->retc, l=0; k < p->argc; k++) {
                int mv = is_a_mat(getArg(p,k), ml);
                if (mv >=0) {
diff --git a/monetdb5/optimizer/opt_mitosis.c b/monetdb5/optimizer/opt_mitosis.c
--- a/monetdb5/optimizer/opt_mitosis.c
+++ b/monetdb5/optimizer/opt_mitosis.c
@@ -25,7 +25,7 @@ OPTmitosisImplementation(Client cntxt, M
        str schema = 0, table = 0;
        BUN r = 0, rowcnt = 0;  /* table should be sizeable to consider 
parallel execution*/
        InstrPtr p, q, *old, target = 0;
-       size_t argsize = 6 * sizeof(lng), m = 0, memclaim;
+       size_t argsize = 6 * sizeof(lng), m = 0;
        /*       estimate size per operator estimate:   4 args + 2 res*/
        int threads = GDKnr_threads ? GDKnr_threads : 1, maxparts = MAXSLICES;
        str msg = MAL_SUCCEED;
@@ -156,56 +156,44 @@ OPTmitosisImplementation(Client cntxt, M
        cntxt->idle = 0; // this one is definitely not idle
        MT_lock_unset(&mal_contextLock);
 
-/* This code was used to experiment with block sizes, mis-using the 
memorylimit  variable
-       if (cntxt->memorylimit){
-               // the new mitosis scheme uses a maximum chunck size in MB from 
the client context
-               m = (((size_t) cntxt->memorylimit) * 1048576) / (size_t) 
row_size;
-               pieces = (int) (rowcnt / m + (rowcnt - m * pieces > 0));
-       }
-       if (cntxt->memorylimit == 0 || pieces <= 1){
-*/
-       if (pieces <= 1){
-               /* improve memory usage estimation */
-               if (nr_cols > 1 || nr_aggrs > 1 || nr_maps > 1)
-                       argsize = (nr_cols + nr_aggrs + nr_maps) * sizeof(lng);
-               /* We haven't assigned the number of pieces.
-                * Determine the memory available for this client
-                */
+       /* improve memory usage estimation */
+       if (nr_cols > 1 || nr_aggrs > 1 || nr_maps > 1)
+               argsize = (nr_cols + nr_aggrs + nr_maps) * sizeof(lng);
+       /* We haven't assigned the number of pieces.
+        * Determine the memory available for this client
+        */
+
+       /* respect the memory limit size set for the user
+       * and determine the column part size
+       */
+       m = GDK_mem_maxsize / MCactiveClients(); /* use temporarily */
+       if (cntxt->memorylimit > 0 && (size_t) cntxt->memorylimit << 20 < m)
+               m = ((size_t) cntxt->memorylimit << 20) / argsize;
+       else if (cntxt->maxmem > 0 && cntxt->maxmem < (lng) m)
+               m = (size_t) (cntxt->maxmem / argsize);
+       else
+               m = m / argsize;
 
-               /* respect the memory limit size set for the user
-               * and determine the column part size
-               */
-               if( cntxt->memorylimit)
-                       m = (((size_t) cntxt->memorylimit) * 1048576) / argsize;
-               else {
-                       memclaim= MCmemoryClaim();
-                       if(memclaim == GDK_mem_maxsize){
-                               m = GDK_mem_maxsize / (size_t) 
MCactiveClients()  / argsize;
-                       } else
-                               m = (GDK_mem_maxsize - memclaim) / argsize;
-               }
-
-               /* if data exceeds memory size,
-                * i.e., (rowcnt*argsize > GDK_mem_maxsize),
-                * i.e., (rowcnt > GDK_mem_maxsize/argsize = m) */
-               if (rowcnt > m && m / threads > 0) {
-                       /* create |pieces| > |threads| partitions such that
-                        * |threads| partitions at a time fit in memory,
-                        * i.e., (threads*(rowcnt/pieces) <= m),
-                        * i.e., (rowcnt/pieces <= m/threads),
-                        * i.e., (pieces => rowcnt/(m/threads))
-                        * (assuming that (m > threads*MIN_PART_SIZE)) */
-                       /* the number of pieces affects SF-100, going beyond 8x 
increases
-                        * the optimizer costs beyond the execution time
-                        */
-                       pieces = ((int) ceil((double)rowcnt / (m / threads)));
-                       if (pieces <= threads)
-                               pieces = threads;
-               } else if (rowcnt > MIN_PART_SIZE) {
-               /* exploit parallelism, but ensure minimal partition size to
-                * limit overhead */
-                       pieces = MIN((int) ceil((double)rowcnt / 
MIN_PART_SIZE), MAX_PARTS2THREADS_RATIO * threads);
-               }
+       /* if data exceeds memory size,
+        * i.e., (rowcnt*argsize > GDK_mem_maxsize),
+        * i.e., (rowcnt > GDK_mem_maxsize/argsize = m) */
+       if (rowcnt > m && m / threads > 0) {
+               /* create |pieces| > |threads| partitions such that
+                * |threads| partitions at a time fit in memory,
+                * i.e., (threads*(rowcnt/pieces) <= m),
+                * i.e., (rowcnt/pieces <= m/threads),
+                * i.e., (pieces => rowcnt/(m/threads))
+                * (assuming that (m > threads*MIN_PART_SIZE)) */
+               /* the number of pieces affects SF-100, going beyond 8x 
increases
+                * the optimizer costs beyond the execution time
+                */
+               pieces = ((int) ceil((double)rowcnt / (m / threads)));
+               if (pieces <= threads)
+                       pieces = threads;
+       } else if (rowcnt > MIN_PART_SIZE) {
+       /* exploit parallelism, but ensure minimal partition size to
+        * limit overhead */
+               pieces = MIN((int) ceil((double)rowcnt / MIN_PART_SIZE), 
MAX_PARTS2THREADS_RATIO * threads);
        }
 
        /* when testing, always aim for full parallelism, but avoid
diff --git a/sql/backends/monet5/UDF/capi/capi.c 
b/sql/backends/monet5/UDF/capi/capi.c
--- a/sql/backends/monet5/UDF/capi/capi.c
+++ b/sql/backends/monet5/UDF/capi/capi.c
@@ -473,7 +473,7 @@ static str CUDFeval(Client cntxt, MalBlk
 
        lng initial_output_count = -1;
 
-       struct sigaction sa, oldsa, oldsb;
+       struct sigaction sa = (struct sigaction) {.sa_flags = 0}, oldsa, oldsb;
        sigset_t signal_set;
 
 #ifdef NDEBUG
@@ -526,8 +526,6 @@ static str CUDFeval(Client cntxt, MalBlk
                (void)sigaddset(&signal_set, SIGSEGV);
                (void)sigaddset(&signal_set, SIGBUS);
                (void)pthread_sigmask(SIG_UNBLOCK, &signal_set, NULL);
-
-               sa = (struct sigaction) {.sa_flags = 0,};
        }
 
        sqlfun = *(sql_func **)getArgReference_ptr(stk, pci, pci->retc);
@@ -1405,7 +1403,7 @@ static str CUDFeval(Client cntxt, MalBlk
                        errno = 0;
                        goto wrapup;
                }
-               sa = (struct sigaction) {.sa_flags = 0,};
+               sa = (struct sigaction) {.sa_flags = 0};
        }
 
        if (msg) {
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -270,11 +270,14 @@ SQLprepareClient(Client c, int login)
                        default:
                                break;
                }
-               lng maxmem;
-               if (monet5_user_get_max_memory(m, m->user_id, &maxmem) == 0)
-                       c->qryctx.maxmem = (ATOMIC_BASE_TYPE) (maxmem > 0 ? 
maxmem : 0);
-               else
+               if (monet5_user_get_max_memory(m, m->user_id, &c->maxmem) == 0) 
{
+                       c->qryctx.maxmem = (ATOMIC_BASE_TYPE) (c->maxmem > 0 ? 
c->maxmem : 0);
+               } else {
+                       c->maxmem = 0;
                        c->qryctx.maxmem = 0;
+               }
+               if (c->memorylimit > 0 && c->qryctx.maxmem > 
((ATOMIC_BASE_TYPE) c->memorylimit << 20))
+                       c->qryctx.maxmem = (ATOMIC_BASE_TYPE) c->memorylimit << 
20;
        }
 
        if (c->handshake_options) {
diff --git a/sql/test/bincopy/Tests/All b/sql/test/bincopy/Tests/All
--- a/sql/test/bincopy/Tests/All
+++ b/sql/test/bincopy/Tests/All
@@ -52,7 +52,6 @@ bincopy_big_endians_on_server
 bincopy_native_endians_on_client
 bincopy_native_endians_on_server
 
-bincopy_invalid_json
 bincopy_default_values
 bincopy_decimal_range
 bincopy_string_width
diff --git a/sql/test/bincopy/Tests/bincopy_nulls.py 
b/sql/test/bincopy/Tests/bincopy_nulls.py
--- a/sql/test/bincopy/Tests/bincopy_nulls.py
+++ b/sql/test/bincopy/Tests/bincopy_nulls.py
@@ -24,16 +24,14 @@ class TestCase:
     little_endian_bits: bytes
     big_endian_bits: bytes
     expected: List[Any]
-    if_exists: bool
 
     def __init__(self,
                  sqltype: str, byteswap_size: int, expected: List[Any],
                  little_endian_bits: bytes,
-                 big_endian_bits: Optional[bytes] = None, if_exists=False):
+                 big_endian_bits: Optional[bytes] = None):
         self.sqltype = sqltype
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to