Changeset: 2646c48609ba for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/2646c48609ba Modified Files: gdk/gdk_bbp.c Branch: Jul2021 Log Message:
More aggresively free bats when memory is low; don't free when saving. diffs (123 lines): diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -1016,6 +1016,38 @@ movestrbats(void) #endif static void +BBPtrim(bool aggresive) +{ + int n = 0; + unsigned flag = BBPUNLOADING | BBPSYNCING | BBPSAVING; + if (!aggresive) + flag |= BBPHOT; + 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) || (b->theap->storage == STORE_MMAP && (b->tvheap == NULL || b->tvheap->storage == STORE_MMAP))) && + !(BBP_status(bid) & flag) && + (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%s\n", n, aggresive ? " (also hot)" : ""); +} + +static void BBPmanager(void *dummy) { (void) dummy; @@ -1031,35 +1063,12 @@ BBPmanager(void *dummy) MT_lock_unset(&GDKswapLock(bid)); } TRC_DEBUG(BAT_, "cleared HOT bit from %d bats\n", n); - for (int i = 0; i < 100; i++) { + for (int i = 0, n = GDKvm_cursize() > GDK_vm_maxsize / 2 ? 25 : 100; i < n; 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 | BBPSYNCING)) && - (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); + BBPtrim(false); if (GDKexiting()) return; } @@ -3300,22 +3309,40 @@ BBPsync(int cnt, bat *restrict subcommit /* BBP_desc(i) may be NULL */ BATiter bi = bat_iterator(BBP_desc(i)); BUN size = sizes ? sizes[idx] : BUN_NONE; + BAT *b = NULL; if (size > bi.count) size = bi.count; if (BBP_status(i) & BBPPERSISTENT) { - BAT *b = dirty_bat(&i, subcommit != NULL); + b = dirty_bat(&i, subcommit != NULL); if (i <= 0) { bat_iterator_end(&bi); break; } - if (b) + if (b) { + for (;;) { + if (lock) + MT_lock_set(&GDKswapLock(i)); + if (!(BBP_status(i) & BBPSAVING)) + break; + if (lock) + MT_lock_unset(&GDKswapLock(i)); + BBPspin(i, __func__, BBPSAVING); + } + BBP_status_on(i, BBPSAVING); + if (lock) + MT_lock_unset(&GDKswapLock(i)); ret = BATsave_locked(b, &bi, size); + } } if (ret == GDK_SUCCEED) { n = BBPdir_step(i, size, n, buf, sizeof(buf), &obbpf, nbbpf); } bat_iterator_end(&bi); + if (b) { + /* turn bit off after closing the iterator */ + BBP_status_off(i, BBPSAVING); + } if (n == -2) break; /* we once again have a saved heap */ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list