libceph: resubmit linger ops when pg mapping changes
authorSage Weil <sage@inktank.com>
Mon, 30 Jul 2012 23:19:28 +0000 (16:19 -0700)
committerSage Weil <sage@inktank.com>
Tue, 31 Jul 2012 01:15:31 +0000 (18:15 -0700)
commit6194ea895e447fdf4adfd23f67873a32bf4f15ae
tree89a9642972fa31892a62665b13881794988f01d4
parent8c50c817566dfa4581f82373aac39f3e608a7dc8
libceph: resubmit linger ops when pg mapping changes

The linger op registration (i.e., watch) modifies the object state.  As
such, the OSD will reply with success if it has already applied without
doing the associated side-effects (setting up the watch session state).
If we lose the ACK and resubmit, we will see success but the watch will not
be correctly registered and we won't get notifies.

To fix this, always resubmit the linger op with a new tid.  We accomplish
this by re-registering as a linger (i.e., 'registered') if we are not yet
registered.  Then the second loop will treat this just like a normal
case of re-registering.

This mirrors a similar fix on the userland ceph.git, commit 5dd68b95, and
ceph bug #2796.

Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Alex Elder <elder@inktank.com>
Reviewed-by: Yehuda Sadeh <yehuda@inktank.com>
net/ceph/osd_client.c