[Varnish] #634: Race between HSH_Lookup and EXP_NukeOne

Varnish varnish-bugs at projects.linpro.no
Thu Jan 28 05:09:48 CET 2010

#634: Race between HSH_Lookup and EXP_NukeOne
 Reporter:  mpage     |       Owner:  phk  
     Type:  defect    |      Status:  new  
 Priority:  high      |   Milestone:       
Component:  varnishd  |     Version:  trunk
 Severity:  major     |    Keywords:       
 There is a race that we are encountering frequently when running varnish
 trunk with the file store. The race occurs between HSH_Lookup() and
 EXP_NukeOne(). Here is a brief narrative of what happens:

 Thread T1 is executing HSH_Lookup(). It finds an objcore oc it likes but
 is descheduled prior to line 406. Another thread T2 is scheduled and
 executes EXP_NukeOne(). It finds the objcore oc about to be returned by
 HSH_Lookup() at the head of the LRU with an object of refcnt 1 (since T1
 was descheduled before it could increment the refcnt on oc->obj). It then

 HSH_Deref(sp->wrk, &(oc->obj));

 When T1 is rescheduled and wakes up oc->obj is now NULL (because of T2)
 and the assert on 408 (of cache_hash.c) is triggered.

 I'm not sure why EXP_NukeOne needs to call HSH_Deref with a pointer to
 oc->obj. The objcore oc is what is stored in the objhead, so nulling
 oc->obj seems like a bad idea. I've attached a diff with a possible fix.

Ticket URL: <http://varnish-cache.org/ticket/634>
Varnish <http://varnish.projects.linpro.no/>
The Varnish HTTP Accelerator

More information about the varnish-bugs mailing list