From 7e6cc5f670f01434ad2c035c92251f1c5693b00a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 10 Nov 2008 09:46:53 -0800 Subject: [PATCH] osd: simple higher-order append mutation --- src/include/ceph_fs.h | 22 ++++++++++++++-------- src/osd/ReplicatedPG.cc | 17 ++++++++++++++++- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/include/ceph_fs.h b/src/include/ceph_fs.h index e38f56edc86..5c8ea57ea28 100644 --- a/src/include/ceph_fs.h +++ b/src/include/ceph_fs.h @@ -1036,15 +1036,15 @@ struct ceph_mds_snap_realm { /* * osd ops */ -#define CEPH_OSD_OP_MODE 0xf00 -#define CEPH_OSD_OP_MODE_RD 0x100 -#define CEPH_OSD_OP_MODE_WR 0x200 -#define CEPH_OSD_OP_MODE_SUB 0x400 +#define CEPH_OSD_OP_MODE 0xf000 +#define CEPH_OSD_OP_MODE_RD 0x1000 +#define CEPH_OSD_OP_MODE_WR 0x2000 +#define CEPH_OSD_OP_MODE_SUB 0x4000 -#define CEPH_OSD_OP_TYPE 0x0f0 -#define CEPH_OSD_OP_TYPE_LOCK 0x300 -#define CEPH_OSD_OP_TYPE_DATA 0x010 -#define CEPH_OSD_OP_TYPE_ATTR 0x020 +#define CEPH_OSD_OP_TYPE 0x0f00 +#define CEPH_OSD_OP_TYPE_LOCK 0x0100 +#define CEPH_OSD_OP_TYPE_DATA 0x0200 +#define CEPH_OSD_OP_TYPE_ATTR 0x0300 enum { /* read */ @@ -1080,6 +1080,12 @@ enum { CEPH_OSD_OP_RDUNLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 4, CEPH_OSD_OP_UPLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 5, CEPH_OSD_OP_DNLOCK = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 6, + + /* fancy read */ + CEPH_OSD_OP_GREP = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 1, + + /* fancy write */ + CEPH_OSD_OP_APPEND = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 1, }; static inline int ceph_osd_op_type_lock(int op) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index c2528c638f5..cec74ec80ae 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -984,7 +984,8 @@ int ReplicatedPG::prepare_simple_op(ObjectStore::Transaction& t, osd_reqid_t req break; - // -- object data -- + // -- object attrs -- + case CEPH_OSD_OP_SETXATTR: { nstring name(op.name_len + 1); @@ -1006,6 +1007,20 @@ int ReplicatedPG::prepare_simple_op(ObjectStore::Transaction& t, osd_reqid_t req break; + // -- fancy writers -- + case CEPH_OSD_OP_APPEND: + { + // do it inline; this works because we can safely execute on replicas + // as well. + ceph_osd_op newop; + newop.op = CEPH_OSD_OP_WRITE; + newop.offset = old_size; + newop.length = op.length; + prepare_simple_op(t, reqid, poid, old_size, newop, bp, snapset, snapc); + } + break; + + default: return -EINVAL; } -- 2.47.3