• Martin Blix Grydeland's avatar
    Resolve race on waitinglist rushing between HSH_Unbusy and boc->state · a280f82b
    Martin Blix Grydeland authored
    This is the second attempt at a fix for this, the previous one was
    reverted.
    
    When an object is ready for delivery, HSH_Unbusy was called before calling
    ObjSetState([BOS_STREAM|BOS_FINISHED]). The HSH_Unbusy() call does the
    waitinglist rushing, but HSH_Lookup() wanted to look at the boc->state and
    if BOS_STREAM had been reached. This could cause requests woken to find
    that the stream state still hadn't been reached (ObjSetState still hadn't
    executed), and go back on the waitinglist.
    
    To fix this, this patch reverts commit
    0375791c, and goes back to considering
    OC_F_BUSY as the gate keeper for HSH_Lookup. This eliminates the race,
    because HSH_Unbusy and HSH_Lookup then uses the same mutex.
    
    That change opens up the possiblity that req code after HSH_Lookup() sees
    an object that has not yet reached BOS_STREAM. To counter this, once a boc
    reference is found during delivery, an ObjWaitState(BOS_STREAM) is done
    before continuing.
    
    Lastly, an ObjSetState(BOS_PREP_STREAM) is added just before HSH_Unbusy()
    in vbf_stp_error() and vbf_stp_fetchend() for the case where
    do_stream==false. This makes the order of events consistent throughout.
    a280f82b
cache_req_fsm.c 27.5 KB