varnish-cache/bin/varnishd/hash/hash_critbit.c
0
/*-
1
 * Copyright (c) 2008-2011 Varnish Software AS
2
 * All rights reserved.
3
 *
4
 * Author: Poul-Henning Kamp <phk@phk.freebsd.dk>
5
 *
6
 * SPDX-License-Identifier: BSD-2-Clause
7
 *
8
 * Redistribution and use in source and binary forms, with or without
9
 * modification, are permitted provided that the following conditions
10
 * are met:
11
 * 1. Redistributions of source code must retain the above copyright
12
 *    notice, this list of conditions and the following disclaimer.
13
 * 2. Redistributions in binary form must reproduce the above copyright
14
 *    notice, this list of conditions and the following disclaimer in the
15
 *    documentation and/or other materials provided with the distribution.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
 * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
21
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27
 * SUCH DAMAGE.
28
 *
29
 * A Crit Bit tree based hash
30
 */
31
32
// #define PHK
33
34
#include "config.h"
35
36
#include <stdlib.h>
37
38
#include "cache/cache_varnishd.h"
39
#include "cache/cache_objhead.h"
40
41
#include "hash/hash_slinger.h"
42
#include "vmb.h"
43
#include "vtim.h"
44
45
static struct lock hcb_mtx;
46
47
/*---------------------------------------------------------------------
48
 * Table for finding out how many bits two bytes have in common,
49
 * counting from the MSB towards the LSB.
50
 * ie:
51
 *      hcb_bittbl[0x01 ^ 0x22] == 2
52
 *      hcb_bittbl[0x10 ^ 0x0b] == 3
53
 *
54
 */
55
56
static unsigned char hcb_bittbl[256];
57
58
static unsigned char
59 164916
hcb_bits(unsigned char x, unsigned char y)
60
{
61 164916
        return (hcb_bittbl[x ^ y]);
62
}
63
64
static void
65 36541
hcb_build_bittbl(void)
66
{
67
        unsigned char x;
68
        unsigned y;
69
70 36541
        y = 0;
71 328869
        for (x = 0; x < 8; x++)
72 4969576
                for (; y < (1U << x); y++)
73 4969576
                        hcb_bittbl[y] = 8 - x;
74
75
        /* Quick asserts for sanity check */
76 36541
        assert(hcb_bits(0x34, 0x34) == 8);
77 36541
        AZ(hcb_bits(0xaa, 0x55));
78 36541
        assert(hcb_bits(0x01, 0x22) == 2);
79 36541
        assert(hcb_bits(0x10, 0x0b) == 3);
80 36541
}
81
82
/*---------------------------------------------------------------------
83
 * For space reasons we overload the two pointers with two different
84
 * kinds of of pointers.  We cast them to uintptr_t's and abuse the
85
 * low two bits to tell them apart, assuming that Varnish will never
86
 * run on machines with less than 32bit alignment.
87
 *
88
 * Asserts will explode if these assumptions are not met.
89
 */
90
91
struct hcb_y {
92
        unsigned                magic;
93
#define HCB_Y_MAGIC             0x125c4bd2
94
        unsigned short          critbit;
95
        unsigned char           ptr;
96
        unsigned char           bitmask;
97
        volatile uintptr_t      leaf[2];
98
        VSTAILQ_ENTRY(hcb_y)    list;
99
};
100
101
#define HCB_BIT_NODE            (1<<0)
102
#define HCB_BIT_Y               (1<<1)
103
104
struct hcb_root {
105
        volatile uintptr_t      origo;
106
};
107
108
static struct hcb_root  hcb_root;
109
110
static VSTAILQ_HEAD(, hcb_y)    cool_y = VSTAILQ_HEAD_INITIALIZER(cool_y);
111
static VSTAILQ_HEAD(, hcb_y)    dead_y = VSTAILQ_HEAD_INITIALIZER(dead_y);
112
static VTAILQ_HEAD(, objhead)   cool_h = VTAILQ_HEAD_INITIALIZER(cool_h);
113
static VTAILQ_HEAD(, objhead)   dead_h = VTAILQ_HEAD_INITIALIZER(dead_h);
114
115
/*---------------------------------------------------------------------
116
 * Pointer accessor functions
117
 */
