• Ilya Dryomov's avatar
    libceph: request a new osdmap if lingering request maps to no osd · b0494532
    Ilya Dryomov authored
    This commit does two things.  First, if there are any homeless
    lingering requests, we now request a new osdmap even if the osdmap that
    is being processed brought no changes, i.e. if a given lingering
    request turned homeless in one of the previous epochs and remained
    homeless in the current epoch.  Not doing so leaves us with a stale
    osdmap and as a result we may miss our window for reestablishing the
    watch and lose notifies.
    
    MON=1 OSD=1:
    
        # cat linger-needmap.sh
        #!/bin/bash
        rbd create --size 1 test
        DEV=$(rbd map test)
        ceph osd out 0
        rbd map dne/dne # obtain a new osdmap as a side effect (!)
        sleep 1
        ceph osd in 0
        rbd resize --size 2 test
        # rbd info test | grep size -> 2M
        # blockdev --getsize $DEV -> 1M
    
    N.B.: Not obtaining a new osdmap in between "osd out" and "osd in"
    above is enough to make it miss that resize notify, but that is a
    bug^Wlimitation of ceph watch/notify v1.
    
    Second, homeless lingering requests are now kicked just like those
    lingering requests whose mapping has changed.  This is mainly to
    recognize that a homeless lingering request makes no sense and to
    preserve the invariant that a registered lingering request is not
    sitting on any of r_req_lru_item lists.  This spares us a WARN_ON,
    which commit ba9d114e ("libceph: clear r_req_lru_item in
    __unregister_linger_request()") tried to fix the _wrong_ way.
    
    Cc: stable@vger.kernel.org # 3.10+
    Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
    Reviewed-by: default avatarSage Weil <sage@redhat.com>
    b0494532
osd_client.c 78.5 KB