]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
OSDMap: reset osd_primary_affinity shared_ptr when deepish_copy_from 7553/head
authorXinze Chi <xinze@xsky.com>
Sun, 7 Feb 2016 10:50:29 +0000 (18:50 +0800)
committerXinze Chi <xinze@xsky.com>
Sun, 7 Feb 2016 14:19:35 +0000 (22:19 +0800)
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>
src/osd/OSDMap.h

index 55b4ec1367dadb7bbd656bb80e2344daa6287fe1..d7da807c875fdcc0bf2ecd579d8020c8fb9c0f26 100644 (file)
@@ -296,6 +296,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));