Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
varnish-cache
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
varnishcache
varnish-cache
Commits
d4d7b385
Commit
d4d7b385
authored
May 05, 2021
by
Poul-Henning Kamp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Give struct worker a private stash for things vmods should not frob.
parent
525fe180
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
81 additions
and
58 deletions
+81
-58
cache.h
bin/varnishd/cache/cache.h
+10
-20
cache_busyobj.c
bin/varnishd/cache/cache_busyobj.c
+1
-1
cache_hash.c
bin/varnishd/cache/cache_hash.c
+31
-24
cache_main.c
bin/varnishd/cache/cache_main.c
+3
-2
cache_req_fsm.c
bin/varnishd/cache/cache_req_fsm.c
+3
-2
cache_varnishd.h
bin/varnishd/cache/cache_varnishd.h
+19
-1
cache_wrk.c
bin/varnishd/cache/cache_wrk.c
+6
-0
hash_critbit.c
bin/varnishd/hash/hash_critbit.c
+7
-7
hash_slinger.h
bin/varnishd/hash/hash_slinger.h
+1
-1
No files found.
bin/varnishd/cache/cache.h
View file @
d4d7b385
...
...
@@ -87,23 +87,24 @@ enum {
/*--------------------------------------------------------------------*/
struct
VSC_lck
;
struct
VSC_main
;
struct
VSC_main_wrk
;
struct
ban
;
struct
ban_proto
;
struct
cli
;
struct
http_conn
;
struct
listen_sock
;
struct
mempool
;
struct
objcore
;
struct
objhead
;
struct
pool
;
struct
req_step
;
struct
sess
;
struct
transport
;
struct
worker
;
struct
listen_sock
;
struct
vcf
;
struct
req_step
;
struct
VSC_lck
;
struct
VSC_main
;
struct
VSC_main_wrk
;
struct
worker
;
struct
worker_priv
;
#define DIGEST_LEN 32
...
...
@@ -182,13 +183,6 @@ struct vsl_log {
/*--------------------------------------------------------------------*/
struct
vxid_pool
{
uint32_t
next
;
uint32_t
count
;
};
/*--------------------------------------------------------------------*/
VRBT_HEAD
(
vrt_privs
,
vrt_priv
);
/* Worker pool stuff -------------------------------------------------*/
...
...
@@ -229,17 +223,15 @@ enum task_prio {
struct
worker
{
unsigned
magic
;
#define WORKER_MAGIC 0x6391adcf
int
strangelove
;
struct
worker_priv
*
wpriv
;
struct
pool
*
pool
;
struct
objhead
*
nobjhead
;
struct
objcore
*
nobjcore
;
void
*
nhashpriv
;
struct
VSC_main_wrk
*
stats
;
struct
vsl_log
*
vsl
;
// borrowed from req/bo
struct
pool_task
task
[
1
];
vtim_real
lastused
;
int
strangelove
;
struct
v1l
*
v1l
;
...
...
@@ -249,8 +241,6 @@ struct worker {
struct
ws
aws
[
1
];
struct
vxid_pool
vxid_pool
;
unsigned
cur_method
;
unsigned
seen_methods
;
unsigned
handling
;
...
...
@@ -658,7 +648,7 @@ extern const char H__Reason[];
/* cache_main.c */
#define VXID(u) ((u) & VSL_IDENTMASK)
uint32_t
VXID_Get
(
struct
worker
*
,
uint32_t
marker
);
uint32_t
VXID_Get
(
const
struct
worker
*
,
uint32_t
marker
);
extern
pthread_key_t
witness_key
;
/* cache_lck.c */
...
...
bin/varnishd/cache/cache_busyobj.c
View file @
d4d7b385
...
...
@@ -82,7 +82,7 @@ vbo_Free(struct busyobj **bop)
}
struct
busyobj
*
VBO_GetBusyObj
(
struct
worker
*
wrk
,
const
struct
req
*
req
)
VBO_GetBusyObj
(
const
struct
worker
*
wrk
,
const
struct
req
*
req
)
{
struct
busyobj
*
bo
;
uint16_t
nhttp
;
...
...
bin/varnishd/cache/cache_hash.c
View file @
d4d7b385
...
...
@@ -115,15 +115,15 @@ hsh_prealloc(struct worker *wrk)
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
if
(
wrk
->
nobjcore
==
NULL
)
wrk
->
nobjcore
=
ObjNew
(
wrk
);
CHECK_OBJ_NOTNULL
(
wrk
->
nobjcore
,
OBJCORE_MAGIC
);
if
(
wrk
->
wpriv
->
nobjcore
==
NULL
)
wrk
->
wpriv
->
nobjcore
=
ObjNew
(
wrk
);
CHECK_OBJ_NOTNULL
(
wrk
->
wpriv
->
nobjcore
,
OBJCORE_MAGIC
);
if
(
wrk
->
nobjhead
==
NULL
)
{
wrk
->
nobjhead
=
hsh_newobjhead
();
if
(
wrk
->
wpriv
->
nobjhead
==
NULL
)
{
wrk
->
wpriv
->
nobjhead
=
hsh_newobjhead
();
wrk
->
stats
->
n_objecthead
++
;
}
CHECK_OBJ_NOTNULL
(
wrk
->
nobjhead
,
OBJHEAD_MAGIC
);
CHECK_OBJ_NOTNULL
(
wrk
->
wpriv
->
nobjhead
,
OBJHEAD_MAGIC
);
if
(
hash
->
prep
!=
NULL
)
hash
->
prep
(
wrk
);
...
...
@@ -151,23 +151,26 @@ HSH_Private(const struct worker *wrk)
}
/*---------------------------------------------------------------------*/
void
HSH_Cleanup
(
struct
worker
*
wrk
)
HSH_Cleanup
(
const
struct
worker
*
wrk
)
{
if
(
wrk
->
nobjcore
!=
NULL
)
ObjDestroy
(
wrk
,
&
wrk
->
nobjcore
);
if
(
wrk
->
nobjhead
!=
NULL
)
{
Lck_Delete
(
&
wrk
->
nobjhead
->
mtx
);
FREE_OBJ
(
wrk
->
nobjhead
);
wrk
->
nobjhead
=
NULL
;
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
CHECK_OBJ_NOTNULL
(
wrk
->
wpriv
,
WORKER_PRIV_MAGIC
);
if
(
wrk
->
wpriv
->
nobjcore
!=
NULL
)
ObjDestroy
(
wrk
,
&
wrk
->
wpriv
->
nobjcore
);
if
(
wrk
->
wpriv
->
nobjhead
!=
NULL
)
{
Lck_Delete
(
&
wrk
->
wpriv
->
nobjhead
->
mtx
);
FREE_OBJ
(
wrk
->
wpriv
->
nobjhead
);
wrk
->
wpriv
->
nobjhead
=
NULL
;
wrk
->
stats
->
n_objecthead
--
;
}
if
(
wrk
->
nhashpriv
!=
NULL
)
{
if
(
wrk
->
wpriv
->
nhashpriv
!=
NULL
)
{
/* XXX: If needed, add slinger method for this */
free
(
wrk
->
nhashpriv
);
wrk
->
nhashpriv
=
NULL
;
free
(
wrk
->
wpriv
->
nhashpriv
);
wrk
->
wpriv
->
nhashpriv
=
NULL
;
}
}
...
...
@@ -285,6 +288,7 @@ HSH_Insert(struct worker *wrk, const void *digest, struct objcore *oc,
struct
rush
rush
;
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
CHECK_OBJ_NOTNULL
(
wrk
->
wpriv
,
WORKER_PRIV_MAGIC
);
AN
(
digest
);
CHECK_OBJ_NOTNULL
(
oc
,
OBJCORE_MAGIC
);
AN
(
ban
);
...
...
@@ -295,8 +299,8 @@ HSH_Insert(struct worker *wrk, const void *digest, struct objcore *oc,
hsh_prealloc
(
wrk
);
AN
(
wrk
->
nobjhead
);
oh
=
hash
->
lookup
(
wrk
,
digest
,
&
wrk
->
nobjhead
);
AN
(
wrk
->
wpriv
->
nobjhead
);
oh
=
hash
->
lookup
(
wrk
,
digest
,
&
wrk
->
wpriv
->
nobjhead
);
CHECK_OBJ_NOTNULL
(
oh
,
OBJHEAD_MAGIC
);
Lck_AssertHeld
(
&
oh
->
mtx
);
assert
(
oh
->
refcnt
>
0
);
...
...
@@ -329,15 +333,17 @@ HSH_Insert(struct worker *wrk, const void *digest, struct objcore *oc,
*/
static
struct
objcore
*
hsh_insert_busyobj
(
struct
worker
*
wrk
,
struct
objhead
*
oh
)
hsh_insert_busyobj
(
const
struct
worker
*
wrk
,
struct
objhead
*
oh
)
{
struct
objcore
*
oc
;
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
CHECK_OBJ_NOTNULL
(
wrk
->
wpriv
,
WORKER_PRIV_MAGIC
);
CHECK_OBJ_NOTNULL
(
oh
,
OBJHEAD_MAGIC
);
Lck_AssertHeld
(
&
oh
->
mtx
);
oc
=
wrk
->
nobjcore
;
wrk
->
nobjcore
=
NULL
;
oc
=
wrk
->
wpriv
->
nobjcore
;
wrk
->
wpriv
->
nobjcore
=
NULL
;
CHECK_OBJ_NOTNULL
(
oc
,
OBJCORE_MAGIC
);
AN
(
oc
->
flags
&
OC_F_BUSY
);
...
...
@@ -372,6 +378,7 @@ HSH_Lookup(struct req *req, struct objcore **ocp, struct objcore **bocp)
CHECK_OBJ_NOTNULL
(
req
,
REQ_MAGIC
);
wrk
=
req
->
wrk
;
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
CHECK_OBJ_NOTNULL
(
wrk
->
wpriv
,
WORKER_PRIV_MAGIC
);
CHECK_OBJ_NOTNULL
(
req
->
http
,
HTTP_MAGIC
);
CHECK_OBJ_ORNULL
(
req
->
vcf
,
VCF_MAGIC
);
AN
(
hash
);
...
...
@@ -390,8 +397,8 @@ HSH_Lookup(struct req *req, struct objcore **ocp, struct objcore **bocp)
Lck_Lock
(
&
oh
->
mtx
);
req
->
hash_objhead
=
NULL
;
}
else
{
AN
(
wrk
->
nobjhead
);
oh
=
hash
->
lookup
(
wrk
,
req
->
digest
,
&
wrk
->
nobjhead
);
AN
(
wrk
->
wpriv
->
nobjhead
);
oh
=
hash
->
lookup
(
wrk
,
req
->
digest
,
&
wrk
->
wpriv
->
nobjhead
);
}
CHECK_OBJ_NOTNULL
(
oh
,
OBJHEAD_MAGIC
);
...
...
bin/varnishd/cache/cache_main.c
View file @
d4d7b385
...
...
@@ -166,12 +166,13 @@ static uint32_t vxid_chunk = 32768;
static
struct
lock
vxid_lock
;
uint32_t
VXID_Get
(
struct
worker
*
wrk
,
uint32_t
mask
)
VXID_Get
(
const
struct
worker
*
wrk
,
uint32_t
mask
)
{
struct
vxid_pool
*
v
;
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
v
=
&
wrk
->
vxid_pool
;
CHECK_OBJ_NOTNULL
(
wrk
->
wpriv
,
WORKER_PRIV_MAGIC
);
v
=
wrk
->
wpriv
->
vxid_pool
;
AZ
(
VXID
(
mask
));
do
{
if
(
v
->
count
==
0
)
{
...
...
bin/varnishd/cache/cache_req_fsm.c
View file @
d4d7b385
...
...
@@ -1138,7 +1138,8 @@ CNT_Request(struct req *req)
* pointers still pointing to the things we expect.
*/
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
CHECK_OBJ_ORNULL
(
wrk
->
nobjhead
,
OBJHEAD_MAGIC
);
CHECK_OBJ_NOTNULL
(
wrk
->
wpriv
,
WORKER_PRIV_MAGIC
);
CHECK_OBJ_ORNULL
(
wrk
->
wpriv
->
nobjhead
,
OBJHEAD_MAGIC
);
CHECK_OBJ_NOTNULL
(
req
,
REQ_MAGIC
);
AN
(
req
->
req_step
);
...
...
@@ -1147,7 +1148,7 @@ CNT_Request(struct req *req)
if
(
DO_DEBUG
(
DBG_REQ_STATE
))
cnt_diag
(
req
,
req
->
req_step
->
name
);
nxt
=
req
->
req_step
->
func
(
wrk
,
req
);
CHECK_OBJ_ORNULL
(
wrk
->
nobjhead
,
OBJHEAD_MAGIC
);
CHECK_OBJ_ORNULL
(
wrk
->
wpriv
->
nobjhead
,
OBJHEAD_MAGIC
);
}
wrk
->
vsl
=
NULL
;
if
(
nxt
==
REQ_FSM_DONE
)
{
...
...
bin/varnishd/cache/cache_varnishd.h
View file @
d4d7b385
...
...
@@ -65,6 +65,24 @@ struct req_step {
extern
const
struct
req_step
R_STP_TRANSPORT
[
1
];
extern
const
struct
req_step
R_STP_RECV
[
1
];
struct
vxid_pool
{
uint32_t
next
;
uint32_t
count
;
};
/*--------------------------------------------------------------------
* Private part of worker threads
*/
struct
worker_priv
{
unsigned
magic
;
#define WORKER_PRIV_MAGIC 0x3047db99
struct
objhead
*
nobjhead
;
struct
objcore
*
nobjcore
;
void
*
nhashpriv
;
struct
vxid_pool
vxid_pool
[
1
];
};
/*--------------------------------------------------------------------
* HTTP Protocol connection structure
*
...
...
@@ -158,7 +176,7 @@ void BAN_RefBan(struct objcore *oc, struct ban *);
vtim_real
BAN_Time
(
const
struct
ban
*
ban
);
/* cache_busyobj.c */
struct
busyobj
*
VBO_GetBusyObj
(
struct
worker
*
,
const
struct
req
*
);
struct
busyobj
*
VBO_GetBusyObj
(
const
struct
worker
*
,
const
struct
req
*
);
void
VBO_ReleaseBusyObj
(
struct
worker
*
wrk
,
struct
busyobj
**
busyobj
);
/* cache_director.c */
...
...
bin/varnishd/cache/cache_wrk.c
View file @
d4d7b385
...
...
@@ -87,6 +87,7 @@ wrk_bgthread(void *arg)
{
struct
bgthread
*
bt
;
struct
worker
wrk
;
struct
worker_priv
wpriv
[
1
];
struct
VSC_main_wrk
ds
;
void
*
r
;
...
...
@@ -94,6 +95,8 @@ wrk_bgthread(void *arg)
THR_SetName
(
bt
->
name
);
THR_Init
();
INIT_OBJ
(
&
wrk
,
WORKER_MAGIC
);
INIT_OBJ
(
wpriv
,
WORKER_PRIV_MAGIC
);
wrk
.
wpriv
=
wpriv
;
memset
(
&
ds
,
0
,
sizeof
ds
);
wrk
.
stats
=
&
ds
;
...
...
@@ -128,6 +131,7 @@ WRK_Thread(struct pool *qp, size_t stacksize, unsigned thread_workspace)
struct
worker
*
w
,
ww
;
struct
VSC_main_wrk
ds
;
unsigned
char
ws
[
thread_workspace
];
struct
worker_priv
wpriv
[
1
];
AN
(
qp
);
AN
(
stacksize
);
...
...
@@ -136,6 +140,8 @@ WRK_Thread(struct pool *qp, size_t stacksize, unsigned thread_workspace)
THR_SetName
(
"cache-worker"
);
w
=
&
ww
;
INIT_OBJ
(
w
,
WORKER_MAGIC
);
INIT_OBJ
(
wpriv
,
WORKER_PRIV_MAGIC
);
w
->
wpriv
=
wpriv
;
w
->
lastused
=
NAN
;
memset
(
&
ds
,
0
,
sizeof
ds
);
w
->
stats
=
&
ds
;
...
...
bin/varnishd/hash/hash_critbit.c
View file @
d4d7b385
...
...
@@ -192,8 +192,8 @@ hcb_crit_bit(const uint8_t *digest, const struct objhead *oh2, struct hcb_y *y)
*/
static
struct
objhead
*
hcb_insert
(
struct
worker
*
wrk
,
struct
hcb_root
*
root
,
const
uint8_t
*
diges
t
,
struct
objhead
**
noh
)
hcb_insert
(
const
struct
worker
*
wrk
,
struct
hcb_root
*
roo
t
,
const
uint8_t
*
digest
,
struct
objhead
**
noh
)
{
volatile
uintptr_t
*
p
;
uintptr_t
pp
;
...
...
@@ -242,8 +242,8 @@ hcb_insert(struct worker *wrk, struct hcb_root *root, const uint8_t *digest,
/* Insert */
CAST_OBJ_NOTNULL
(
y2
,
wrk
->
nhashpriv
,
HCB_Y_MAGIC
);
wrk
->
nhashpriv
=
NULL
;
CAST_OBJ_NOTNULL
(
y2
,
wrk
->
wpriv
->
nhashpriv
,
HCB_Y_MAGIC
);
wrk
->
wpriv
->
nhashpriv
=
NULL
;
(
void
)
hcb_crit_bit
(
digest
,
oh2
,
y2
);
s2
=
(
digest
[
y2
->
ptr
]
&
y2
->
bitmask
)
!=
0
;
assert
(
s2
<
2
);
...
...
@@ -405,7 +405,7 @@ hcb_lookup(struct worker *wrk, const void *digest, struct objhead **noh)
while
(
1
)
{
/* No luck, try with lock held, so we can modify tree */
CAST_OBJ_NOTNULL
(
y
,
wrk
->
nhashpriv
,
HCB_Y_MAGIC
);
CAST_OBJ_NOTNULL
(
y
,
wrk
->
wpriv
->
nhashpriv
,
HCB_Y_MAGIC
);
Lck_Lock
(
&
hcb_mtx
);
VSC_C_main
->
hcb_lock
++
;
oh
=
hcb_insert
(
wrk
,
&
hcb_root
,
digest
,
noh
);
...
...
@@ -440,10 +440,10 @@ hcb_prep(struct worker *wrk)
{
struct
hcb_y
*
y
;
if
(
wrk
->
nhashpriv
==
NULL
)
{
if
(
wrk
->
wpriv
->
nhashpriv
==
NULL
)
{
ALLOC_OBJ
(
y
,
HCB_Y_MAGIC
);
AN
(
y
);
wrk
->
nhashpriv
=
y
;
wrk
->
wpriv
->
nhashpriv
=
y
;
}
}
...
...
bin/varnishd/hash/hash_slinger.h
View file @
d4d7b385
...
...
@@ -66,7 +66,7 @@ void HSH_config(const char *);
/* cache_hash.c */
void
HSH_Init
(
const
struct
hash_slinger
*
);
void
HSH_Cleanup
(
struct
worker
*
);
void
HSH_Cleanup
(
const
struct
worker
*
);
extern
const
struct
hash_slinger
hsl_slinger
;
extern
const
struct
hash_slinger
hcl_slinger
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment