From: Willy Tarreau Date: Fri, 30 Apr 2021 11:19:37 +0000 (+0200) Subject: MINOR: pattern: support purging arbitrary ranges of generations X-Git-Tag: v2.4-dev18~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a13afe6535e29e7dfe9a488cc2aed7795ed5bbf1;p=thirdparty%2Fhaproxy.git MINOR: pattern: support purging arbitrary ranges of generations Instead of being able to purge only values older than a specific value, let's support arbitrary ranges and make pat_ref_purge_older() just be one special case of this one. --- diff --git a/include/haproxy/pattern.h b/include/haproxy/pattern.h index aaa8964ff5..7f785095d6 100644 --- a/include/haproxy/pattern.h +++ b/include/haproxy/pattern.h @@ -192,7 +192,7 @@ void pat_ref_delete_by_ptr(struct pat_ref *ref, struct pat_ref_elt *elt); int pat_ref_delete_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt); int pat_ref_prune(struct pat_ref *ref); int pat_ref_commit_elt(struct pat_ref *ref, struct pat_ref_elt *elt, char **err); -int pat_ref_purge_older(struct pat_ref *ref, unsigned int oldest, int budget); +int pat_ref_purge_range(struct pat_ref *ref, uint from, uint to, int budget); void pat_ref_reload(struct pat_ref *ref, struct pat_ref *replace); /* Create a new generation number for next pattern updates and returns it. This @@ -237,6 +237,20 @@ static inline int pat_ref_commit(struct pat_ref *ref, unsigned int gen) return gen - ref->curr_gen; } +/* This function purges all elements from that are older than generation + * . It will not purge more than entries at once, in order to + * remain responsive. If budget is negative, no limit is applied. + * The caller must already hold the PATREF_LOCK on . The function will + * take the PATEXP_LOCK on all expressions of the pattern as needed. It returns + * non-zero on completion, or zero if it had to stop before the end after + * was depleted. + */ +static inline int pat_ref_purge_older(struct pat_ref *ref, uint oldest, int budget) +{ + return pat_ref_purge_range(ref, oldest + 1, oldest - 1, budget); +} + + /* * pattern_head manipulation. */ diff --git a/src/pattern.c b/src/pattern.c index 80ff0259b3..5ec7316b12 100644 --- a/src/pattern.c +++ b/src/pattern.c @@ -2016,15 +2016,16 @@ int pat_ref_add(struct pat_ref *ref, return !!pat_ref_load(ref, ref->curr_gen, pattern, sample, -1, err); } -/* This function purges all elements from that are older than generation - * . It will not purge more than entries at once, in order to - * remain responsive. If budget is negative, no limit is applied. +/* This function purges all elements from whose generation is included in + * the range of to (inclusive), taking wrapping into consideration. + * It will not purge more than entries at once, in order to remain + * responsive. If budget is negative, no limit is applied. * The caller must already hold the PATREF_LOCK on . The function will * take the PATEXP_LOCK on all expressions of the pattern as needed. It returns * non-zero on completion, or zero if it had to stop before the end after * was depleted. */ -int pat_ref_purge_older(struct pat_ref *ref, unsigned int oldest, int budget) +int pat_ref_purge_range(struct pat_ref *ref, uint from, uint to, int budget) { struct pat_ref_elt *elt, *elt_bck; struct bref *bref, *bref_bck; @@ -2039,7 +2040,7 @@ int pat_ref_purge_older(struct pat_ref *ref, unsigned int oldest, int budget) /* assume completion for e.g. empty lists */ done = 1; list_for_each_entry_safe(elt, elt_bck, &ref->head, list) { - if ((int)(elt->gen_id - oldest) >= 0) + if (elt->gen_id - from > to - from) continue; if (budget >= 0 && !budget--) { @@ -2178,8 +2179,7 @@ void pat_ref_reload(struct pat_ref *ref, struct pat_ref *replace) */ int pat_ref_prune(struct pat_ref *ref) { - return pat_ref_purge_older(ref, ref->curr_gen + 1, 100) && - pat_ref_purge_older(ref, ref->next_gen + 1, 100); + return pat_ref_purge_range(ref, 0, ~0, 100); } /* This function looks up any existing reference in pattern_head , and