]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: consolidate trim logic in calc_trim_to()
authorSage Weil <sage@newdream.net>
Thu, 18 Jun 2009 22:48:31 +0000 (15:48 -0700)
committerSage Weil <sage@newdream.net>
Thu, 18 Jun 2009 23:42:34 +0000 (16:42 -0700)
And call it from trim_peers(), so that we always apply the same
conditions on log trimming.

This ensures we don't trim the logs while degraded through one of
the other paths.

src/osd/PG.cc
src/osd/PG.h
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index d65a1880ee6f12fff89a9a705cba0da72da185b1..6e9d691a446a494c6763513e982bd0b0d5acbec1 100644 (file)
@@ -1745,10 +1745,14 @@ void PG::trim_ondisklog_to(ObjectStore::Transaction& t, eversion_t v)
 
 void PG::trim_peers()
 {
-  dout(10) << "trim_peers" << dendl;
-  for (unsigned i=1; i<acting.size(); i++)
-    osd->messenger->send_message(new MOSDPGTrim(osd->osdmap->get_epoch(), info.pgid, min_last_complete_ondisk),
-                                osd->osdmap->get_inst(acting[i]));
+  calc_trim_to();
+  dout(10) << "trim_peers " << pg_trim_to << dendl;
+  if (pg_trim_to != eversion_t()) {
+    for (unsigned i=1; i<acting.size(); i++)
+      osd->messenger->send_message(new MOSDPGTrim(osd->osdmap->get_epoch(), info.pgid,
+                                                 pg_trim_to),
+                                  osd->osdmap->get_inst(acting[i]));
+  }
 }
 
 
index 336f4ac9a8a7168b9f5afa4e177a6dd1ddeb164c..6ce0a84a594f2a8c1b7b00b43aafe764a56dc525 100644 (file)
@@ -659,14 +659,17 @@ protected:
   int         role;    // 0 = primary, 1 = replica, -1=none.
   int         state;   // see bit defns above
 
+public:
+  eversion_t  last_complete_ondisk;  // last_complete that has committed.
+
   // primary state
  public:
   vector<int> acting;
-  eversion_t  last_complete_ondisk;  // last_complete that has committed.
-
-  // [primary only] content recovery state
   map<int,eversion_t> peer_last_complete_ondisk;
   eversion_t  min_last_complete_ondisk;  // min over last_complete_ondisk, peer_last_complete_ondisk
+  eversion_t  pg_trim_to;
+
+  // [primary only] content recovery state
   bool        have_master_log;
  protected:
   set<int>    prior_set;   // current+prior OSDs, as defined by info.history.last_epoch_started.
@@ -741,6 +744,8 @@ public:
     return true;
   }
 
+  virtual void calc_trim_to() = 0;
+
   void proc_replica_log(ObjectStore::Transaction& t, Info &oinfo, Log &olog, Missing& omissing, int from);
   bool merge_old_entry(ObjectStore::Transaction& t, Log::Entry& oe);
   void merge_log(ObjectStore::Transaction& t, Info &oinfo, Log &olog, Missing& omissing, int from);
index 033471fdc2b4663637b3948a4036b2c8ed629e5d..288168943b0ac4e217334f5704b7a3162ab89147 100644 (file)
@@ -413,6 +413,18 @@ void ReplicatedPG::do_pg_op(MOSDOp *op)
   delete op;
 }
 
+void ReplicatedPG::calc_trim_to()
+{
+  if (is_clean() ||
+      log.top.version - log.bottom.version > info.stats.num_objects) {
+    pg_trim_to = min_last_complete_ondisk;
+    if (pg_trim_to != eversion_t()) {
+      assert(pg_trim_to >= log.bottom);
+      assert(pg_trim_to <= log.top);
+    }
+  } else
+    pg_trim_to = eversion_t();
+}
 
 /** do_op - do an op
  * pg lock will be held (if multithreaded)
@@ -553,11 +565,9 @@ void ReplicatedPG::do_op(MOSDOp *op)
     assert(op->may_write());
 
     // trim log?
-    if (is_clean() ||
-       log.top.version - log.bottom.version > info.stats.num_objects)
-      ctx->trim_to = min_last_complete_ondisk;
+    calc_trim_to();
 
-    log_op(ctx->log, ctx->trim_to, ctx->local_t);
+    log_op(ctx->log, pg_trim_to, ctx->local_t);
   }
   
   // continuing on to write path, make sure object context is registered
@@ -1668,7 +1678,7 @@ void ReplicatedPG::issue_repop(RepGather *repop, int dest, utime_t now,
     ::encode(repop->ctx->log, wr->logbl);
   }
 
-  wr->pg_trim_to = repop->ctx->trim_to;
+  wr->pg_trim_to = pg_trim_to;
   wr->peer_stat = osd->get_my_stat_for(now, dest);
   osd->messenger->send_message(wr, osd->osdmap->get_inst(dest));
 }
index 7f6b6e35473fea05e0b2abdb3b5cf504575a4a9b..439010e79d9ff38660a1ae418ef88c6cd93f2be1 100644 (file)
@@ -246,7 +246,6 @@ public:
 
     ObjectStore::Transaction op_t, local_t;
     vector<PG::Log::Entry> log;
-    eversion_t trim_to;
 
     ObjectContext *clone_obc;    // if we created a clone
 
@@ -437,6 +436,7 @@ protected:
 
   void apply_and_flush_repops(bool requeue);
 
+  void calc_trim_to();
 
 public:
   ReplicatedPG(OSD *o, PGPool *_pool, pg_t p, const sobject_t& oid) :