Commit 33f3bd64 authored by Geoff Simmons's avatar Geoff Simmons

Fix a resource leak in object finalization -- timers were never deleted.

parent 1e5a4313
...@@ -94,8 +94,9 @@ struct file_info { ...@@ -94,8 +94,9 @@ struct file_info {
#define RDR_ERROR (1 << 1) #define RDR_ERROR (1 << 1)
#define RDR_MAPPED (1 << 2) #define RDR_MAPPED (1 << 2)
#define RDR_TIMER_INIT (1 << 3) #define RDR_TIMER_INIT (1 << 3)
#define RDR_DELETED (1 << 4) #define RDR_TIMER_ON (1 << 4)
#define RDR_WARMUP (1 << 5) #define RDR_DELETED (1 << 5)
#define RDR_WARMUP (1 << 6)
struct VPFX(file_reader) { struct VPFX(file_reader) {
unsigned magic; unsigned magic;
...@@ -473,6 +474,7 @@ vmod_reader__init(VRT_CTX, struct VPFX(file_reader) **rdrp, ...@@ -473,6 +474,7 @@ vmod_reader__init(VRT_CTX, struct VPFX(file_reader) **rdrp,
return; return;
} }
rdr->timerid = timerid; rdr->timerid = timerid;
rdr->flags |= RDR_TIMER_INIT;
timerspec.it_value.tv_sec = 0; timerspec.it_value.tv_sec = 0;
timerspec.it_value.tv_nsec = 1; timerspec.it_value.tv_nsec = 1;
...@@ -504,7 +506,7 @@ vmod_reader__init(VRT_CTX, struct VPFX(file_reader) **rdrp, ...@@ -504,7 +506,7 @@ vmod_reader__init(VRT_CTX, struct VPFX(file_reader) **rdrp,
VAS_errtxt(errno)); VAS_errtxt(errno));
return; return;
} }
rdr->flags |= RDR_TIMER_INIT; rdr->flags |= RDR_TIMER_ON;
do { do {
VTIM_sleep(INIT_SLEEP_INTERVAL); VTIM_sleep(INIT_SLEEP_INTERVAL);
} while ((rdr->flags & (RDR_INITIALIZED | RDR_ERROR)) == 0); } while ((rdr->flags & (RDR_INITIALIZED | RDR_ERROR)) == 0);
...@@ -865,7 +867,7 @@ VPFX(event)(VRT_CTX, struct vmod_priv *priv, enum vcl_event_e e) ...@@ -865,7 +867,7 @@ VPFX(event)(VRT_CTX, struct vmod_priv *priv, enum vcl_event_e e)
AN(rdr->obj_name); AN(rdr->obj_name);
AN(rdr->errbuf); AN(rdr->errbuf);
if (rdr->flags & RDR_TIMER_INIT) if (rdr->flags & RDR_TIMER_ON)
continue; continue;
rdr->flags |= RDR_WARMUP; rdr->flags |= RDR_WARMUP;
...@@ -899,6 +901,7 @@ VPFX(event)(VRT_CTX, struct vmod_priv *priv, enum vcl_event_e e) ...@@ -899,6 +901,7 @@ VPFX(event)(VRT_CTX, struct vmod_priv *priv, enum vcl_event_e e)
flags = rdr->flags; flags = rdr->flags;
AZ(pthread_rwlock_unlock(rdr->lock)); AZ(pthread_rwlock_unlock(rdr->lock));
} while (flags & RDR_WARMUP); } while (flags & RDR_WARMUP);
rdr->flags |= RDR_TIMER_ON;
if (rdr->flags & RDR_ERROR) { if (rdr->flags & RDR_ERROR) {
AN(strcmp(rdr->errbuf, NO_ERR)); AN(strcmp(rdr->errbuf, NO_ERR));
...@@ -941,7 +944,7 @@ VPFX(event)(VRT_CTX, struct vmod_priv *priv, enum vcl_event_e e) ...@@ -941,7 +944,7 @@ VPFX(event)(VRT_CTX, struct vmod_priv *priv, enum vcl_event_e e)
VAS_errtxt(errno)); VAS_errtxt(errno));
continue; continue;
} }
rdr->flags &= ~RDR_TIMER_INIT; rdr->flags &= ~RDR_TIMER_ON;
VSL(SLT_Debug, NO_VXID, "vmod file: %s.%s: timer suspended", VSL(SLT_Debug, NO_VXID, "vmod file: %s.%s: timer suspended",
rdr->vcl_name, rdr->obj_name); rdr->vcl_name, rdr->obj_name);
......
...@@ -4,7 +4,9 @@ varnishtest "reader constructor and .get()" ...@@ -4,7 +4,9 @@ varnishtest "reader constructor and .get()"
shell {echo -n "foo bar baz quux" > ${tmpdir}/file} shell {echo -n "foo bar baz quux" > ${tmpdir}/file}
varnish v1 -vcl { # Debug param vclrel causes VCLs to be released without delay, making
# it possible to check the effects of VCL discard and object finalization.
varnish v1 -arg "-p debug=+vclrel" -vcl {
import file; import file;
backend b None; backend b None;
...@@ -51,6 +53,10 @@ varnish v1 -vcl { ...@@ -51,6 +53,10 @@ varnish v1 -vcl {
client c1 -run client c1 -run
# Tests object finalization.
varnish v1 -cliok "vcl.discard vcl1"
varnish v1 -cli "vcl.list"
varnish v1 -vcl { varnish v1 -vcl {
import file; import file;
backend b None; backend b None;
...@@ -213,6 +219,3 @@ varnish v1 -errvcl {vmod file failure: new rdr: ttl -1.000 must be >= 0s} { ...@@ -213,6 +219,3 @@ varnish v1 -errvcl {vmod file failure: new rdr: ttl -1.000 must be >= 0s} {
new rdr = file.reader("foo", ttl=-1s); new rdr = file.reader("foo", ttl=-1s);
} }
} }
varnish v1 -cliok "vcl.discard vcl1"
varnish v1 -cli "vcl.list"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment