1- encode into a sized buffer.
2- do not needlessly copy the set<> to a vector<> before encoding.
set<> and vector<> encode identically. Since we are converting from sorted
set<> to unsorted vector<>, the order doesn't change either.
Signed-off-by: Sage Weil <sage@redhat.com>
if (entry &&
entry->is_modify() &&
op.updated_snaps) {
- vector<snapid_t> snaps(
- op.updated_snaps->second.begin(),
- op.updated_snaps->second.end());
- ::encode(snaps, entry->snaps);
+ bufferlist bl(op.updated_snaps->second.size() * 8 + 8);
+ ::encode(op.updated_snaps->second, bl);
+ entry->snaps.swap(bl);
}
ldpp_dout(dpp, 20) << "generate_transactions: "
le.mark_unrollbackable();
auto oiter = pgt->op_map.find(le.soid);
if (oiter != pgt->op_map.end() && oiter->second.updated_snaps) {
- vector<snapid_t> snaps(
- oiter->second.updated_snaps->second.begin(),
- oiter->second.updated_snaps->second.end());
- ::encode(snaps, le.snaps);
+ bufferlist bl(oiter->second.updated_snaps->second.size() * 8 + 8);
+ ::encode(oiter->second.updated_snaps->second, bl);
+ le.snaps.swap(bl);
}
}