]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
OSDMap: reset osd_primary_affinity shared_ptr when deepish_copy_from 7590/head
authorXinze Chi <xinze@xsky.com>
Sun, 7 Feb 2016 10:50:29 +0000 (18:50 +0800)
committerNathan Cutler <ncutler@suse.com>
Wed, 10 Feb 2016 07:25:18 +0000 (08:25 +0100)
Base on current logic, OSDMonitor may call create_pending and
encode_pending twice for the some epoch.

In encode_pending:

tmp.deepish_copy_from(osdmap);
tmp.apply_incremental(pending_inc);

This Op would change the tmp osd_primary_affinity, but the osd_primary_affinity
is declared as ceph::shared_ptr, so this would change the osdmap too. When this
round encode_pending is proposed fail. We may call encode_pending again, but the
osdmap is changed last round, so the pending_inc would be wrong.

Fixes: #14686
Signed-off-by: Xinze Chi <xinze@xsky.com>
(cherry picked from commit 990b437f4e616a87f4f7438e51945d531170ca83)

src/osd/OSDMap.h

index acdc3af4f2cf1d50b48f865c15ed84a3282f21a4..501453f5bf80f4cf010f66ed9cdbbc11c0b4921e 100644 (file)
@@ -293,6 +293,9 @@ public:
     pg_temp.reset(new map<pg_t,vector<int32_t> >(*o.pg_temp));
     osd_uuid.reset(new vector<uuid_d>(*o.osd_uuid));
 
+    if (o.osd_primary_affinity)
+      osd_primary_affinity.reset(new vector<__u32>(*o.osd_primary_affinity));
+
     // NOTE: this still references shared entity_addr_t's.
     osd_addrs.reset(new addrs_s(*o.osd_addrs));