*/
#define CEPH_OSD_TMAP_HDR 'h'
#define CEPH_OSD_TMAP_SET 's'
+#define CEPH_OSD_TMAP_CREATE 'c' /* create key */
#define CEPH_OSD_TMAP_RM 'r'
extern const char *ceph_osd_op_name(int op);
#ifndef CEPH_OSD_TMAP_SET
#define CEPH_OSD_TMAP_HDR 'h'
#define CEPH_OSD_TMAP_SET 's'
+#define CEPH_OSD_TMAP_CREATE 'c'
#define CEPH_OSD_TMAP_RM 'r'
#endif
}
break;
+ case CEPH_OSD_TMAP_CREATE: // create (new) key
+ {
+ ::decode(key, bp);
+ bufferlist data;
+ ::decode(data, bp);
+ if (m.count(key))
+ return -EEXIST;
+ m[key] = data;
+ changed = true;
+ }
+ break;
+
case CEPH_OSD_TMAP_RM: // remove key
::decode(key, bp);
if (m.count(key)) {
dout(10) << "tmapup op " << (int)op << " key " << key << dendl;
// skip existing intervening keys
- bool stop = false;
- while (have_next && !stop) {
+ bool key_exists = false;
+ while (have_next && !key_exists) {
dout(20) << " (have_next=" << have_next << " nextkey=" << nextkey << ")" << dendl;
if (nextkey > key)
break;
} else {
// don't copy; discard old value. and stop.
dout(20) << " drop " << nextkey << " " << nextval.length() << dendl;
- stop = true;
+ key_exists = true;
nkeys--;
}
if (!ip.end()) {
::encode(val, newkeydata);
dout(20) << " set " << key << " " << val.length() << dendl;
nkeys++;
+ } else if (op == CEPH_OSD_TMAP_CREATE) {
+ if (key_exists)
+ return -EEXIST;
+ bufferlist val;
+ ::decode(val, bp);
+ ::encode(key, newkeydata);
+ ::encode(val, newkeydata);
+ dout(20) << " create " << key << " " << val.length() << dendl;
+ nkeys++;
} else if (op == CEPH_OSD_TMAP_RM) {
// do nothing.
}