/- 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.)
- autosize pg_pools?
- security
- c library glue to c3
-- pyexec?
repair
- are we concerned about
#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 **/
/** 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)
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*/
}
// 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;
+ }
}
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)
{
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();
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();