118
static int
119 88716
hcb_is_node(uintptr_t u)
120
{
121
122 88716
        return (u & HCB_BIT_NODE);
123
}
124
125
static int
126 187294
hcb_is_y(uintptr_t u)
127
{
128
129 187294
        return (u & HCB_BIT_Y);
130
}
131
132
static uintptr_t
133 57399
hcb_r_node(const struct objhead *n)
134
{
135
136 57399
        AZ((uintptr_t)n & (HCB_BIT_NODE | HCB_BIT_Y));
137 57399
        return (HCB_BIT_NODE | (uintptr_t)n);
138
}
139
140
static struct objhead *
141 88712
hcb_l_node(uintptr_t u)
142
{
143
144 88712
        assert(u & HCB_BIT_NODE);
145 88712
        AZ(u & HCB_BIT_Y);
146 88712
        return ((struct objhead *)(u & ~HCB_BIT_NODE));
147
}
148
149
static uintptr_t
150 18752
hcb_r_y(const struct hcb_y *y)
151
{
152
153 18752
        CHECK_OBJ_NOTNULL(y, HCB_Y_MAGIC);
154 18752
        AZ((uintptr_t)y & (HCB_BIT_NODE | HCB_BIT_Y));
155 18752
        return (HCB_BIT_Y | (uintptr_t)y);
156
}
157
158
static struct hcb_y *
159 80876
hcb_l_y(uintptr_t u)
160
{
161
162 80876
        AZ(u & HCB_BIT_NODE);
163 80876
        assert(u & HCB_BIT_Y);
164 80876
        return ((struct hcb_y *)(u & ~HCB_BIT_Y));
165
}
166
167
/*---------------------------------------------------------------------
168
 * Find the "critical" bit that separates these two digests
169
 */
170
171
static unsigned
172 18752
hcb_crit_bit(const uint8_t *digest, const struct objhead *oh2, struct hcb_y *y)
173
{
174
        unsigned char u, r;
175
176 18752
        CHECK_OBJ_NOTNULL(y, HCB_Y_MAGIC);
177 24352
        for (u = 0; u < DIGEST_LEN && digest[u] == oh2->digest[u]; u++)
178
                ;
179 18752
        assert(u < DIGEST_LEN);
180 18752
        r = hcb_bits(digest[u], oh2->digest[u]);
181 18752
        y->ptr = u;
182 18752
        y->bitmask = 0x80 >> r;
183 18752
        y->critbit = u * 8 + r;
184 18752
        return (y->critbit);
185
}
186
187
/*---------------------------------------------------------------------
188
 * Unless we have the lock, we need to be very careful about pointer
189
 * references into the tree, we cannot trust things to be the same
190
 * in two consecutive memory accesses.
191
 */
192
193
static struct objhead *
194 144632
hcb_insert(const struct worker *wrk, struct hcb_root *root,
195
    const uint8_t *digest, struct objhead **noh)
