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
25b38f92
Commit
25b38f92
authored
Feb 25, 2014
by
Poul-Henning Kamp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add the internal bo->failed state we need to allow retries separate
from the external BOS_FAILED state.
parent
8c8b5007
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
46 additions
and
22 deletions
+46
-22
cache.h
bin/varnishd/cache/cache.h
+4
-1
cache_fetch.c
bin/varnishd/cache/cache_fetch.c
+29
-13
cache_fetch_proc.c
bin/varnishd/cache/cache_fetch_proc.c
+5
-6
r01284.vtc
bin/varnishtest/tests/r01284.vtc
+8
-2
No files found.
bin/varnishd/cache/cache.h
View file @
25b38f92
...
@@ -500,6 +500,9 @@ oc_getlru(const struct objcore *oc)
...
@@ -500,6 +500,9 @@ oc_getlru(const struct objcore *oc)
* streaming delivery will make use of.
* streaming delivery will make use of.
*/
*/
/*
* The macro-states we expose outside the fetch code
*/
enum
busyobj_state_e
{
enum
busyobj_state_e
{
BOS_INVALID
=
0
,
/* don't touch (yet) */
BOS_INVALID
=
0
,
/* don't touch (yet) */
BOS_REQ_DONE
,
/* beresp.* can be examined */
BOS_REQ_DONE
,
/* beresp.* can be examined */
...
@@ -514,7 +517,6 @@ struct busyobj {
...
@@ -514,7 +517,6 @@ struct busyobj {
struct
lock
mtx
;
struct
lock
mtx
;
pthread_cond_t
cond
;
pthread_cond_t
cond
;
char
*
end
;
char
*
end
;
enum
fetch_step
step
;
/*
/*
* All fields from refcount and down are zeroed when the busyobj
* All fields from refcount and down are zeroed when the busyobj
...
@@ -532,6 +534,7 @@ struct busyobj {
...
@@ -532,6 +534,7 @@ struct busyobj {
intptr_t
vfps_priv
[
N_VFPS
];
intptr_t
vfps_priv
[
N_VFPS
];
int
vfp_nxt
;
int
vfp_nxt
;
int
failed
;
enum
busyobj_state_e
state
;
enum
busyobj_state_e
state
;
struct
ws
ws
[
1
];
struct
ws
ws
[
1
];
...
...
bin/varnishd/cache/cache_fetch.c
View file @
25b38f92
...
@@ -494,7 +494,7 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
...
@@ -494,7 +494,7 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
if
(
vbf_beresp2obj
(
bo
))
{
if
(
vbf_beresp2obj
(
bo
))
{
(
void
)
VFP_Error
(
bo
,
"Could not get storage"
);
(
void
)
VFP_Error
(
bo
,
"Could not get storage"
);
VDI_CloseFd
(
&
bo
->
vbc
);
VDI_CloseFd
(
&
bo
->
vbc
);
return
(
F_STP_
DONE
);
return
(
F_STP_
ERROR
);
}
}
assert
(
WRW_IsReleased
(
wrk
));
assert
(
WRW_IsReleased
(
wrk
));
...
@@ -526,7 +526,7 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
...
@@ -526,7 +526,7 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
VSLb
(
bo
->
vsl
,
SLT_Fetch_Body
,
"%u(%s)"
,
VSLb
(
bo
->
vsl
,
SLT_Fetch_Body
,
"%u(%s)"
,
bo
->
htc
.
body_status
,
body_status_2str
(
bo
->
htc
.
body_status
));
bo
->
htc
.
body_status
,
body_status_2str
(
bo
->
htc
.
body_status
));
if
(
bo
->
state
==
BOS_FAILED
)
{
if
(
bo
->
failed
)
{
wrk
->
stats
.
fetch_failed
++
;
wrk
->
stats
.
fetch_failed
++
;
}
else
{
}
else
{
if
(
bo
->
do_stream
)
if
(
bo
->
do_stream
)
...
@@ -553,16 +553,29 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
...
@@ -553,16 +553,29 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
}
}
}
}
if
(
!
bo
->
do_stream
&&
bo
->
state
!=
BOS_FAILED
)
if
(
!
bo
->
do_stream
)
{
if
(
bo
->
failed
)
{
if
(
bo
->
fetch_obj
!=
NULL
)
{
oc_freeobj
(
bo
->
fetch_objcore
);
bo
->
fetch_obj
=
NULL
;
bo
->
stats
->
n_object
--
;
}
return
(
F_STP_ERROR
);
}
else
{
HSH_Unbusy
(
&
wrk
->
stats
,
obj
->
objcore
);
HSH_Unbusy
(
&
wrk
->
stats
,
obj
->
objcore
);
VBO_setstate
(
bo
,
BOS_FINISHED
);
}
}
else
if
(
bo
->
failed
)
{
HSH_Fail
(
bo
->
fetch_objcore
);
VBO_setstate
(
bo
,
BOS_FAILED
);
}
else
{
VBO_setstate
(
bo
,
BOS_FINISHED
);
}
HSH_Complete
(
obj
->
objcore
);
HSH_Complete
(
obj
->
objcore
);
assert
(
bo
->
refcount
>=
1
);
assert
(
bo
->
refcount
>=
1
);
if
(
bo
->
state
!=
BOS_FAILED
)
VBO_setstate
(
bo
,
BOS_FINISHED
);
return
(
F_STP_DONE
);
return
(
F_STP_DONE
);
}
}
...
@@ -650,14 +663,16 @@ vbf_stp_condfetch(struct worker *wrk, struct busyobj *bo)
...
@@ -650,14 +663,16 @@ vbf_stp_condfetch(struct worker *wrk, struct busyobj *bo)
if
(
st
->
len
==
st
->
space
)
if
(
st
->
len
==
st
->
space
)
st
=
NULL
;
st
=
NULL
;
}
}
}
while
(
bo
->
state
<
BOS_FAILED
&&
}
while
(
!
bo
->
failed
&&
(
ois
==
OIS_DATA
||
ois
==
OIS_STREAM
));
(
ois
==
OIS_DATA
||
ois
==
OIS_STREAM
));
ObjIterEnd
(
&
oi
);
ObjIterEnd
(
&
oi
);
if
(
bo
->
state
!=
BOS_FAILED
)
{
if
(
!
bo
->
failed
)
{
assert
(
al
==
bo
->
ims_obj
->
len
);
assert
(
al
==
bo
->
ims_obj
->
len
);
assert
(
obj
->
len
==
al
);
assert
(
obj
->
len
==
al
);
VBO_setstate
(
bo
,
BOS_FINISHED
);
VBO_setstate
(
bo
,
BOS_FINISHED
);
EXP_Rearm
(
bo
->
ims_obj
,
bo
->
ims_obj
->
exp
.
t_origin
,
0
,
0
,
0
);
EXP_Rearm
(
bo
->
ims_obj
,
bo
->
ims_obj
->
exp
.
t_origin
,
0
,
0
,
0
);
}
else
{
HSH_Fail
(
bo
->
fetch_objcore
);
VBO_setstate
(
bo
,
BOS_FAILED
);
}
}
HSH_Complete
(
obj
->
objcore
);
HSH_Complete
(
obj
->
objcore
);
return
(
F_STP_DONE
);
return
(
F_STP_DONE
);
...
@@ -673,7 +688,7 @@ vbf_stp_error(struct worker *wrk, struct busyobj *bo)
...
@@ -673,7 +688,7 @@ vbf_stp_error(struct worker *wrk, struct busyobj *bo)
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
CHECK_OBJ_NOTNULL
(
wrk
,
WORKER_MAGIC
);
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
AN
(
bo
->
fetch_objcore
->
flags
&
=
OC_F_BUSY
);
AN
(
bo
->
fetch_objcore
->
flags
&
OC_F_BUSY
);
// XXX: reset all beresp flags ?
// XXX: reset all beresp flags ?
...
@@ -697,7 +712,9 @@ vbf_stp_error(struct worker *wrk, struct busyobj *bo)
...
@@ -697,7 +712,9 @@ vbf_stp_error(struct worker *wrk, struct busyobj *bo)
http_PrintfHeader
(
bo
->
beresp
,
"X-XXXPHK: yes"
);
http_PrintfHeader
(
bo
->
beresp
,
"X-XXXPHK: yes"
);
if
(
vbf_beresp2obj
(
bo
))
{
if
(
vbf_beresp2obj
(
bo
))
{
INCOMPL
();
VBO_setstate
(
bo
,
BOS_FAILED
);
HSH_Fail
(
bo
->
fetch_objcore
);
return
(
F_STP_DONE
);
}
}
HSH_Unbusy
(
&
wrk
->
stats
,
bo
->
fetch_obj
->
objcore
);
HSH_Unbusy
(
&
wrk
->
stats
,
bo
->
fetch_obj
->
objcore
);
...
@@ -739,7 +756,6 @@ vbf_fetch_thread(struct worker *wrk, void *priv)
...
@@ -739,7 +756,6 @@ vbf_fetch_thread(struct worker *wrk, void *priv)
while
(
stp
!=
F_STP_DONE
)
{
while
(
stp
!=
F_STP_DONE
)
{
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
bo
->
step
=
stp
;
switch
(
stp
)
{
switch
(
stp
)
{
#define FETCH_STEP(l, U, arg) \
#define FETCH_STEP(l, U, arg) \
case F_STP_##U: \
case F_STP_##U: \
...
...
bin/varnishd/cache/cache_fetch_proc.c
View file @
25b38f92
...
@@ -62,12 +62,11 @@ VFP_Error(struct busyobj *bo, const char *fmt, ...)
...
@@ -62,12 +62,11 @@ VFP_Error(struct busyobj *bo, const char *fmt, ...)
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
CHECK_OBJ_NOTNULL
(
bo
,
BUSYOBJ_MAGIC
);
assert
(
bo
->
state
>=
BOS_REQ_DONE
);
assert
(
bo
->
state
>=
BOS_REQ_DONE
);
if
(
bo
->
state
<
BOS_FAILED
)
{
if
(
!
bo
->
failed
)
{
va_start
(
ap
,
fmt
);
va_start
(
ap
,
fmt
);
VSLbv
(
bo
->
vsl
,
SLT_FetchError
,
fmt
,
ap
);
VSLbv
(
bo
->
vsl
,
SLT_FetchError
,
fmt
,
ap
);
va_end
(
ap
);
va_end
(
ap
);
HSH_Fail
(
bo
->
fetch_objcore
);
bo
->
failed
=
1
;
VBO_setstate
(
bo
,
BOS_FAILED
);
}
}
return
(
VFP_ERROR
);
return
(
VFP_ERROR
);
}
}
...
@@ -214,7 +213,7 @@ VFP_Fetch_Body(struct busyobj *bo, ssize_t est)
...
@@ -214,7 +213,7 @@ VFP_Fetch_Body(struct busyobj *bo, ssize_t est)
bo
->
should_close
=
1
;
bo
->
should_close
=
1
;
break
;
break
;
}
}
assert
(
bo
->
state
!=
BOS_FAILED
);
AZ
(
bo
->
failed
);
if
(
st
==
NULL
)
{
if
(
st
==
NULL
)
{
st
=
VFP_GetStorage
(
bo
,
est
);
st
=
VFP_GetStorage
(
bo
,
est
);
est
=
0
;
est
=
0
;
...
@@ -228,7 +227,7 @@ VFP_Fetch_Body(struct busyobj *bo, ssize_t est)
...
@@ -228,7 +227,7 @@ VFP_Fetch_Body(struct busyobj *bo, ssize_t est)
CHECK_OBJ_NOTNULL
(
st
,
STORAGE_MAGIC
);
CHECK_OBJ_NOTNULL
(
st
,
STORAGE_MAGIC
);
assert
(
st
==
VTAILQ_LAST
(
&
bo
->
fetch_obj
->
store
,
storagehead
));
assert
(
st
==
VTAILQ_LAST
(
&
bo
->
fetch_obj
->
store
,
storagehead
));
l
=
st
->
space
-
st
->
len
;
l
=
st
->
space
-
st
->
len
;
assert
(
bo
->
state
!=
BOS_FAILED
);
AZ
(
bo
->
failed
);
vfps
=
VFP_Suck
(
bo
,
st
->
ptr
+
st
->
len
,
&
l
);
vfps
=
VFP_Suck
(
bo
,
st
->
ptr
+
st
->
len
,
&
l
);
if
(
l
>
0
&&
vfps
!=
VFP_ERROR
)
{
if
(
l
>
0
&&
vfps
!=
VFP_ERROR
)
{
assert
(
!
VTAILQ_EMPTY
(
&
bo
->
fetch_obj
->
store
));
assert
(
!
VTAILQ_EMPTY
(
&
bo
->
fetch_obj
->
store
));
...
@@ -239,7 +238,7 @@ VFP_Fetch_Body(struct busyobj *bo, ssize_t est)
...
@@ -239,7 +238,7 @@ VFP_Fetch_Body(struct busyobj *bo, ssize_t est)
}
while
(
vfps
==
VFP_OK
);
}
while
(
vfps
==
VFP_OK
);
if
(
vfps
==
VFP_ERROR
)
{
if
(
vfps
==
VFP_ERROR
)
{
assert
(
bo
->
state
==
BOS_FAILED
);
AN
(
bo
->
failed
);
(
void
)
VFP_Error
(
bo
,
"Fetch Pipeline failed to process"
);
(
void
)
VFP_Error
(
bo
,
"Fetch Pipeline failed to process"
);
bo
->
should_close
=
1
;
bo
->
should_close
=
1
;
}
}
...
...
bin/varnishtest/tests/r01284.vtc
View file @
25b38f92
...
@@ -19,6 +19,10 @@ varnish v1 \
...
@@ -19,6 +19,10 @@ varnish v1 \
}
}
} -start
} -start
varnish v1 -cliok "param.set debug +syncvsl"
delay .1
client c1 {
client c1 {
# Fill transient
# Fill transient
txreq -url "/obj1"
txreq -url "/obj1"
...
@@ -26,6 +30,8 @@ client c1 {
...
@@ -26,6 +30,8 @@ client c1 {
expect resp.status == 200
expect resp.status == 200
} -run
} -run
delay .1
varnish v1 -expect SMA.Transient.g_bytes > 1048000
varnish v1 -expect SMA.Transient.g_bytes > 1048000
varnish v1 -expect SMA.Transient.g_space < 200
varnish v1 -expect SMA.Transient.g_space < 200
...
@@ -36,8 +42,8 @@ client c1 {
...
@@ -36,8 +42,8 @@ client c1 {
delay 1
delay 1
} -run
} -run
# T
wo failures, one for obj2 and one for the attempts at sending error
# T
hree failures, one for obj2, one for vcl_backend_error{} and for vcl_error{}
varnish v1 -expect SMA.Transient.c_fail ==
2
varnish v1 -expect SMA.Transient.c_fail ==
3
client c1 {
client c1 {
# Check that Varnish is still alive
# Check that Varnish is still alive
...
...
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