summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-03-05 14:08:21 -0800
committerYehuda Sadeh <yehuda@inktank.com>2013-03-05 14:08:21 -0800
commitee9f8b0d322c0b75e3a41dd32c3098a3bd1a128e (patch)
tree5677c818c5345d9dbe3224bf6ac0fc90be99eabb
parente8f74c896b015950e7907f87a8aa8c293aab62d7 (diff)
downloadceph-ee9f8b0d322c0b75e3a41dd32c3098a3bd1a128e.tar.gz
rgw: put metadata, other cleanups
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r--src/cls/version/cls_version_types.cc7
-rw-r--r--src/cls/version/cls_version_types.h3
-rw-r--r--src/rgw/rgw_admin.cc40
-rw-r--r--src/rgw/rgw_metadata.cc43
-rw-r--r--src/rgw/rgw_metadata.h23
-rw-r--r--src/rgw/rgw_user.cc42
6 files changed, 141 insertions, 17 deletions
diff --git a/src/cls/version/cls_version_types.cc b/src/cls/version/cls_version_types.cc
index 2ed69733653..4ec678675d8 100644
--- a/src/cls/version/cls_version_types.cc
+++ b/src/cls/version/cls_version_types.cc
@@ -1,6 +1,7 @@
#include "cls/version/cls_version_types.h"
#include "common/Formatter.h"
+#include "common/ceph_json.h"
void obj_version::dump(Formatter *f) const
@@ -9,3 +10,9 @@ void obj_version::dump(Formatter *f) const
f->dump_string("tag", tag);
}
+void obj_version::decode_json(JSONObj *obj)
+{
+ JSONDecoder::decode_json("ver", ver, obj);
+ JSONDecoder::decode_json("tag", tag, obj);
+}
+
diff --git a/src/cls/version/cls_version_types.h b/src/cls/version/cls_version_types.h
index 82f37c00081..4b77e5dd26d 100644
--- a/src/cls/version/cls_version_types.h
+++ b/src/cls/version/cls_version_types.h
@@ -4,6 +4,8 @@
#include "include/encoding.h"
#include "include/types.h"
+class JSONObj;
+
struct obj_version {
uint64_t ver;
@@ -39,6 +41,7 @@ struct obj_version {
}
void dump(Formatter *f) const;
+ void decode_json(JSONObj *obj);
};
WRITE_CLASS_ENCODER(obj_version)
diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc
index 9977d6fbd7b..d0e67b8772f 100644
--- a/src/rgw/rgw_admin.cc
+++ b/src/rgw/rgw_admin.cc
@@ -84,6 +84,8 @@ void _usage()
cerr << " gc list dump expired garbage collection objects\n";
cerr << " gc process manually process garbage\n";
cerr << " metadata get get metadata info\n";
+ cerr << " metadata put put metadata info\n";
+ cerr << " metadata list list metadata info\n";
cerr << "options:\n";
cerr << " --uid=<id> user id\n";
cerr << " --subuser=<name> subuser name\n";
@@ -186,6 +188,7 @@ enum {
OPT_CAPS_ADD,
OPT_CAPS_RM,
OPT_METADATA_GET,
+ OPT_METADATA_PUT,
OPT_METADATA_LIST,
};
@@ -353,6 +356,8 @@ static int get_cmd(const char *cmd, const char *prev_cmd, bool *need_more)
} else if (strcmp(prev_cmd, "metadata") == 0) {
if (strcmp(cmd, "get") == 0)
return OPT_METADATA_GET;
+ if (strcmp(cmd, "put") == 0)
+ return OPT_METADATA_PUT;
if (strcmp(cmd, "list") == 0)
return OPT_METADATA_LIST;
}
@@ -979,18 +984,35 @@ int main(int argc, char **argv)
}
else {
const char *prev_cmd = NULL;
- for (std::vector<const char*>::iterator i = args.begin(); i != args.end(); ++i) {
+ std::vector<const char*>::iterator i ;
+ for (i = args.begin(); i != args.end(); ++i) {
opt_cmd = get_cmd(*i, prev_cmd, &need_more);
if (opt_cmd < 0) {
cerr << "unrecognized arg " << *i << std::endl;
return usage();
}
- if (!need_more)
+ if (!need_more) {
+ ++i;
break;
+ }
prev_cmd = *i;
}
+
if (opt_cmd == OPT_NO_CMD)
return usage();
+
+ /* some commands may have an optional extra param */
+ if (i != args.end()) {
+ switch (opt_cmd) {
+ case OPT_METADATA_GET:
+ case OPT_METADATA_PUT:
+ case OPT_METADATA_LIST:
+ metadata_key = *i;
+ break;
+ default:
+ break;
+ }
+ }
}
// default to pretty json
@@ -2151,6 +2173,20 @@ next:
formatter->flush(cout);
}
+ if (opt_cmd == OPT_METADATA_PUT) {
+ bufferlist bl;
+ int ret = read_input(infile, bl);
+ if (ret < 0) {
+ cerr << "ERROR: failed to read input: " << cpp_strerror(-ret) << std::endl;
+ return ret;
+ }
+ ret = store->meta_mgr->put(metadata_key, bl);
+ if (ret < 0) {
+ cerr << "ERROR: can't put key: " << cpp_strerror(-ret) << std::endl;
+ return -ret;
+ }
+ }
+
if (opt_cmd == OPT_METADATA_LIST) {
void *handle;
int max = 1000;
diff --git a/src/rgw/rgw_metadata.cc b/src/rgw/rgw_metadata.cc
index 841779f3ceb..8dfa1c74d28 100644
--- a/src/rgw/rgw_metadata.cc
+++ b/src/rgw/rgw_metadata.cc
@@ -1,8 +1,14 @@
#include "rgw_metadata.h"
+#include "common/ceph_json.h"
+#include "cls/version/cls_version_types.h"
+obj_version& RGWMetadataObject::get_version()
+{
+ return objv;
+}
RGWMetadataManager::~RGWMetadataManager()
{
@@ -63,10 +69,25 @@ int RGWMetadataManager::get(string& metadata_key, Formatter *f)
return ret;
}
- return handler->get(store, metadata_key, entry, f);
+ RGWMetadataObject *obj;
+
+ ret = handler->get(store, entry, &obj);
+ if (ret < 0) {
+ return ret;
+ }
+
+ f->open_object_section("metadata_info");
+ encode_json("key", metadata_key, f);
+ encode_json("ver", obj->get_version(), f);
+ encode_json("data", *obj, f);
+ f->close_section();
+
+ delete obj;
+
+ return 0;
}
-int RGWMetadataManager::update(string& metadata_key, bufferlist& bl)
+int RGWMetadataManager::put(string& metadata_key, bufferlist& bl)
{
RGWMetadataHandler *handler;
string entry;
@@ -75,7 +96,23 @@ int RGWMetadataManager::update(string& metadata_key, bufferlist& bl)
if (ret < 0)
return ret;
- return handler->update(store, entry, bl);
+ JSONParser parser;
+ if (!parser.parse(bl.c_str(), bl.length())) {
+ return -EINVAL;
+ }
+
+ string meadata_key;
+ obj_version objv;
+
+ JSONDecoder::decode_json("key", metadata_key, &parser);
+ JSONDecoder::decode_json("ver", objv, &parser);
+
+ JSONObj *jo = parser.find_obj("data");
+ if (!jo) {
+ return -EINVAL;
+ }
+
+ return handler->put(store, entry, objv, jo);
}
struct list_keys_handle {
diff --git a/src/rgw/rgw_metadata.h b/src/rgw/rgw_metadata.h
index 704c894f552..3f92ea0c352 100644
--- a/src/rgw/rgw_metadata.h
+++ b/src/rgw/rgw_metadata.h
@@ -5,24 +5,39 @@
#include "include/types.h"
#include "rgw_common.h"
+#include "cls/version/cls_version_types.h"
+
class RGWRados;
+class JSONObj;
+
+struct obj_version;
+class RGWMetadataObject {
+protected:
+ obj_version objv;
+
+public:
+ virtual ~RGWMetadataObject() {}
+ obj_version& get_version();
+
+ virtual void dump(Formatter *f) const = 0;
+};
+
class RGWMetadataHandler {
public:
virtual ~RGWMetadataHandler() {}
virtual string get_type() = 0;
- virtual int get(RGWRados *store, string& key, string& entry, Formatter *f) = 0;
- virtual int update(RGWRados *store, string& entry, bufferlist& bl) = 0;
+ virtual int get(RGWRados *store, string& entry, RGWMetadataObject **obj) = 0;
+ virtual int put(RGWRados *store, string& entry, obj_version& objv, JSONObj *obj) = 0;
virtual int list_keys_init(RGWRados *store, void **phandle) = 0;
virtual int list_keys_next(void *handle, int max, list<string>& keys, bool *truncated) = 0;
virtual void list_keys_complete(void *handle) = 0;
};
-
class RGWMetadataManager {
map<string, RGWMetadataHandler *> handlers;
RGWRados *store;
@@ -38,7 +53,7 @@ public:
int register_handler(RGWMetadataHandler *handler);
int get(string& metadata_key, Formatter *f);
- int update(string& metadata_key, bufferlist& bl);
+ int put(string& metadata_key, bufferlist& bl);
int list_keys_init(string& section, void **phandle);
int list_keys_next(void *handle, int max, list<string>& keys, bool *truncated);
diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc
index e6de3224502..e58b93f6212 100644
--- a/src/rgw/rgw_user.cc
+++ b/src/rgw/rgw_user.cc
@@ -481,10 +481,23 @@ int rgw_delete_user(RGWRados *store, RGWUserInfo& info) {
return 0;
}
+class RGWUserMetadataObject : public RGWMetadataObject {
+ RGWUserInfo info;
+public:
+ RGWUserMetadataObject(RGWUserInfo& i, obj_version& v) : info(i) {
+ objv = v;
+ }
+
+ void dump(Formatter *f) const {
+ info.dump(f);
+ }
+};
+
class RGWUserMetadataHandler : public RGWMetadataHandler {
public:
string get_type() { return "user"; }
- int get(RGWRados *store, string& key, string& entry, Formatter *f) {
+
+ int get(RGWRados *store, string& entry, RGWMetadataObject **obj) {
RGWUserInfo info;
obj_version objv;
@@ -493,16 +506,29 @@ public:
if (ret < 0)
return ret;
- f->open_object_section("metadata_info");
- encode_json("key", key, f);
- encode_json("ver", objv, f);
- encode_json("data", info, f);
- f->close_section();
- f->flush(cout);
+ RGWUserMetadataObject *mdo = new RGWUserMetadataObject(info, objv);
+
+ *obj = mdo;
+
return 0;
}
- int update(RGWRados *store, string& metadata_key, bufferlist& bl) {
+ int put(RGWRados *store, string& entry, obj_version& objv, JSONObj *obj) {
+ RGWUserInfo info;
+
+ decode_json_obj(info, obj);
+
+ RGWUserInfo old_info;
+ obj_version old_objv;
+ int ret = rgw_read_uid_info(store, entry, old_info, &old_objv);
+ if (ret < 0)
+ return ret;
+
+
+ ret = rgw_store_user_info(store, info, &old_info, false);
+ if (ret < 0)
+ return ret;
+
return 0;
}