r2232 - trunk/varnish-cache/bin/varnishd
Dag-Erling Smørgrav
des at linpro.no
Fri Nov 9 11:45:18 CET 2007
Dag-Erling Smørgrav <des at linpro.no> writes:
> "Poul-Henning Kamp" <phk at phk.freebsd.dk> writes:
> > If we get two events for the fd in the same batch, this fix will
> > not save us. I'm not sure if FreeBSD's current kqueue implementation
> > prevents that from happening.
> I think that in such a case, we would get a single kevent with
> (kp->data > 0) and (kp->flags & EV_EOF). I'll have to check the code
> to be sure.
I checked the code, this is indeed the case.
The bad news is that we just caught an assert in SES_Delete() again,
so there must be another bug in here somewhere.
More thinking:
- VTAILQ_REMOVE() is not idempotent, removing an element from the
list twice (as will happen when this race occurs) will corrupt the
list.
- The tail queue should probably be a binary heap instead.
- kevent changes can be buffered safely if we flush the buffer at the
end of the loop in vca_kqueue_main(). Since we process (at most)
NKEV kevents at a time, we will never have more than NKEV kevent
changes to apply at that point, so it's safe to use a static
buffer.
DES
--
Dag-Erling Smørgrav
Senior Software Developer
Linpro AS - www.linpro.no
More information about the varnish-commit
mailing list