Changeset: bb227615634f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/bb227615634f
Modified Files:
        gdk/gdk_bbp.c
Branch: Jul2021
Log Message:

In a separate thread, unload bats that haven't been used in a while.


diffs (80 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1012,6 +1012,58 @@ movestrbats(void)
 }
 #endif
 
+static void
+BBPmanager(void *dummy)
+{
+       (void) dummy;
+
+       for (;;) {
+               int n = 0;
+               for (bat bid = 1; bid < (bat) ATOMIC_GET(&BBPsize); bid++) {
+                       MT_lock_set(&GDKswapLock(bid));
+                       if (BBP_refs(bid) == 0 && BBP_lrefs(bid) != 0) {
+                               BBP_status_off(bid, BBPHOT);
+                               n++;
+                       }
+                       MT_lock_unset(&GDKswapLock(bid));
+               }
+               TRC_DEBUG(BAT_, "cleared HOT bit from %d bats\n", n);
+               for (int i = 0; i < 100; i++) {
+                       MT_sleep_ms(100);
+                       if (GDKexiting())
+                               return;
+               }
+               n = 0;
+               for (bat bid = 1; bid < (bat) ATOMIC_GET(&BBPsize); bid++) {
+                       MT_lock_set(&GDKswapLock(bid));
+                       BAT *b = NULL;
+                       bool swap = false;
+                       if (BBP_refs(bid) == 0 &&
+                           BBP_lrefs(bid) != 0 &&
+                           (b = BBP_cache(bid)) != NULL &&
+                           b->batSharecnt == 0 &&
+                           !BATdirty(b) &&
+                           !(BBP_status(bid) & (BBPHOT | BBPUNLOADING)) &&
+                           (BBP_status(bid) & BBPPERSISTENT)) {
+                               BBP_status_on(bid, BBPUNLOADING);
+                               swap = true;
+                       }
+                       MT_lock_unset(&GDKswapLock(bid));
+                       if (swap) {
+                               TRC_DEBUG(BAT_, "unload and free bat %d\n", 
bid);
+                               if (BBPfree(b) != GDK_SUCCEED)
+                                       GDKerror("unload failed for bat %d", 
bid);
+                               n++;
+                       }
+               }
+               TRC_DEBUG(BAT_, "unloaded %d bats\n", n);
+               if (GDKexiting())
+                       return;
+       }
+}
+
+static MT_Id manager;
+
 gdk_return
 BBPinit(void)
 {
@@ -1199,6 +1251,8 @@ BBPinit(void)
                        return GDK_FAIL;
        }
 #endif
+
+       manager = THRcreate(BBPmanager, NULL, MT_THR_DETACHED, "BBPmanager");
        return GDK_SUCCEED;
 
   bailout:
@@ -2371,7 +2425,7 @@ decref(bat i, bool logical, bool release
                 * while locked so no other thread thinks it's
                 * available anymore */
                assert((BBP_status(i) & BBPUNLOADING) == 0);
-               TRC_DEBUG(BAT_, "%s set to unloading BAT %d (status %u)\n", 
func, i, BBP_status(i));
+               TRC_DEBUG(BAT_, "%s set to unloading BAT %d (status %u, lrefs 
%d)\n", func, i, BBP_status(i), BBP_lrefs(i));
                BBP_status_on(i, BBPUNLOADING);
                swap = true;
        }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to