Changeset: 97bf74efeb5a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/97bf74efeb5a
Modified Files:
        gdk/gdk_bbp.c
        gdk/gdk_system.c
        gdk/gdk_system_private.h
        testing/Mtest.py.in
Branch: Dec2023
Log Message:

Count number of free bats in global free list + report them in USR1 signal.


diffs (132 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -119,6 +119,7 @@ static MT_Lock BBPnameLock = MT_LOCK_INI
 static bat BBP_hash[BBP_mask+1];       /* BBP logical name hash buckets */
 static MT_Lock GDKcacheLock = MT_LOCK_INITIALIZER(GDKcacheLock);
 static bat BBP_free;
+static uint32_t BBP_nfree;
 #define BBP_FREE_LOWATER       10
 #define BBP_FREE_HIWATER       50
 
@@ -1983,6 +1984,7 @@ BBPinit(bool allow_hge_upgrade)
                if (BBP_desc(i) == NULL) {
                        BBP_next(i) = BBP_free;
                        BBP_free = i;
+                       BBP_nfree++;
                }
        }
 
@@ -2698,6 +2700,7 @@ maybeextend(void)
                BBP_next(sz) = ++size;
        }
        BBP_next(size) = 0;
+       BBP_nfree += BBP_FREE_LOWATER;
        return GDK_SUCCEED;
 }
 
@@ -2737,6 +2740,7 @@ BBPinsert(BAT *bn)
                for (int x = 0; x < BBP_FREE_LOWATER && i; x++) {
                        assert(BBP_next(i) == 0 || BBP_next(i) > i);
                        t->nfreebats++;
+                       BBP_nfree--;
                        l = i;
                        i = BBP_next(i);
                }
@@ -2873,6 +2877,7 @@ BBPhandover(struct freebats *t, uint32_t
        if (n >= t->nfreebats) {
                bid = t->freebats;
                t->freebats = 0;
+               BBP_nfree += t->nfreebats;
                t->nfreebats = 0;
        } else {
                p = &t->freebats;
@@ -2880,6 +2885,7 @@ BBPhandover(struct freebats *t, uint32_t
                        p = &BBP_next(*p);
                bid = *p;
                *p = 0;
+               BBP_nfree += n;
                t->nfreebats -= n;
        }
        p = &BBP_free;
@@ -2962,9 +2968,10 @@ BBPclear(bat i)
 }
 
 void
-BBPrelinquish(struct freebats *t)
+BBPrelinquish(void)
 {
-       if (t->nfreebats == 0)
+       struct freebats *t = MT_thread_getfreebats();
+       if (t == NULL || t->nfreebats == 0)
                return;
        MT_lock_set(&GDKcacheLock);
        while (t->nfreebats > 0) {
@@ -4709,6 +4716,7 @@ gdk_bbp_reset(void)
        int i;
 
        BBP_free = 0;
+       BBP_nfree = 0;
        while (BBPlimit > 0) {
                BBPlimit -= BBPINIT;
                assert(BBPlimit >= 0);
@@ -4943,4 +4951,5 @@ BBPprintinfo(void)
        printf("%d persistent bats using %zu virtual memory (%zu malloced)\n", 
pn, pvm, pmem);
        printf("%d transient bats using %zu virtual memory (%zu malloced)\n", 
tn, tvm, tmem);
        printf("%d bats are \"hot\" (i.e. currently or recently used)\n", nh);
+       printf("%"PRIu32" bats are in global free list\n", BBP_nfree);
 }
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -315,7 +315,6 @@ rm_mtthread(struct mtthread *t)
        struct mtthread **pt;
 
        assert(t != &mainthread);
-       BBPrelinquish(&t->freebats);
        thread_lock();
        for (pt = &mtthreads; *pt && *pt != t; pt = &(*pt)->next)
                ;
@@ -770,6 +769,7 @@ thread_starter(void *arg)
                        
(*self->thread_funcs[i].destroy)(self->thread_funcs[i].data);
        }
        free(self->thread_funcs);
+       BBPrelinquish();
        ATOMIC_SET(&self->exited, 1);
        TRC_DEBUG(THRD, "Exit thread \"%s\"\n", self->threadname);
        return 0;               /* NULL for pthreads, 0 for Windows */
diff --git a/gdk/gdk_system_private.h b/gdk/gdk_system_private.h
--- a/gdk/gdk_system_private.h
+++ b/gdk/gdk_system_private.h
@@ -45,5 +45,5 @@ struct freebats {
 };
 struct freebats *MT_thread_getfreebats(void)
        __attribute__((__visibility__("hidden")));
-void BBPrelinquish(struct freebats *t)
+void BBPrelinquish(void)
        __attribute__((__visibility__("hidden")));
diff --git a/testing/Mtest.py.in b/testing/Mtest.py.in
--- a/testing/Mtest.py.in
+++ b/testing/Mtest.py.in
@@ -1469,7 +1469,8 @@ def PerformDir(env, testdir, testlist, t
                     crs.close()
                     dbh.close()
                     if maxid > nbats and maxid - nbats > 10000:
-                        pSrvr.outfile.write(f'Too many free bats.  Max ID = 
{maxid}, # used = {nbats}, diff = {maxid - nbats}.')
+                        pSrvr.outfile.write(f'Too many free bats.  Max ID = 
{maxid}, # used = {nbats}, diff = {maxid - nbats}.\n')
+                        pSrvr.sendusr1()
                 pSrvr.terminate()
                 pSrvr = None
                 if produce_html:
@@ -2624,6 +2625,11 @@ class ServerClass:
         self.outfile.close()
         self.errfile.close()
 
+    def sendusr1(self):
+        if os.name != 'nt':
+            self.proc.send_signal(signal.SIGUSR1)
+            time.sleep(1)
+
     def LaunchIt(self):
         global setpgrp
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to