@@ -92,7 +92,11 @@ ReplicatedBackend::submit_transaction(
9292
9393 const ceph_tid_t tid = shard_services.get_tid ();
9494 auto pending_txn =
95- pending_trans.try_emplace (tid, pg_shards.size (), osd_op_p.at_version ).first ;
95+ pending_trans.try_emplace (
96+ tid,
97+ pg_shards.size (),
98+ osd_op_p.at_version ,
99+ pg.get_last_complete ()).first ;
96100 bufferlist encoded_txn;
97101 encode (txn, encoded_txn);
98102
@@ -162,10 +166,13 @@ ReplicatedBackend::submit_transaction(
162166 assert (0 == " impossible" );
163167 }
164168 if (--peers->pending == 0 ) {
169+ // no peers other than me, replication size is 1
170+ pg.complete_write (peers->at_version , peers->last_complete );
165171 peers->all_committed .set_value ();
166172 peers->all_committed = {};
167173 return seastar::now ();
168174 }
175+ // wait for all peers to ack (ReplicatedBackend::got_rep_op_reply)
169176 return peers->all_committed .get_shared_future ();
170177 }).then_interruptible ([pending_txn, this , _new_clone, &hoid,
171178 to_push_delete=std::move (to_push_delete),
@@ -181,8 +188,7 @@ ReplicatedBackend::submit_transaction(
181188 if (!to_push_delete.empty ()) {
182189 pg.enqueue_delete_for_backfill (hoid, {}, to_push_delete);
183190 }
184- return seastar::make_ready_future<
185- crimson::osd::acked_peers_t >(std::move (acked_peers));
191+ return seastar::now ();
186192 });
187193
188194 auto sends_complete = seastar::when_all_succeed (
@@ -212,7 +218,10 @@ void ReplicatedBackend::got_rep_op_reply(const MOSDRepOpReply& reply)
212218 for (auto & peer : peers.acked_peers ) {
213219 if (peer.shard == reply.from ) {
214220 peer.last_complete_ondisk = reply.get_last_complete_ondisk ();
221+ pg.update_peer_last_complete_ondisk (
222+ peer.shard , peer.last_complete_ondisk );
215223 if (--peers.pending == 0 ) {
224+ pg.complete_write (peers.at_version , peers.last_complete );
216225 peers.all_committed .set_value ();
217226 peers.all_committed = {};
218227 }
0 commit comments