]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
try to clear out 3 cache entries for every 1 lookup
authorAlan T. DeKok <aland@freeradius.org>
Mon, 16 Mar 2026 20:51:56 +0000 (16:51 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Mon, 16 Mar 2026 20:51:56 +0000 (16:51 -0400)
which lets us clean up old entries more quickly after a spike of
traffic

src/modules/rlm_cache/drivers/rlm_cache_rbtree/rlm_cache_rbtree.c

index 07e4ca795bb112a09287410b93ef7d6863d57c5f..8ab498b302a9e38a5c710236a48fe3a78db5e7e6 100644 (file)
@@ -99,7 +99,7 @@ static cache_status_t cache_entry_find(rlm_cache_entry_t **out,
        rlm_cache_rbtree_t *driver = talloc_get_type_abort(instance, rlm_cache_rbtree_t);
        rlm_cache_rbtree_mutable_t *mutable = driver->mutable;
        rlm_cache_entry_t find = {};
-
+       int i;
        rlm_cache_entry_t *c;
 
        fr_assert(mutable->cache);
@@ -107,8 +107,12 @@ static cache_status_t cache_entry_find(rlm_cache_entry_t **out,
        /*
         *      Clear out old entries
         */
-       c = fr_heap_peek(mutable->heap);
-       if (c && (fr_unix_time_lt(c->expires, fr_time_to_unix_time(request->packet->timestamp)))) {
+       for (i = 0; i < 3; i++) {
+               c = fr_heap_peek(mutable->heap);
+               if (!c) break;
+
+               if (fr_unix_time_gt(c->expires, fr_time_to_unix_time(request->packet->timestamp))) break;
+
                fr_heap_extract(&mutable->heap, c);
                fr_rb_delete(mutable->cache, c);
                talloc_free(c);