]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: calc_snap_set_diff now provides last known object size
authorJason Dillaman <dillaman@redhat.com>
Sun, 6 Mar 2016 18:02:34 +0000 (13:02 -0500)
committerJason Dillaman <dillaman@redhat.com>
Sun, 13 Mar 2016 03:40:14 +0000 (22:40 -0500)
This allows truncate requests to be detected between snapshots.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librados/snap_set_diff.cc
src/librados/snap_set_diff.h

index 5db0fb9793c7c5f55897f542a9d9e2f95ce27cfc..9fb166f5817c5cdc8b7703b401657da710d41cec 100644 (file)
  * calculate intervals/extents that vary between two snapshots
  */
 void calc_snap_set_diff(CephContext *cct, const librados::snap_set_t& snap_set,
-                       librados::snap_t start,
-                       librados::snap_t end,
-                       interval_set<uint64_t> *diff, bool *end_exists)
+                       librados::snap_t start, librados::snap_t end,
+                       interval_set<uint64_t> *diff, uint64_t *end_size,
+                        bool *end_exists)
 {
   ldout(cct, 10) << "calc_snap_set_diff start " << start << " end " << end
                 << ", snap_set seq " << snap_set.seq << dendl;
   bool saw_start = false;
   uint64_t start_size = 0;
   diff->clear();
+  *end_size = 0;
   *end_exists = false;
 
   for (vector<librados::clone_info_t>::const_iterator r = snap_set.clones.begin();
@@ -44,7 +45,7 @@ void calc_snap_set_diff(CephContext *cct, const librados::snap_set_t& snap_set,
     ldout(cct, 20) << " clone " << r->cloneid << " snaps " << r->snaps
                   << " -> [" << a << "," << b << "]"
                   << " size " << r->size << " overlap to next " << r->overlap << dendl;
-    
+
     if (b < start) {
       // this is before start
       ++r;
@@ -65,6 +66,7 @@ void calc_snap_set_diff(CephContext *cct, const librados::snap_set_t& snap_set,
       saw_start = true;
     }
 
+    *end_size = r->size;
     if (end < a) {
       ldout(cct, 20) << " past end " << end << ", end object does not exist" << dendl;
       *end_exists = false;
index 7bc75cd6cf905fc70fefb0aa2f491902c77e93a0..acb71965b52cbfd6387344f204cae90ccb425fc9 100644 (file)
@@ -11,7 +11,7 @@ class CephContext;
 void calc_snap_set_diff(CephContext *cct,
                        const librados::snap_set_t& snap_set,
                        librados::snap_t start, librados::snap_t end,
-                       interval_set<uint64_t> *diff,
+                       interval_set<uint64_t> *diff, uint64_t *end_size,
                        bool *end_exists);
 
 #endif