]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG,PG: update snap_collections on replica
authorSamuel Just <samuel.just@dreamhost.com>
Wed, 8 Jun 2011 18:23:56 +0000 (11:23 -0700)
committerSamuel Just <samuel.just@dreamhost.com>
Wed, 22 Jun 2011 18:41:17 +0000 (11:41 -0700)
Previously, snap_collections did not get updated on the replica.  As a
result, snap collections would not necessarily get trimmed when the
replica recieved and updated purged_snaps via a pg info from the
primary.  Now, the log entries in sub_op_modified are scanned to check
for any new snap collections.  The first and last snaps on a clone entry
are possibly new snap collections.

Signed-off-by: Samuel Just <samuel.just@dreamhost.com>
src/osd/PG.cc
src/osd/PG.h
src/osd/ReplicatedPG.cc

index 5e56197a28ab7f382eff854c07a00aebd8ba273f..9f1abf6bf0a8f1b47a6a955e0b373bb8a9925fc7 100644 (file)
@@ -2507,6 +2507,25 @@ coll_t PG::make_snap_collection(ObjectStore::Transaction& t, snapid_t s)
   return c;
 }
 
+void PG::update_snap_collections(vector<Log::Entry> &log_entries)
+{
+  for (vector<Log::Entry>::iterator i = log_entries.begin();
+       i != log_entries.end();
+       ++i) {
+    if (i->is_clone()) {
+      vector<snapid_t> snaps;
+      bufferlist::iterator p = i->snaps.begin();
+      ::decode(snaps, p);
+      if (!snap_collections.contains(*snaps.begin())) {
+       snap_collections.insert(*snaps.begin());
+      }
+      if (snaps.size() > 1 && !snap_collections.contains(*(snaps.end() - 1))) {
+       snap_collections.insert(*(snaps.end() - 1));
+      }
+    }
+  }
+}
+
 void PG::adjust_local_snaps(ObjectStore::Transaction &t, interval_set<snapid_t> &to_check)
 {
   interval_set<snapid_t> to_remove;
index 1c1695027202421499ffada66824aca339f6a700..6549b47427f2d87047e344426153ddb28d96a776 100644 (file)
@@ -1557,6 +1557,7 @@ public:
   std::string get_corrupt_pg_log_name() const;
   void read_state(ObjectStore *store);
   coll_t make_snap_collection(ObjectStore::Transaction& t, snapid_t sn);
+  void update_snap_collections(vector<Log::Entry> &log_entries);
   void adjust_local_snaps(ObjectStore::Transaction &t, interval_set<snapid_t> &to_check);
 
   void log_weirdness();
index 5f7d9543fcb391947f55ceeb2df4431695abaf78..8c0b4a3a93c2a2b43ff2ed43935354d7d9a186b8 100644 (file)
@@ -3148,6 +3148,7 @@ void ReplicatedPG::sub_op_modify(MOSDSubOp *op)
       ::decode(log, p);
       
       info.stats = op->pg_stats;
+      update_snap_collections(log);
       log_op(log, op->pg_trim_to, rm->localt);
 
       rm->tls.push_back(&rm->opt);