return oid.name;
   }
 
+  hobject_t make_temp_hobject(const string& name) const {
+    return hobject_t(object_t(name), "", CEPH_NOSNAP,
+                    hash,
+                    hobject_t::POOL_TEMP_START - pool, "");
+  }
+
   void swap(hobject_t &o) {
     hobject_t temp(o);
     o = (*this);
 
     tobj = ghobject_t(op.soid, ghobject_t::NO_GEN,
                      get_parent()->whoami_shard().shard);
   } else {
-    tobj = ghobject_t(get_parent()->get_temp_recovery_object(op.version,
-                                                            op.soid.snap),
+    tobj = ghobject_t(get_parent()->get_temp_recovery_object(op.soid,
+                                                            op.version),
                      ghobject_t::NO_GEN,
                      get_parent()->whoami_shard().shard);
     if (op.before_progress.first) {
 
 
      virtual uint64_t min_peer_features() const = 0;
 
-     virtual hobject_t get_temp_recovery_object(eversion_t version,
-                                               snapid_t snap) = 0;
+     virtual hobject_t get_temp_recovery_object(const hobject_t& target,
+                                               eversion_t version) = 0;
 
      virtual void send_message_osd_cluster(
        int peer, Message *m, epoch_t from_epoch) = 0;
 
   }
 }
 
-hobject_t PrimaryLogPG::generate_temp_object()
+hobject_t PrimaryLogPG::generate_temp_object(const hobject_t& target)
 {
   ostringstream ss;
-  ss << "temp_" << info.pgid << "_" << get_role() << "_" << osd->monc->get_global_id() << "_" << (++temp_seq);
-  hobject_t hoid = info.pgid.make_temp_hobject(ss.str());
+  ss << "temp_" << info.pgid << "_" << get_role()
+     << "_" << osd->monc->get_global_id() << "_" << (++temp_seq);
+  hobject_t hoid = target.make_temp_hobject(ss.str());
   dout(20) << __func__ << " " << hoid << dendl;
   return hoid;
 }
 
-hobject_t PrimaryLogPG::get_temp_recovery_object(eversion_t version, snapid_t snap)
+hobject_t PrimaryLogPG::get_temp_recovery_object(
+  const hobject_t& target,
+  eversion_t version)
 {
   ostringstream ss;
   ss << "temp_recovering_" << info.pgid  // (note this includes the shardid)
      << "_" << version
      << "_" << info.history.same_interval_since
-     << "_" << snap;
+     << "_" << target.snap;
   // pgid + version + interval + snapid is unique, and short
-  hobject_t hoid = info.pgid.make_temp_hobject(ss.str());
+  hobject_t hoid = target.make_temp_hobject(ss.str());
   dout(20) << __func__ << " " << hoid << dendl;
   return hoid;
 }
     if (cop->temp_cursor.is_initial()) {
       assert(!cop->results.started_temp_obj);
       cop->results.started_temp_obj = true;
-      cop->results.temp_oid = generate_temp_object();
+      cop->results.temp_oid = generate_temp_object(oid);
       dout(20) << __func__ << " using temp " << cop->results.temp_oid << dendl;
     }
     ObjectContextRef tempobc = get_object_context(cop->results.temp_oid, true);
 
   bool check_src_targ(const hobject_t& soid, const hobject_t& toid) const;
 
   uint64_t temp_seq; ///< last id for naming temp objects
-  hobject_t generate_temp_object();  ///< generate a new temp object name
+  /// generate a new temp object name
+  hobject_t generate_temp_object(const hobject_t& target);
   /// generate a new temp object name (for recovery)
-  hobject_t get_temp_recovery_object(eversion_t version,
-                                    snapid_t snap) override;
+  hobject_t get_temp_recovery_object(const hobject_t& target,
+                                    eversion_t version) override;
   int get_recovery_op_priority() const {
       int pri = 0;
       pool.info.opts.get(pool_opts_t::RECOVERY_OP_PRIORITY, &pri);
 
   if (first && complete) {
     target_oid = recovery_info.soid;
   } else {
-    target_oid = get_parent()->get_temp_recovery_object(recovery_info.version,
-                                                       recovery_info.soid.snap);
+    target_oid = get_parent()->get_temp_recovery_object(recovery_info.soid,
+                                                       recovery_info.version);
     if (first) {
       dout(10) << __func__ << ": Adding oid "
               << target_oid << " in the temp collection" << dendl;
 
     DECODE_FINISH(bl);
   }
 
-  hobject_t make_temp_hobject(const string& name) const {
-    return hobject_t(object_t(name), "", CEPH_NOSNAP,
-                    pgid.ps(),
-                    hobject_t::POOL_TEMP_START - pgid.pool(), "");
-  }
-
   ghobject_t make_temp_ghobject(const string& name) const {
     return ghobject_t(
       hobject_t(object_t(name), "", CEPH_NOSNAP,
 
     for (int i = 0; i < cfg.threads; i++) {
       std::stringstream oss;
       oss << "osbench-thread-" << i;
-      oids.emplace_back(pg.make_temp_hobject(oss.str()));
+      oids.emplace_back(hobject_t(sobject_t(oss.str(), CEPH_NOSNAP)));
 
       ObjectStore::Sequencer osr(__func__);
       ObjectStore::Transaction t;
       assert(r == 0);
     }
   } else {
-    oids.emplace_back(pg.make_temp_hobject("osbench"));
+    oids.emplace_back(hobject_t(sobject_t("osbench", CEPH_NOSNAP)));
 
     ObjectStore::Sequencer osr(__func__);
     ObjectStore::Transaction t;