]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
objecter: add read_trunc, write_trunc
authorYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 12 Feb 2010 22:05:42 +0000 (14:05 -0800)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Sat, 13 Feb 2010 00:03:47 +0000 (16:03 -0800)
src/client/Client.cc
src/client/Client.h
src/osdc/Filer.h
src/osdc/Objecter.h

index 1153b5f75a96ab2b6a582966836b17d25cf66275..ec4c070b8ca72878dc24356c900e8ffdb37b8b98 100644 (file)
@@ -4415,8 +4415,10 @@ int Client::_read_sync(Fh *f, __u64 off, __u64 len, bufferlist *bl)
     bufferlist tbl;
     
     int wanted = left;
-    filer->read(in->ino, &in->layout, in->snapid,
-               pos, left, &tbl, flags, onfinish);
+    filer->read_trunc(in->ino, &in->layout, in->snapid,
+                     pos, left, &tbl, flags,
+                     in->truncate_size, in->truncate_seq,
+                     onfinish);
     while (!done)
       cond.Wait(client_lock);
 
@@ -4581,8 +4583,10 @@ int Client::_write(Fh *f, __s64 offset, __u64 size, const char *buf)
     unsafe_sync_write++;
     get_cap_ref(in, CEPH_CAP_FILE_BUFFER);  // released by onsafe callback
     
-    filer->write(in->ino, &in->layout, in->snaprealm->get_snap_context(),
-                offset, size, bl, g_clock.now(), 0, onfinish, onsafe);
+    filer->write_trunc(in->ino, &in->layout, in->snaprealm->get_snap_context(),
+                      offset, size, bl, g_clock.now(), 0,
+                      in->truncate_size, in->truncate_seq,
+                      onfinish, onsafe);
     
     while (!done)
       cond.Wait(client_lock);
