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)
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));