libceph: new pi->last_force_request_resend
authorIlya Dryomov <idryomov@gmail.com>
Mon, 5 Jun 2017 12:45:00 +0000 (14:45 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Fri, 7 Jul 2017 15:25:15 +0000 (17:25 +0200)
The old (v15) pi->last_force_request_resend has been repurposed to
make pre-RESEND_ON_SPLIT clients that don't check for PG splits but do
obey pi->last_force_request_resend resend on splits.  See ceph.git
commit 189ca7ec6420 ("mon/OSDMonitor: make pre-luminous clients resend
ops on split").

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
net/ceph/osdmap.c

index bf2fcc837e3661d6dfa6aa45e2179ca6e6cb1cf3..710ee3dc01b9bb31201d73848dcdd90c3a77d87a 100644 (file)
@@ -682,11 +682,48 @@ static int decode_pool(void **p, void *end, struct ceph_pg_pool_info *pi)
                *p += len;
        }
 
+       /*
+        * last_force_op_resend_preluminous, will be overridden if the
+        * map was encoded with RESEND_ON_SPLIT
+        */
        if (ev >= 15)
                pi->last_force_request_resend = ceph_decode_32(p);
        else
                pi->last_force_request_resend = 0;
 
+       if (ev >= 16)
+               *p += 4; /* skip min_read_recency_for_promote */
+
+       if (ev >= 17)
+               *p += 8; /* skip expected_num_objects */
+
+       if (ev >= 19)
+               *p += 4; /* skip cache_target_dirty_high_ratio_micro */
+
+       if (ev >= 20)
+               *p += 4; /* skip min_write_recency_for_promote */
+
+       if (ev >= 21)
+               *p += 1; /* skip use_gmt_hitset */
+
+       if (ev >= 22)
+               *p += 1; /* skip fast_read */
+
+       if (ev >= 23) {
+               *p += 4; /* skip hit_set_grade_decay_rate */
+               *p += 4; /* skip hit_set_search_last_n */
+       }
+
+       if (ev >= 24) {
+               /* skip opts */
+               *p += 1 + 1; /* versions */
+               len = ceph_decode_32(p);
+               *p += len;
+       }
+
+       if (ev >= 25)
+               pi->last_force_request_resend = ceph_decode_32(p);
+
        /* ignore the rest */
 
        *p = pool_end;