196
{
197
        volatile uintptr_t *p;
198
        uintptr_t pp;
199
        struct hcb_y *y, *y2;
200
        struct objhead *oh2;
201
        unsigned s, s2;
202
203 144632
        p = &root->origo;
204 144632
        pp = *p;
205 144632
        if (pp == 0) {
206 55920
                if (noh == NULL)
207 27996
                        return (NULL);
208 27924
                oh2 = *noh;
209 27924
                *noh = NULL;
210 27924
                memcpy(oh2->digest, digest, sizeof oh2->digest);
211 27924
                *p = hcb_r_node(oh2);
212 27924
                return (oh2);
213
        }
214
215 148395
        while (hcb_is_y(pp)) {
216 59683
                y = hcb_l_y(pp);
217 59683
                CHECK_OBJ_NOTNULL(y, HCB_Y_MAGIC);
218 59683
                assert(y->ptr < DIGEST_LEN);
219 59683
                s = (digest[y->ptr] & y->bitmask) != 0;
220 59683
                assert(s < 2);
221 59683
                p = &y->leaf[s];
222 59683
                pp = *p;
223
        }
224
225 88712
        if (pp == 0) {
226
                /* We raced hcb_delete and got a NULL pointer */
227 0
                assert(noh == NULL);
228 0
                return (NULL);
229
        }
230
231 88712
        assert(hcb_is_node(pp));
232
233
        /* We found a node, does it match ? */
234 88712
        oh2 = hcb_l_node(pp);
235 88712
        CHECK_OBJ_NOTNULL(oh2, OBJHEAD_MAGIC);
236 88712
        if (!memcmp(oh2->digest, digest, DIGEST_LEN))
237 51220
                return (oh2);
238
239 37492
        if (noh == NULL)
240 18740
                return (NULL);
241
242
        /* Insert */
243
244 18752
        TAKE_OBJ_NOTNULL(y2, &wrk->wpriv->nhashpriv, HCB_Y_MAGIC);
245 18752
        (void)hcb_crit_bit(digest, oh2, y2);
246 18752
        s2 = (digest[y2->ptr] & y2->bitmask) != 0;
247 18752
        assert(s2 < 2);
248 18752
        oh2 = *noh;
249 18752
        *noh = NULL;
250 18752
        memcpy(oh2->digest, digest, sizeof oh2->digest);
251 18752
        y2->leaf[s2] = hcb_r_node(oh2);
252 18752
        s2 = 1-s2;
253
254 18752
        p = &root->origo;
255 18752
        AN(*p);
256
257 32819
        while (hcb_is_y(*p)) {
258 17505
                y = hcb_l_y(*p);
259 17505
                CHECK_OBJ_NOTNULL(y, HCB_Y_MAGIC);
260 17505
                assert(y->critbit != y2->critbit);
261 17505
                if (y->critbit > y2->critbit)
262 3438
                        break;
263 14067
                assert(y->ptr < DIGEST_LEN);
264 14067
                s = (digest[y->ptr] & y->bitmask) != 0;
265 14067
                assert(s < 2);
266 14067
                p = &y->leaf[s];
267
        }
268 18752
        y2->leaf[s2] = *p;
269 18752
        VWMB();
270 18752
        *p = hcb_r_y(y2);
271 18752
        return (oh2);
272 144632
}
273
274
/*--------------------------------------------------------------------*/
275
276
static void
277 7035
hcb_delete(struct hcb_root *r, const struct objhead *oh)
278
{
279
        struct hcb_y *y;
280
        volatile uintptr_t *p;
281
        unsigned s;
282
283 7035
        if (r->origo == hcb_r_node(oh)) {
284 4644
                r->origo = 0;
285 4644
                return;
286
        }
287 2391
        p = &r->origo;
288 2391
        assert(hcb_is_y(*p));
289
290 2391
        y = NULL;
291 3688
        while (1) {
292 3688
                assert(hcb_is_y(*p));
293 3688
                y = hcb_l_y(*p);
294 3688
                assert(y->ptr < DIGEST_LEN);
295 3688
                s = (oh->digest[y->ptr] & y->bitmask) != 0;
296 3688
                assert(s < 2);
297 3688
                if (y->leaf[s] == hcb_r_node(oh)) {
298 2391
                        *p = y->leaf[1 - s];
299 2391
                        VSTAILQ_INSERT_TAIL(&cool_y, y, list);
300 2391
                        return;
301
                }
302 1297
                p = &y->leaf[s];
303
        }
304 7035
}
305
306
/*--------------------------------------------------------------------*/
307
308
static void * v_matchproto_(bgthread_t)
309 0
hcb_cleaner(struct worker *wrk, void *priv)
310
{
311
        struct hcb_y *y, *y2;
312
        struct objhead *oh, *oh2;
313
314 0
        (void)priv;
315 36541
        while (1) {
316 36541
                VSTAILQ_FOREACH_SAFE(y, &dead_y, list, y2) {
317 0
                        CHECK_OBJ_NOTNULL(y, HCB_Y_MAGIC);
318 0
                        VSTAILQ_REMOVE_HEAD(&dead_y, list);
319 0
                        FREE_OBJ(y);
320 0
                }
321 36541
                VTAILQ_FOREACH_SAFE(oh, &dead_h, hoh_list, oh2) {
322 0
                        CHECK_OBJ(oh, OBJHEAD_MAGIC);
323 0
                        VTAILQ_REMOVE(&dead_h, oh, hoh_list);
324 0
                        HSH_DeleteObjHead(wrk, oh);
325 0
                }
326 36541
                Lck_Lock(&hcb_mtx);
327 36541
                VSTAILQ_CONCAT(&dead_y, &cool_y);
328 36541
                VTAILQ_CONCAT(&dead_h, &cool_h, hoh_list);
329 36541
                Lck_Unlock(&hcb_mtx);
330 36541
                Pool_Sumstat(wrk);
331 36541
                VTIM_sleep(cache_param->critbit_cooloff);
332
        }
333
        NEEDLESS(return (NULL));
334
}
335
336
/*--------------------------------------------------------------------*/
337
338
static void v_matchproto_(hash_start_f)
339 36541
hcb_start(void)
340
{
341 36541
        struct objhead *oh = NULL;
342
        pthread_t tp;
343
344 36541
        (void)oh;
345 36541
        Lck_New(&hcb_mtx, lck_hcb);
346 36541
        WRK_BgThread(&tp, "hcb-cleaner", hcb_cleaner, NULL);
347 36541
        memset(&hcb_root, 0, sizeof hcb_root);
348 36541
        hcb_build_bittbl();
349 36541
}
350
351
static int v_matchproto_(hash_deref_f)
352 56481
hcb_deref(struct worker *wrk, struct objhead *oh)
353
{
354
        int r;
355
356 56481
        (void)wrk;
357 56481
        CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
358 56481
        Lck_AssertHeld(&oh->mtx);
359 56481
        assert(oh->refcnt > 0);
360 56481
        r = --oh->refcnt;
361 56481
        if (oh->refcnt == 0) {
362 7035
                Lck_Lock(&hcb_mtx);
363 7035
                hcb_delete(&hcb_root, oh);
364 7035
                VTAILQ_INSERT_TAIL(&cool_h, oh, hoh_list);
365 7035
                Lck_Unlock(&hcb_mtx);
366 7035
        }
367 56481
        Lck_Unlock(&oh->mtx);
368
#ifdef PHK
369
        fprintf(stderr, "hcb_defef %d %d <%s>\n", __LINE__, r, oh->hash);
370
#endif
371 56481
        return (r);
372
}
373
374
static struct objhead * v_matchproto_(hash_lookup_f)
375 97900
hcb_lookup(struct worker *wrk, const void *digest, struct objhead **noh)
376
{
377
        struct objhead *oh;
378
        struct hcb_y *y;
379
        unsigned u;
380
381 97900
        CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
382 97900
        AN(digest);
383 97900
        if (noh != NULL) {
384 97892
                CHECK_OBJ_NOTNULL(*noh, OBJHEAD_MAGIC);
385 97892
                assert((*noh)->refcnt == 1);
386 97892
        }
387
388
        /* First try in read-only mode without holding a lock */
389
390 97900
        wrk->stats->hcb_nolock++;
391 97900
        oh = hcb_insert(wrk, &hcb_root, digest, NULL);
392 97900
        if (oh != NULL) {
393 51158
                Lck_Lock(&oh->mtx);
394
                /*
395
                 * A refcount of zero indicates that the tree changed
396
                 * under us, so fall through and try with the lock held.
397
                 */
398 51158
                u = oh->refcnt;
399 51158
                if (u > 0) {
400 51155
                        oh->refcnt++;
401 51155
                        return (oh);
402
                }
403 3
                Lck_Unlock(&oh->mtx);
404 3
        }
405
406 46741
        while (1) {
407
                /* No luck, try with lock held, so we can modify tree */
408 46741
                CAST_OBJ_NOTNULL(y, wrk->wpriv->nhashpriv, HCB_Y_MAGIC);
409 46741
                Lck_Lock(&hcb_mtx);
410 46741
                VSC_C_main->hcb_lock++;
411 46741
                oh = hcb_insert(wrk, &hcb_root, digest, noh);
412 46741
                Lck_Unlock(&hcb_mtx);
413
414 46741
                if (oh == NULL)
415 0
                        return (NULL);
416
417 46741
                Lck_Lock(&oh->mtx);
418
419 46741
                CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
420 46741
                if (noh != NULL && *noh == NULL) {
421 46676
                        assert(oh->refcnt > 0);
422 46676
                        VSC_C_main->hcb_insert++;
423 46676
                        return (oh);
424
                }
425
                /*
426
                 * A refcount of zero indicates that the tree changed
427
                 * under us, so fall through and try with the lock held.
428
                 */
429 65
                u = oh->refcnt;
430 65
                if (u > 0) {
431 65
                        oh->refcnt++;
432 65
                        return (oh);
433
                }
434 0
                Lck_Unlock(&oh->mtx);
435
        }
436 97896
}
437
438
static void v_matchproto_(hash_prep_f)
439 99759
hcb_prep(struct worker *wrk)
440
{
441
        struct hcb_y *y;
442
443 99759
        if (wrk->wpriv->nhashpriv == NULL) {
444 46914
                ALLOC_OBJ(y, HCB_Y_MAGIC);
445 46914
                AN(y);
446 46914
                wrk->wpriv->nhashpriv = y;
447 46914
        }
448 99759
}
449
450
const struct hash_slinger hcb_slinger = {
451
        .magic  =       SLINGER_MAGIC,
452
        .name   =       "critbit",
453
        .start  =       hcb_start,
454
        .lookup =       hcb_lookup,
455
        .prep =         hcb_prep,
456
        .deref  =       hcb_deref,
457
};