Commit 7662d8ff57d2b00ce8f7fe0b60a85efbb2c05652
1 parent
9db4b3e327
Exists in
master
and in
4 other branches
libceph: handle new osdmap down/state change encoding
Old incrementals encode a 0 value (nearly always) when an osd goes down. Change that to allow any state bit(s) to be flipped. Special case 0 to mean flip the CEPH_OSD_UP bit to mimic the old behavior. Signed-off-by: Sage Weil <sage@newdream.net>
Showing 1 changed file with 8 additions and 3 deletions Side-by-side Diff
net/ceph/osdmap.c
... | ... | @@ -830,15 +830,20 @@ |
830 | 830 | map->osd_addr[osd] = addr; |
831 | 831 | } |
832 | 832 | |
833 | - /* new_down */ | |
833 | + /* new_state */ | |
834 | 834 | ceph_decode_32_safe(p, end, len, bad); |
835 | 835 | while (len--) { |
836 | 836 | u32 osd; |
837 | + u8 xorstate; | |
837 | 838 | ceph_decode_32_safe(p, end, osd, bad); |
839 | + xorstate = **(u8 **)p; | |
838 | 840 | (*p)++; /* clean flag */ |
839 | - pr_info("osd%d down\n", osd); | |
841 | + if (xorstate == 0) | |
842 | + xorstate = CEPH_OSD_UP; | |
843 | + if (xorstate & CEPH_OSD_UP) | |
844 | + pr_info("osd%d down\n", osd); | |
840 | 845 | if (osd < map->max_osd) |
841 | - map->osd_state[osd] &= ~CEPH_OSD_UP; | |
846 | + map->osd_state[osd] ^= xorstate; | |
842 | 847 | } |
843 | 848 | |
844 | 849 | /* new_weight */ |