]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: make object delete not remove _head if there are clones
authorSage Weil <sage@newdream.net>
Wed, 24 Jun 2009 19:55:00 +0000 (12:55 -0700)
committerSage Weil <sage@newdream.net>
Wed, 24 Jun 2009 20:07:42 +0000 (13:07 -0700)
Truncate and rmattrs instead, so we can keep the SnapSet.

Still need to make 'ls' work properly.

src/TODO
src/osd/ReplicatedPG.cc

index f69ec034e412ce2531c972a72bf9ea9740f1b633..c0d9ae463f128d9de23bc37ec5b896a84732eaa1 100644 (file)
--- a/src/TODO
+++ b/src/TODO
@@ -71,11 +71,6 @@ later
 - rename over old files should flush data, or revert back to old contents
 
 rados
-/ - kill -[io] options
-/ - make 'ls' output to file
-/ - make objecter->list_objects return even with <max entries (i.e., after each non-empty pg)
-/ - verify 'ls' behaves with snaps
-/ - allow put from stdin: 'echo foo | rados -p mypool put foo -'
 - perl swig wrapper
 - 'rados call foo.bar'?
 - merge pgs
@@ -139,6 +134,7 @@ btrfs
 - ioctl to pull out data csum?
 
 osd
+- need to store SnapSet somewhere other than _head, to avoid stat/getxattr on ls to check head_exists.
 - segregate backlog from log ondisk?
 - preserve pg logs on disk for longer period
 - make scrub interruptible
index c792a97adc48b2a1b5ad40651f4ed00fcb5c1208..75585b608ab943cb0b695ad953ad119e63e7e18e 100644 (file)
@@ -1161,20 +1161,25 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops,
     
     case CEPH_OSD_OP_DELETE:
       { // delete
-       t.remove(info.pgid.to_coll(), soid);
-       if (oi.snapset.clones.size()) {
-         snapid_t newest = *oi.snapset.clones.rbegin();
-         add_interval_usage(oi.snapset.clone_overlap[newest], info.stats);
-         oi.snapset.clone_overlap.erase(newest);  // ok, redundant.
-       }
        if (ctx->obs->exists) {
          info.stats.num_objects--;
          info.stats.num_bytes -= oi.size;
          info.stats.num_kb -= SHIFT_ROUND_UP(oi.size, 10);
          oi.size = 0;
-         ctx->obs->exists = false;
          oi.snapset.head_exists = false;
        }      
+       if (oi.snapset.clones.size()) {
+         snapid_t newest = *oi.snapset.clones.rbegin();
+         add_interval_usage(oi.snapset.clone_overlap[newest], info.stats);
+         oi.snapset.clone_overlap.erase(newest);  // ok, redundant.
+
+         // truncate and kill attrs, but do not delete
+         t.truncate(info.pgid.to_coll(), soid, 0);
+         t.rmattrs(info.pgid.to_coll(), soid);
+       } else {
+         t.remove(info.pgid.to_coll(), soid);  // no clones, delete!
+         ctx->obs->exists = false;
+       }
       }
       break;