]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG: requeue in_progress_async_reads on_change
authorSamuel Just <sam.just@inktank.com>
Thu, 2 Jan 2014 15:34:16 +0000 (07:34 -0800)
committerSamuel Just <sam.just@inktank.com>
Wed, 22 Jan 2014 22:39:17 +0000 (14:39 -0800)
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index 03bd4e4057a9a3e86afdedaab56fe05ca7207a55..d0c9338a98e7c6310ecbecc7babdd668f7d8f075 100644 (file)
@@ -130,9 +130,9 @@ void ReplicatedPG::OpContext::finish_read(ReplicatedPG *pg)
   assert(inflightreads > 0);
   --inflightreads;
   if (async_reads_complete()) {
-    set<OpContext*>::iterator iter = pg->in_progress_async_reads.find(this);
-    assert(iter != pg->in_progress_async_reads.end());
-    pg->in_progress_async_reads.erase(iter);
+    assert(pg->in_progress_async_reads.size());
+    assert(pg->in_progress_async_reads.front().second == this);
+    pg->in_progress_async_reads.pop_front();
     pg->complete_read_ctx(async_read_result, this);
   }
 }
@@ -1668,7 +1668,7 @@ void ReplicatedPG::execute_ctx(OpContext *ctx)
     if (ctx->pending_async_reads.empty()) {
       complete_read_ctx(result, ctx);
     } else {
-      in_progress_async_reads.insert(ctx);
+      in_progress_async_reads.push_back(make_pair(op, ctx));
       ctx->start_async_reads(this);
     }
     return;
@@ -8655,10 +8655,12 @@ void ReplicatedPG::on_change(ObjectStore::Transaction *t)
 
   context_registry_on_change();
 
-  for (set<OpContext*>::iterator i = in_progress_async_reads.begin();
+  for (list<pair<OpRequestRef, OpContext*> >::iterator i =
+         in_progress_async_reads.begin();
        i != in_progress_async_reads.end();
        in_progress_async_reads.erase(i++)) {
-    close_op_ctx(*i);
+    close_op_ctx(i->second);
+    requeue_op(i->first);
   }
 
   cancel_copy_ops(is_primary());
index cb1c7327a0a13381090a9c02ff8c87ca82f6959f..30dc09ffc80c0aa18150e2263473231086f6df2d 100644 (file)
@@ -891,7 +891,7 @@ protected:
   bool can_skip_promote(OpRequestRef op, ObjectContextRef obc);
 
   int prepare_transaction(OpContext *ctx);
-  set<OpContext*> in_progress_async_reads;
+  list<pair<OpRequestRef, OpContext*> > in_progress_async_reads;
   void complete_read_ctx(int result, OpContext *ctx);
   
   // pg on-disk content