return ret;
}
+int rgw_bucket_delete_bucket_obj(RGWRados *store, string& bucket_name)
+{
+ RGWObjVersionTracker objv_tracker;
+ return store->meta_mgr->remove_entry(bucket_meta_handler, bucket_name, &objv_tracker);
+}
+
static void set_err_msg(std::string *sink, std::string msg)
{
if (sink && !msg.empty())
extern int rgw_bucket_store_info(RGWRados *store, string& bucket_name, bufferlist& bl, bool exclusive,
map<string, bufferlist> *pattrs, RGWObjVersionTracker *objv_tracker);
+extern int rgw_bucket_delete_bucket_obj(RGWRados *store, string& bucket_name);
+
/**
* Store a list of the user's buckets, with associated functinos.
*/
#define dout_subsys ceph_subsys_rgw
-enum RGWMDLogStatus {
- MDLOG_STATUS_UNKNOWN,
- MDLOG_STATUS_WRITING,
- MDLOG_STATUS_REMOVING,
- MDLOG_STATUS_COMPLETE,
-};
-
struct LogStatusDump {
RGWMDLogStatus status;
void dump(Formatter *f) const {
string s;
switch (status) {
- case MDLOG_STATUS_WRITING:
- s = "writing";
+ case MDLOG_STATUS_WRITE:
+ s = "write";
+ break;
+ case MDLOG_STATUS_SETATTRS:
+ s = "set_attrs";
break;
- case MDLOG_STATUS_REMOVING:
- s = "removing";
+ case MDLOG_STATUS_REMOVE:
+ s = "remove";
break;
case MDLOG_STATUS_COMPLETE:
s = "complete";
objv_tracker.read_version = obj->get_version();
-
- RGWMetadataLogData log_data;
- bufferlist logbl;
-
- log_data.read_version = objv_tracker.read_version;
- log_data.write_version = objv_tracker.write_version;
-
- log_data.status = MDLOG_STATUS_REMOVING;
-
- ::encode(log_data, logbl);
-
- string section, key;
- parse_metadata_key(entry, section, key);
-
- ret = md_log->add_entry(store, section, key, logbl);
- if (ret < 0)
- return ret;
-
- ret = handler->remove(store, entry, objv_tracker);
- if (ret < 0) {
- return ret;
- }
-
- logbl.clear();
- log_data.status = MDLOG_STATUS_COMPLETE;
-
- ret = md_log->add_entry(store, section, key, logbl);
- if (ret < 0)
- return ret;
-
- return 0;
+ return handler->remove(store, entry, objv_tracker);
}
}
int RGWMetadataManager::pre_modify(RGWMetadataHandler *handler, string& section, string& key,
- RGWMetadataLogData& log_data, RGWObjVersionTracker *objv_tracker)
+ RGWMetadataLogData& log_data, RGWObjVersionTracker *objv_tracker,
+ RGWMDLogStatus op_type)
{
section = handler->get_type();
log_data.read_version = objv_tracker->read_version;
log_data.write_version = objv_tracker->write_version;
- log_data.status = MDLOG_STATUS_WRITING;
+ log_data.status = op_type;
bufferlist logbl;
::encode(log_data, logbl);
{
string section;
RGWMetadataLogData log_data;
- int ret = pre_modify(handler, section, key, log_data, objv_tracker);
+ int ret = pre_modify(handler, section, key, log_data, objv_tracker, MDLOG_STATUS_WRITE);
if (ret < 0)
return ret;
return 0;
}
+int RGWMetadataManager::remove_entry(RGWMetadataHandler *handler, string& key, RGWObjVersionTracker *objv_tracker)
+{
+ string section;
+ RGWMetadataLogData log_data;
+ int ret = pre_modify(handler, section, key, log_data, objv_tracker, MDLOG_STATUS_REMOVE);
+ if (ret < 0)
+ return ret;
+
+ string oid;
+ rgw_bucket bucket;
+
+ handler->get_pool_and_oid(store, key, bucket, oid);
+
+ rgw_obj obj(bucket, oid);
+
+ ret = store->delete_obj(NULL, obj);
+ if (ret < 0)
+ return ret;
+
+ ret = post_modify(section, key, log_data, objv_tracker);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+}
+
int RGWMetadataManager::set_attrs(RGWMetadataHandler *handler, string& key,
rgw_obj& obj, map<string, bufferlist>& attrs,
map<string, bufferlist>* rmattrs,
{
string section;
RGWMetadataLogData log_data;
- int ret = pre_modify(handler, section, key, log_data, objv_tracker);
+ int ret = pre_modify(handler, section, key, log_data, objv_tracker, MDLOG_STATUS_SETATTRS);
if (ret < 0)
return ret;
struct obj_version;
+enum RGWMDLogStatus {
+ MDLOG_STATUS_UNKNOWN,
+ MDLOG_STATUS_WRITE,
+ MDLOG_STATUS_SETATTRS,
+ MDLOG_STATUS_REMOVE,
+ MDLOG_STATUS_COMPLETE,
+};
+
class RGWMetadataObject {
protected:
obj_version objv;
int find_handler(const string& metadata_key, RGWMetadataHandler **handler, string& entry);
int pre_modify(RGWMetadataHandler *handler, string& section, string& key,
- RGWMetadataLogData& log_data, RGWObjVersionTracker *objv_tracker);
+ RGWMetadataLogData& log_data, RGWObjVersionTracker *objv_tracker,
+ RGWMDLogStatus op_type);
int post_modify(string& section, string& key, RGWMetadataLogData& log_data,
RGWObjVersionTracker *objv_tracker);
int put_entry(RGWMetadataHandler *handler, string& key, bufferlist& bl, bool exclusive,
RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs = NULL);
+ int remove_entry(RGWMetadataHandler *handler, string& key, RGWObjVersionTracker *objv_tracker);
int set_attr(RGWMetadataHandler *handler, string& key, rgw_obj& obj, string& attr, bufferlist& bl,
RGWObjVersionTracker *objv_tracker);
- int set_attrs(RGWMetadataHandler *handler, string& key,
- rgw_obj& obj, map<string, bufferlist>& attrs,
- map<string, bufferlist>* rmattrs,
- RGWObjVersionTracker *objv_tracker);
+ int set_attrs(RGWMetadataHandler *handler, string& key,
+ rgw_obj& obj, map<string, bufferlist>& attrs,
+ map<string, bufferlist>* rmattrs,
+ RGWObjVersionTracker *objv_tracker);
int get(string& metadata_key, Formatter *f);
int put(string& metadata_key, bufferlist& bl);
int remove(string& metadata_key);
}
} while (is_truncated);
- rgw_obj obj(zone.domain_root, bucket.name);
- r = delete_obj(NULL, obj);
+ r = rgw_bucket_delete_bucket_obj(this, bucket.name);
if (r < 0)
return r;
int rgw_remove_uid_index(RGWRados *store, string& uid)
{
- rgw_obj obj(store->zone.user_uid_pool, uid);
- int ret = store->delete_obj(NULL, obj);
- return ret;
+ RGWObjVersionTracker objv_tracker;
+ RGWUserInfo info;
+ int ret = rgw_get_user_info_by_uid(store, uid, info, &objv_tracker);
+ if (ret < 0)
+ return ret;
+
+ ret = store->meta_mgr->remove_entry(user_meta_handler, uid, &objv_tracker);
+ if (ret < 0)
+ return ret;
+
+ return 0;
}
int rgw_remove_email_index(RGWRados *store, string& email)
* from the user and user email pools. This leaves the pools
* themselves alone, as well as any ACLs embedded in object xattrs.
*/
-int rgw_delete_user(RGWRados *store, RGWUserInfo& info) {
+int rgw_delete_user(RGWRados *store, RGWUserInfo& info, RGWObjVersionTracker& objv_tracker) {
string marker;
vector<rgw_bucket> buckets_vec;
rgw_obj uid_obj(store->zone.user_uid_pool, info.user_id);
ldout(store->ctx(), 10) << "removing user index: " << info.user_id << dendl;
- ret = store->delete_obj(NULL, uid_obj);
+ ret = store->meta_mgr->remove_entry(user_meta_handler, info.user_id, &objv_tracker);
if (ret < 0 && ret != -ENOENT) {
ldout(store->ctx(), 0) << "ERROR: could not remove " << info.user_id << ":" << uid_obj << ", should be fixed (err=" << ret << ")" << dendl;
return ret;
done = (m.size() < max_buckets);
} while (!done);
- ret = rgw_delete_user(store, user_info);
+ RGWObjVersionTracker objv_tracker;
+
+ ret = rgw_delete_user(store, user_info, objv_tracker);
if (ret < 0) {
set_err_msg(err_msg, "unable to remove user from RADOS");
return ret;
};
int remove(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker) {
-#warning FIXME: use objv_tracker
-
RGWUserInfo info;
- RGWObjVersionTracker ot;
- int ret = rgw_get_user_info_by_uid(store, entry, info, &ot);
+ int ret = rgw_get_user_info_by_uid(store, entry, info, &objv_tracker);
if (ret < 0)
return ret;
- return rgw_delete_user(store, info);
+ return rgw_delete_user(store, info, objv_tracker);
}
void get_pool_and_oid(RGWRados *store, string& key, rgw_bucket& bucket, string& oid) {
/**
* Given an RGWUserInfo, deletes the user and its bucket ACLs.
*/
-extern int rgw_delete_user(RGWRados *store, RGWUserInfo& user);
+extern int rgw_delete_user(RGWRados *store, RGWUserInfo& user, RGWObjVersionTracker& objv_tracker);
/**
* Store a list of the user's buckets, with associated functinos.
*/