index f25f9e338a5552a8bd5f3bb439885e526b6b3b9b..ff735e2a790885236058dd9e3ffd55bfd529787e 100644 (file)
@@ -355,7 +355,7 @@ class Inode {
   ceph_file_layout layout;
   uint64_t   size;        // on directory, # dentries
   uint32_t   truncate_seq;
-  uint64_t   truncate_size, truncate_from;
+  uint64_t   truncate_size;
   utime_t    mtime;   // file data modify time.
   utime_t    atime;   // file data access time.
   uint32_t   time_warp_seq;  // count of (potential) mtime/atime timewarps (i.e., utimes())
@@ -474,7 +474,7 @@ class Inode {
 
   Inode(vinodeno_t vino, ceph_file_layout *layout) : 
     ino(vino.ino), snapid(vino.snapid),
-    rdev(0), mode(0), uid(0), gid(0), nlink(0), size(0), truncate_seq(0), truncate_size(0), truncate_from(0),
+    rdev(0), mode(0), uid(0), gid(0), nlink(0), size(0), truncate_seq(0), truncate_size(0),
     time_warp_seq(0), max_size(0), version(0), xattr_version(0),
     flags(0),
     dir_auth(-1), dir_hashed(false), dir_replicated(false), 
index 2ad197cd07129b4a7d9f8bbb1b8e9858d39ab60b..a4a30ac085355013a264fc5cdaed20ff18360e53 100644 (file)
@@ -120,6 +120,24 @@ class Filer {
     return 0;
   }
 
+  int read_trunc(inodeno_t ino,
+          ceph_file_layout *layout,
+          snapid_t snap,
+           __u64 offset, 
+           __u64 len, 
+           bufferlist *bl,   // ptr to data
+          int flags,
+          __u64 truncate_size,
+          __u32 truncate_seq,
+           Context *onfinish) {
+    assert(snap);  // (until there is a non-NOSNAP write)
+    vector<ObjectExtent> extents;
+    file_to_extents(ino, layout, offset, len, extents);
+printf("read_trunc %lld~%lld %d@%lld\n", offset, len, truncate_seq, truncate_size);
+    objecter->sg_read_trunc(extents, snap, bl, flags,
+                           truncate_size, truncate_seq, onfinish);
+    return 0;
+  }
 
   int write(inodeno_t ino,
            ceph_file_layout *layout,
@@ -137,6 +155,26 @@ class Filer {
     return 0;
   }
 
+  int write_trunc(inodeno_t ino,
+           ceph_file_layout *layout,
+           const SnapContext& snapc,
+           __u64 offset, 
+            __u64 len, 
+            bufferlist& bl,
+           utime_t mtime,
+            int flags, 
+          __u64 truncate_size,
+          __u32 truncate_seq,
+            Context *onack,
+            Context *oncommit) {
+printf("write_trunc %lld~%lld %d@%lld\n", offset, len, truncate_seq, truncate_size);
+    vector<ObjectExtent> extents;
+    file_to_extents(ino, layout, offset, len, extents);
+    objecter->sg_write_trunc(extents, snapc, bl, mtime, flags,
+                      truncate_size, truncate_seq, onack, oncommit);
+    return 0;
+  }
+
   int truncate(inodeno_t ino,
               ceph_file_layout *layout,
               const SnapContext& snapc,
index 789bc13fbda80c5c3ee201d8ec7d563778b57a35..d0fbd1cdb6f767513d9dfa8fca1217b2f71f5f02 100644 (file)
@@ -486,6 +486,23 @@ private:
     ops[0].op.op = CEPH_OSD_OP_READ;
     ops[0].op.extent.offset = off;
     ops[0].op.extent.length = len;
+    ops[0].op.extent.truncate_size = 0;
+    ops[0].op.extent.truncate_seq = 0;
+    Op *o = new Op(oid, ol, ops, flags, onfinish, 0);
+    o->snapid = snap;
+    o->outbl = pbl;
+    return op_submit(o);
+  }
+  tid_t read_trunc(const object_t& oid, ceph_object_layout ol, 
+            __u64 off, __u64 len, snapid_t snap, bufferlist *pbl, int flags,
+            __u64 trunc_size, __u32 trunc_seq,
+            Context *onfinish) {
+    vector<OSDOp> ops(1);
+    ops[0].op.op = CEPH_OSD_OP_READ;
+    ops[0].op.extent.offset = off;
+    ops[0].op.extent.length = len;
+    ops[0].op.extent.truncate_size = trunc_size;
+    ops[0].op.extent.truncate_seq = trunc_seq;
     Op *o = new Op(oid, ol, ops, flags, onfinish, 0);
     o->snapid = snap;
     o->outbl = pbl;
@@ -543,6 +560,25 @@ private:
     ops[0].op.op = CEPH_OSD_OP_WRITE;
     ops[0].op.extent.offset = off;
     ops[0].op.extent.length = len;
+    ops[0].op.extent.truncate_size = 0;
+    ops[0].op.extent.truncate_seq = 0;
+    ops[0].data = bl;
+    Op *o = new Op(oid, ol, ops, flags, onack, oncommit);
+    o->mtime = mtime;
+    o->snapc = snapc;
+    return op_submit(o);
+  }
+  tid_t write_trunc(const object_t& oid, ceph_object_layout ol,
+             __u64 off, __u64 len, const SnapContext& snapc, const bufferlist &bl,
+             utime_t mtime, int flags,
+            __u64 trunc_size, __u32 trunc_seq,
+              Context *onack, Context *oncommit) {
+    vector<OSDOp> ops(1);
+    ops[0].op.op = CEPH_OSD_OP_WRITE;
+    ops[0].op.extent.offset = off;
+    ops[0].op.extent.length = len;
+    ops[0].op.extent.truncate_size = trunc_size;
+    ops[0].op.extent.truncate_seq = trunc_seq;
     ops[0].data = bl;
     Op *o = new Op(oid, ol, ops, flags, onack, oncommit);
     o->mtime = mtime;
@@ -678,28 +714,33 @@ public:
     }      
   };
 
-  void sg_read(vector<ObjectExtent>& extents, snapid_t snap, bufferlist *bl, int flags, Context *onfinish) {
+  void sg_read_trunc(vector<ObjectExtent>& extents, snapid_t snap, bufferlist *bl, int flags,
+               __u64 trunc_size, __u32 trunc_seq, Context *onfinish) {
     if (extents.size() == 1) {
-      read(extents[0].oid, extents[0].layout, extents[0].offset, extents[0].length,
-          snap, bl, flags, onfinish);
+      read_trunc(extents[0].oid, extents[0].layout, extents[0].offset, extents[0].length,
+          snap, bl, flags, trunc_size, trunc_seq, onfinish);
     } else {
       C_Gather *g = new C_Gather;
       vector<bufferlist> resultbl(extents.size());
       int i=0;
       for (vector<ObjectExtent>::iterator p = extents.begin(); p != extents.end(); p++) {
-       read(p->oid, p->layout, p->offset, p->length,
-            snap, &resultbl[i++], flags, g->new_sub());
+       read_trunc(p->oid, p->layout, p->offset, p->length,
+            snap, &resultbl[i++], flags, trunc_size, trunc_seq, g->new_sub());
       }
       g->set_finisher(new C_SGRead(this, extents, resultbl, bl, onfinish));
     }
   }
 
+  void sg_read(vector<ObjectExtent>& extents, snapid_t snap, bufferlist *bl, int flags, Context *onfinish) {
+    sg_read_trunc(extents, snap, bl, flags, 0, 0, onfinish);
+  }
 
-  void sg_write(vector<ObjectExtent>& extents, const SnapContext& snapc, const bufferlist& bl, utime_t mtime,
-               int flags, Context *onack, Context *oncommit) {
+  void sg_write_trunc(vector<ObjectExtent>& extents, const SnapContext& snapc, const bufferlist& bl, utime_t mtime,
+               int flags, __u64 trunc_size, __u32 trunc_seq,
+               Context *onack, Context *oncommit) {
     if (extents.size() == 1) {
-      write(extents[0].oid, extents[0].layout, extents[0].offset, extents[0].length,
-           snapc, bl, mtime, flags, onack, oncommit);
+      write_trunc(extents[0].oid, extents[0].layout, extents[0].offset, extents[0].length,
+           snapc, bl, mtime, flags, trunc_size, trunc_seq, onack, oncommit);
     } else {
       C_Gather *gack = 0, *gcom = 0;
       if (onack)
@@ -713,14 +754,19 @@ public:
             bit++)
          bl.copy(bit->first, bit->second, cur);
        assert(cur.length() == p->length);
-       write(p->oid, p->layout, p->offset, p->length, 
-             snapc, cur, mtime, flags,
+       write_trunc(p->oid, p->layout, p->offset, p->length, 
+             snapc, cur, mtime, flags, trunc_size, trunc_seq,
              gack ? gack->new_sub():0,
              gcom ? gcom->new_sub():0);
       }
     }
   }
 
+  void sg_write(vector<ObjectExtent>& extents, const SnapContext& snapc, const bufferlist& bl, utime_t mtime,
+               int flags, Context *onack, Context *oncommit) {
+    sg_write_trunc(extents, snapc, bl, mtime, flags, 0, 0, onack, oncommit);
+  }
+
   void ms_handle_connect(Connection *con);
   void ms_handle_reset(Connection *con);
   void ms_handle_remote_reset(Connection *con);