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 {
#define RDR_ERROR (1 << 1)
#define RDR_MAPPED (1 << 2)
#define RDR_TIMER_INIT (1 << 3)
#define RDR_DELETED (1 << 4)
#define RDR_WARMUP (1 << 5)
#define RDR_TIMER_ON (1 << 4)
#define RDR_DELETED (1 << 5)
#define RDR_WARMUP (1 << 6)
struct VPFX(file_reader) {
unsigned magic;
......@@ -473,6 +474,7 @@ vmod_reader__init(VRT_CTX, struct VPFX(file_reader) **rdrp,
return;
}
rdr->timerid = timerid;
rdr->flags |= RDR_TIMER_INIT;
timerspec.it_value.tv_sec = 0;
timerspec.it_value.tv_nsec = 1;
......@@ -504,7 +506,7 @@ vmod_reader__init(VRT_CTX, struct VPFX(file_reader) **rdrp,
VAS_errtxt(errno));
return;
}
rdr->flags |= RDR_TIMER_INIT;
rdr->flags |= RDR_TIMER_ON;
do {
VTIM_sleep(INIT_SLEEP_INTERVAL);
} 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)
AN(rdr->obj_name);
AN(rdr->errbuf);
if (rdr->flags & RDR_TIMER_INIT)
if (rdr->flags & RDR_TIMER_ON)
continue;
rdr->flags |= RDR_WARMUP;
......@@ -899,6 +901,7 @@ VPFX(event)(VRT_CTX, struct vmod_priv *priv, enum vcl_event_e e)
flags = rdr->flags;
AZ(pthread_rwlock_unlock(rdr->lock));
} while (flags & RDR_WARMUP);
rdr->flags |= RDR_TIMER_ON;
if (rdr->flags & RDR_ERROR) {
AN(strcmp(rdr->errbuf, NO_ERR));
......@@ -941,7 +944,7 @@ VPFX(event)(VRT_CTX, struct vmod_priv *priv, enum vcl_event_e e)
VAS_errtxt(errno));
continue;
}
rdr->flags &= ~RDR_TIMER_INIT;
rdr->flags &= ~RDR_TIMER_ON;
VSL(SLT_Debug, NO_VXID, "vmod file: %s.%s: timer suspended",
rdr->vcl_name, rdr->obj_name);
......
......@@ -4,7 +4,9 @@ varnishtest "reader constructor and .get()"
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;
backend b None;
......@@ -51,6 +53,10 @@ varnish v1 -vcl {
client c1 -run
# Tests object finalization.
varnish v1 -cliok "vcl.discard vcl1"
varnish v1 -cli "vcl.list"
varnish v1 -vcl {
import file;
backend b None;
......@@ -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);
}
}
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