libceph: handle new osdmap down/state change encoding
authorSage Weil <sage@newdream.net>
Tue, 3 May 2011 19:52:05 +0000 (12:52 -0700)
committerSage Weil <sage@newdream.net>
Tue, 24 May 2011 18:52:09 +0000 (11:52 -0700)
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>
net/ceph/osdmap.c

index 94f068dda433341920f5102293af894d51ed28b9..e97c3588c3ec00e719f7cb400784c36b5cb2fad6 100644 (file)
@@ -830,15 +830,20 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
                map->osd_addr[osd] = addr;
        }
 
-       /* new_down */
+       /* new_state */
        ceph_decode_32_safe(p, end, len, bad);
        while (len--) {
                u32 osd;
+               u8 xorstate;
                ceph_decode_32_safe(p, end, osd, bad);
+               xorstate = **(u8 **)p;
                (*p)++;  /* clean flag */
-               pr_info("osd%d down\n", osd);
+               if (xorstate == 0)
+                       xorstate = CEPH_OSD_UP;
+               if (xorstate & CEPH_OSD_UP)
+                       pr_info("osd%d down\n", osd);
                if (osd < map->max_osd)
-                       map->osd_state[osd] &= ~CEPH_OSD_UP;
+                       map->osd_state[osd] ^= xorstate;
        }
 
        /* new_weight */