]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rados: add pg (non-object) ops
authorSage Weil <sage@newdream.net>
Tue, 2 Jun 2009 17:52:38 +0000 (10:52 -0700)
committerSage Weil <sage@newdream.net>
Tue, 2 Jun 2009 17:52:38 +0000 (10:52 -0700)
Some ops run against the whole pg, not individual objects.  Setting the
PGOP flag selects a different write path that skips missing object checks
(ignores oid).

src/TODO
src/include/rados.h
src/osd/OSD.cc
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index 04425a1dacfa28d55cd62531a1af4ab2994ef63a..b58407c00c56b55469f2b406ceebf53e43bc195a 100644 (file)
--- a/src/TODO
+++ b/src/TODO
@@ -13,6 +13,7 @@ v0.9
 /- make mds exhert memory pressure on client caps, leases
 /- librados
   - async io
+  - list_objects
 /- object classes
 - optionally separate osd interfaces (ips) for clients and osds (replication, peering, etc.)
 
@@ -37,7 +38,6 @@ rados
 - autosize pg_pools?
 - security
 - c library glue to c3
-- pyexec?
 
 repair
 - are we concerned about
index 1b2c18a11cff491bb296fae26e85878989e07d69..df2d0ce3535f55b559206b744dcd56c1970e44c2 100644 (file)
@@ -173,6 +173,7 @@ struct ceph_eversion {
 #define CEPH_OSD_OP_TYPE_DATA  0x0200
 #define CEPH_OSD_OP_TYPE_ATTR  0x0300
 #define CEPH_OSD_OP_TYPE_EXEC  0x0400
+#define CEPH_OSD_OP_TYPE_PG    0x0500
 
 enum {
        /** data **/
@@ -225,6 +226,9 @@ enum {
        /** exec **/
        CEPH_OSD_OP_RDCALL    = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_EXEC | 1,
        CEPH_OSD_OP_WRCALL    = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_EXEC | 1,
+
+       /** pg **/
+       CEPH_OSD_OP_PGLS      = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_PG | 1,
 };
 
 static inline int ceph_osd_op_type_lock(int op)
@@ -320,6 +324,7 @@ enum {
        CEPH_OSD_FLAG_PEERSTAT = 128,   /* msg includes osd_peer_stat */
        CEPH_OSD_FLAG_BALANCE_READS = 256,
        CEPH_OSD_FLAG_PARALLELEXEC = 512, /* execute op in parallel */
+       CEPH_OSD_FLAG_PGOP = 1024,      /* pg op, no object */
 };
 
 #define EOLDSNAPC    ERESTART  /* ORDERSNAP flag set; writer has old snapc*/
index 3cb7495cab871699003565f712f7fb6894e7418a..acb970a9422dc7ca78e75daa28731d86077f63af 100644 (file)
@@ -3520,11 +3520,13 @@ void OSD::handle_op(MOSDOp *op)
   }
 
   // missing object?
-  sobject_t head(op->get_oid(), CEPH_NOSNAP);
-  if (pg->is_missing_object(head)) {
-    pg->wait_for_missing_object(head, op);
-    pg->unlock();
-    return;
+  if ((op->get_flags() & CEPH_OSD_FLAG_PGOP) == 0) {
+    sobject_t head(op->get_oid(), CEPH_NOSNAP);
+    if (pg->is_missing_object(head)) {
+      pg->wait_for_missing_object(head, op);
+      pg->unlock();
+      return;
+    }
   }
 
   
index 0d5f34f88be93aa2129c1ded28e56d2d194c0e56..14cdbdc7b07aa10184df3d8725d57c09dc7c3c52 100644 (file)
@@ -366,6 +366,42 @@ bool ReplicatedPG::preprocess_op(MOSDOp *op, utime_t now)
   return false;
 }
 
+void ReplicatedPG::do_pg_op(MOSDOp *op)
+{
+  dout(15) << "do_pg_op " << *op << dendl;
+
+  //bufferlist& indata = op->get_data();
+  bufferlist outdata;
+  int result = 0;
+
+  for (vector<ceph_osd_op>::iterator p = op->ops.begin(); p != op->ops.end(); p++) {
+    switch (p->op) {
+
+    case CEPH_OSD_OP_PGLS:
+      {
+       vector<pobject_t> pobjects;
+       // ???
+       vector<object_t> objects;
+       // ???
+       ::encode(objects, outdata);
+      }
+      break;
+
+    default:
+      result = -EINVAL;
+      break;
+    }
+  }
+
+  // reply
+  MOSDOpReply *reply = new MOSDOpReply(op, 0, osd->osdmap->get_epoch(),
+                                      CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK); 
+  reply->set_data(outdata);
+  reply->set_result(result);
+  osd->messenger->send_message(reply, op->get_orig_source_inst());
+  delete op;
+}
+
 
 /** do_op - do an op
  * pg lock will be held (if multithreaded)
@@ -375,6 +411,9 @@ void ReplicatedPG::do_op(MOSDOp *op)
 {
   osd->logger->inc(l_osd_op);
 
+  if (op->get_flags() & CEPH_OSD_FLAG_PGOP)
+    return do_pg_op(op);
+
   dout(15) << "do_op " << *op << dendl;
 
   entity_inst_t client = op->get_source_inst();
index e512520b337e3ee4c14bf0b1b0c4968eed0cea27..c648d833ad624573cf4da8393fd382653d14ee0e 100644 (file)
@@ -442,6 +442,7 @@ public:
 
   bool preprocess_op(MOSDOp *op, utime_t now);
   void do_op(MOSDOp *op);
+  void do_pg_op(MOSDOp *op);
   void do_sub_op(MOSDSubOp *op);
   void do_sub_op_reply(MOSDSubOpReply *op);
   bool snap_trimmer();