]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: pattern: add a revision to all pattern expressions
authorWilly Tarreau <w@1wt.eu>
Wed, 29 Apr 2015 15:53:47 +0000 (17:53 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 29 Apr 2015 17:15:24 +0000 (19:15 +0200)
This will be used to detect any change on the pattern list between
two operations, ultimately making it possible to implement a cache
which immediately invalidates obsolete keys after an update. The
revision is simply taken from the timestamp counter to ensure that
even upon a pointer reuse we cannot accidently come back to the
same (expr,revision) tuple.

include/types/pattern.h
src/pattern.c

index 492cdd3a3d9debfb42c2bc72f7ad8b3f3e1ba7c1..54af8fb55a8403bcab6bf1bfd4ccf961f56b13ae 100644 (file)
@@ -186,6 +186,7 @@ struct pattern_list {
  */
 struct pattern_expr {
        struct list list; /* Used for chaining pattern_expr in pat_ref. */
+       unsigned long long revision; /* updated for each update */
        struct pat_ref *ref; /* The pattern reference if exists. */
        struct pattern_head *pat_head; /* Point to the pattern_head that contain manipulation functions.
                                        * Note that this link point on compatible head but not on the real
index b19ffe2736ab14204e614f2634aab53538eff5f1..ebae85db0d2421d79e06407529b8b752d06822f0 100644 (file)
@@ -978,6 +978,7 @@ int pat_idx_list_val(struct pattern_expr *expr, struct pattern *pat, char **err)
 
        /* chain pattern in the expression */
        LIST_ADDQ(&expr->patterns, &patl->list);
+       expr->revision = rdtsc();
 
        /* that's ok */
        return 1;
@@ -1006,6 +1007,7 @@ int pat_idx_list_ptr(struct pattern_expr *expr, struct pattern *pat, char **err)
 
        /* chain pattern in the expression */
        LIST_ADDQ(&expr->patterns, &patl->list);
+       expr->revision = rdtsc();
 
        /* that's ok */
        return 1;
@@ -1035,6 +1037,7 @@ int pat_idx_list_str(struct pattern_expr *expr, struct pattern *pat, char **err)
 
        /* chain pattern in the expression */
        LIST_ADDQ(&expr->patterns, &patl->list);
+       expr->revision = rdtsc();
 
        /* that's ok */
        return 1;
@@ -1071,6 +1074,7 @@ int pat_idx_list_reg(struct pattern_expr *expr, struct pattern *pat, char **err)
 
        /* chain pattern in the expression */
        LIST_ADDQ(&expr->patterns, &patl->list);
+       expr->revision = rdtsc();
 
        /* that's ok */
        return 1;
@@ -1109,6 +1113,7 @@ int pat_idx_tree_ip(struct pattern_expr *expr, struct pattern *pat, char **err)
 
                        /* Insert the entry. */
                        ebmb_insert_prefix(&expr->pattern_tree, &node->node, 4);
+                       expr->revision = rdtsc();
 
                        /* that's ok */
                        return 1;
@@ -1136,6 +1141,7 @@ int pat_idx_tree_ip(struct pattern_expr *expr, struct pattern *pat, char **err)
 
                /* Insert the entry. */
                ebmb_insert_prefix(&expr->pattern_tree_2, &node->node, 16);
+               expr->revision = rdtsc();
 
                /* that's ok */
                return 1;
@@ -1179,6 +1185,7 @@ int pat_idx_tree_str(struct pattern_expr *expr, struct pattern *pat, char **err)
 
        /* index the new node */
        ebst_insert(&expr->pattern_tree, &node->node);
+       expr->revision = rdtsc();
 
        /* that's ok */
        return 1;
@@ -1220,6 +1227,7 @@ int pat_idx_tree_pfx(struct pattern_expr *expr, struct pattern *pat, char **err)
 
        /* index the new node */
        ebmb_insert_prefix(&expr->pattern_tree, &node->node, len);
+       expr->revision = rdtsc();
 
        /* that's ok */
        return 1;
@@ -1240,6 +1248,7 @@ void pat_del_list_val(struct pattern_expr *expr, struct pat_ref_elt *ref)
                free(pat->pat.smp);
                free(pat);
        }
+       expr->revision = rdtsc();
 }
 
 void pat_del_tree_ip(struct pattern_expr *expr, struct pat_ref_elt *ref)
@@ -1283,6 +1292,7 @@ void pat_del_tree_ip(struct pattern_expr *expr, struct pat_ref_elt *ref)
                free(elt->smp);
                free(elt);
        }
+       expr->revision = rdtsc();
 }
 
 void pat_del_list_ptr(struct pattern_expr *expr, struct pat_ref_elt *ref)
@@ -1301,6 +1311,7 @@ void pat_del_list_ptr(struct pattern_expr *expr, struct pat_ref_elt *ref)
                free(pat->pat.smp);
                free(pat);
        }
+       expr->revision = rdtsc();
 }
 
 void pat_del_tree_str(struct pattern_expr *expr, struct pat_ref_elt *ref)
@@ -1328,6 +1339,7 @@ void pat_del_tree_str(struct pattern_expr *expr, struct pat_ref_elt *ref)
                free(elt->smp);
                free(elt);
        }
+       expr->revision = rdtsc();
 }
 
 void pat_del_list_reg(struct pattern_expr *expr, struct pat_ref_elt *ref)
@@ -1346,11 +1358,13 @@ void pat_del_list_reg(struct pattern_expr *expr, struct pat_ref_elt *ref)
                free(pat->pat.smp);
                free(pat);
        }
+       expr->revision = rdtsc();
 }
 
 void pattern_init_expr(struct pattern_expr *expr)
 {
        LIST_INIT(&expr->patterns);
+       expr->revision = 0;
        expr->pattern_tree = EB_ROOT;
        expr->pattern_tree_2 = EB_ROOT;
 }