virtual int create_bucket(std::string& id, std::string& bucket, map<std::string, bufferlist>& attrs, uint64_t auid=0) = 0;
/** write an object to the storage device in the appropriate pool
with the given stats */
- virtual int put_obj_meta(std::string& id, std::string& bucket, std::string& obj, std::string& loc, time_t *mtime,
+ virtual int put_obj_meta(std::string& id, rgw_obj& obj, std::string& loc, time_t *mtime,
map<std::string, bufferlist>& attrs, bool exclusive) = 0;
- virtual int put_obj_data(std::string& id, std::string& bucket, std::string& obj, std::string& loc, const char *data,
+ virtual int put_obj_data(std::string& id, rgw_obj& obj, std::string& loc, const char *data,
off_t ofs, size_t len, time_t *mtime) = 0;
- int put_obj(std::string& id, std::string& bucket, std::string& obj, std::string& loc, const char *data, size_t len,
+ int put_obj(std::string& id, rgw_obj& obj, std::string& loc, const char *data, size_t len,
time_t *mtime, map<std::string, bufferlist>& attrs) {
- int ret = put_obj_meta(id, bucket, obj, loc, NULL, attrs, false);
+ int ret = put_obj_meta(id, obj, loc, NULL, attrs, false);
if (ret >= 0) {
- ret = put_obj_data(id, bucket, obj, loc, data, -1, len, mtime);
+ ret = put_obj_data(id, obj, loc, data, -1, len, mtime);
}
return ret;
}
* err: stores any errors resulting from the get of the original object
* Returns: 0 on success, -ERR# otherwise.
*/
- virtual int copy_obj(std::string& id, std::string& dest_bucket, std::string& dest_obj,
- std::string& src_bucket, std::string& src_obj,
+ virtual int copy_obj(std::string& id, rgw_obj& dest_obj,
+ rgw_obj& src_obj,
time_t *mtime,
const time_t *mod_ptr,
const time_t *unmod_ptr,
* obj: name of the object to delete
* Returns: 0 on success, -ERR# otherwise.
*/
- virtual int delete_obj(std::string& id, std::string& bucket, std::string& obj) = 0;
+ virtual int delete_obj(std::string& id, rgw_obj& obj) = 0;
/**
* Get data about an object out of RADOS and into memory.
* (if get_data==true) length of read data,
* (if get_data==false) length of the object
*/
- virtual int prepare_get_obj(std::string& bucket, std::string& obj, std::string& loc,
+ virtual int prepare_get_obj(rgw_obj& obj, std::string& loc,
off_t ofs, off_t *end,
map<string, bufferlist> *attrs,
const time_t *mod_ptr,
void **handle,
struct rgw_err *err) = 0;
- virtual int get_obj(void **handle, std::string& bucket, std::string& oid, std::string& loc,
+ virtual int get_obj(void **handle, rgw_obj& obj, std::string& loc,
char **data, off_t ofs, off_t end) = 0;
virtual void finish_get_obj(void **handle) = 0;
- virtual int clone_range(std::string& bucket, std::string& dst_oid, off_t dst_ofs,
- std::string& src_oid, off_t src_ofs, size_t size, std::string& loc) = 0;
+ virtual int clone_range(rgw_obj& dst_obj, off_t dst_ofs,
+ rgw_obj& src_obj, off_t src_ofs,
+ size_t size, std::string& loc) = 0;
/**
* a simple object read without keeping state
*/
- virtual int read(std::string& bucket, std::string& oid, off_t ofs, size_t size, bufferlist& bl) = 0;
+ virtual int read(rgw_obj& obj, off_t ofs, size_t size, bufferlist& bl) = 0;
/**
* Get the attributes for an object.
* dest: bufferlist to store the result in
* Returns: 0 on success, -ERR# otherwise.
*/
- virtual int get_attr(std::string& bucket, std::string& obj, std::string& loc,
- const char *name, bufferlist& dest) = 0;
+ virtual int get_attr(rgw_obj& obj, std::string& loc, const char *name, bufferlist& dest) = 0;
+
/**
* Set an attr on an object.
* bucket: name of the bucket holding the object
* bl: the contents of the attr
* Returns: 0 on success, -ERR# otherwise.
*/
- virtual int set_attr(std::string& bucket, std::string& obj,
- const char *name, bufferlist& bl) = 0;
+ virtual int set_attr(rgw_obj& obj, const char *name, bufferlist& bl) = 0;
/**
* stat an object
*/
- virtual int obj_stat(std::string& bucket, std::string& obj, uint64_t *psize, time_t *pmtime) = 0;
+ virtual int obj_stat(rgw_obj& obj, uint64_t *psize, time_t *pmtime) = 0;
virtual bool supports_tmap() { return false; }
- virtual int tmap_set(std::string& bucket, std::string& obj, std::string& key, bufferlist& bl) { return -ENOTSUP; }
- virtual int tmap_create(std::string& bucket, std::string& obj, std::string& key, bufferlist& bl) { return -ENOTSUP; }
- virtual int tmap_del(std::string& bucket, std::string& obj, std::string& key) { return -ENOTSUP; }
+ virtual int tmap_set(rgw_obj& obj, std::string& key, bufferlist& bl) { return -ENOTSUP; }
+ virtual int tmap_create(rgw_obj& obj, std::string& key, bufferlist& bl) { return -ENOTSUP; }
+ virtual int tmap_del(rgw_obj& obj, std::string& key) { return -ENOTSUP; }
virtual int update_containers_stats(map<string, RGWBucketEnt>& m) { return -ENOTSUP; }
- virtual int append_async(std::string& bucket, std::string& oid, size_t size, bufferlist& bl) { return -ENOTSUP; }
+ virtual int append_async(rgw_obj& obj, size_t size, bufferlist& bl) { return -ENOTSUP; }
/**
object = "";
string bucket_str(bucket);
string object_str(object);
- int ret = store->get_attr(bucket_str, object_str, object_str,
- RGW_ATTR_ACL, bl);
+ rgw_obj obj(bucket_str, object_str);
+ int ret = store->get_attr(obj, object_str, RGW_ATTR_ACL, bl);
RGWAccessControlPolicy policy;
if (ret >= 0) {
}
uint64_t size;
- int r = store->obj_stat(log_bucket, oid, &size, NULL);
+ rgw_obj obj(log_bucket, oid);
+ int r = store->obj_stat(obj, &size, NULL);
if (r < 0) {
cerr << "error while doing stat on " << log_bucket << ":" << oid
<< " " << cpp_strerror(-r) << std::endl;
return -r;
}
bufferlist bl;
- r = store->read(log_bucket, oid, 0, size, bl);
+ r = store->read(obj, 0, size, bl);
if (r < 0) {
cerr << "error while reading from " << log_bucket << ":" << oid
<< " " << cpp_strerror(-r) << std::endl;
};
WRITE_CLASS_ENCODER(RGWUploadPartInfo)
+class rgw_obj {
+public:
+ std::string bucket;
+ std::string object;
+
+ rgw_obj() {}
+ rgw_obj(std::string& b, std::string& o) : bucket(b), object(o) {}
+ void init(std::string& b, std::string& o) {
+ bucket = b;
+ object = o;
+ }
+};
+
static inline void buf_to_hex(const unsigned char *buf, int len, char *str)
{
int i;
}
}
-int RGWFS::obj_stat(string& bucket, string& obj, uint64_t *psize, time_t *pmtime)
+int RGWFS::obj_stat(rgw_obj& obj, uint64_t *psize, time_t *pmtime)
{
return -ENOTSUP;
}
return 0;
}
-int RGWFS::put_obj_meta(std::string& id, std::string& bucket, std::string& obj, std::string& loc,
+int RGWFS::put_obj_meta(std::string& id, rgw_obj& obj, std::string& loc,
time_t *mtime, map<string, bufferlist>& attrs, bool exclusive)
{
- int len = strlen(DIR_NAME) + 1 + bucket.size() + 1 + obj.size() + 1;
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
+ int len = strlen(DIR_NAME) + 1 + bucket.size() + 1 + oid.size() + 1;
char buf[len];
- snprintf(buf, len, "%s/%s/%s", DIR_NAME, bucket.c_str(), obj.c_str());
+ snprintf(buf, len, "%s/%s/%s", DIR_NAME, bucket.c_str(), oid.c_str());
int fd;
fd = open(buf, O_CREAT | O_WRONLY | (exclusive ? O_EXCL : 0), 0755);
return -errno;
}
-int RGWFS::put_obj_data(std::string& id, std::string& bucket, std::string& obj, std::string& loc, const char *data,
+int RGWFS::put_obj_data(std::string& id, rgw_obj& obj, std::string& loc, const char *data,
off_t ofs, size_t size, time_t *mtime)
{
- int len = strlen(DIR_NAME) + 1 + bucket.size() + 1 + obj.size() + 1;
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
+ int len = strlen(DIR_NAME) + 1 + bucket.size() + 1 + oid.size() + 1;
char buf[len];
- snprintf(buf, len, "%s/%s/%s", DIR_NAME, bucket.c_str(), obj.c_str());
+ snprintf(buf, len, "%s/%s/%s", DIR_NAME, bucket.c_str(), oid.c_str());
int fd;
int open_flags = O_CREAT | O_WRONLY;
return r;
}
-int RGWFS::copy_obj(std::string& id, std::string& dest_bucket, std::string& dest_obj,
- std::string& src_bucket, std::string& src_obj,
+int RGWFS::copy_obj(std::string& id, rgw_obj& dest_obj,
+ rgw_obj& src_obj,
time_t *mtime,
const time_t *mod_ptr,
const time_t *unmod_ptr,
map<string, bufferlist>& attrs,
struct rgw_err *err)
{
+ std::string& dest_bucket = dest_obj.bucket;
+ std::string& dest_oid = dest_obj.object;
+ std::string& src_bucket = src_obj.bucket;
+ std::string& src_oid = src_obj.object;
int ret;
char *data;
void *handle;
time_t lastmod;
map<string, bufferlist> attrset;
- ret = prepare_get_obj(src_bucket, src_obj, src_obj, 0, &end, &attrset, mod_ptr, unmod_ptr, &lastmod,
+ ret = prepare_get_obj(src_obj, src_oid, 0, &end, &attrset, mod_ptr, unmod_ptr, &lastmod,
if_match, if_nomatch, &total_len, &handle, err);
if (ret < 0)
return ret;
do {
- ret = get_obj(&handle, src_bucket, src_obj, src_obj, &data, ofs, end);
+ ret = get_obj(&handle, src_obj, src_oid, &data, ofs, end);
if (ret < 0)
return ret;
ofs += ret;
}
attrs = attrset;
- ret = put_obj(id, dest_bucket, dest_obj, dest_obj, data, ret, mtime, attrs);
+ ret = put_obj(id, dest_obj, dest_oid, data, ret, mtime, attrs);
return ret;
}
}
-int RGWFS::delete_obj(std::string& id, std::string& bucket, std::string& obj)
+int RGWFS::delete_obj(std::string& id, rgw_obj& obj)
{
- int len = strlen(DIR_NAME) + 1 + bucket.size() + 1 + obj.size() + 1;
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
+ int len = strlen(DIR_NAME) + 1 + bucket.size() + 1 + oid.size() + 1;
char buf[len];
- snprintf(buf, len, "%s/%s/%s", DIR_NAME, bucket.c_str(), obj.c_str());
+ snprintf(buf, len, "%s/%s/%s", DIR_NAME, bucket.c_str(), oid.c_str());
if (unlink(buf) < 0)
return -errno;
return attr_len;
}
-int RGWFS::get_attr(std::string& bucket, std::string& obj, std::string& loc,
+int RGWFS::get_attr(rgw_obj& obj, std::string& loc,
const char *name, bufferlist& dest)
{
- int len = strlen(DIR_NAME) + 1 + bucket.size() + 1 + obj.size() + 1;
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
+ int len = strlen(DIR_NAME) + 1 + bucket.size() + 1 + oid.size() + 1;
char buf[len];
int r = -EINVAL;
char *data = NULL;
- snprintf(buf, len, "%s/%s/%s", DIR_NAME, bucket.c_str(), obj.c_str());
+ snprintf(buf, len, "%s/%s/%s", DIR_NAME, bucket.c_str(), oid.c_str());
r = get_attr(name, buf, &data);
if (r < 0)
return r;
}
-int RGWFS::set_attr(std::string& bucket, std::string& obj,
+int RGWFS::set_attr(rgw_obj& obj,
const char *name, bufferlist& bl)
{
- int len = strlen(DIR_NAME) + 1 + bucket.size() + 1 + obj.size() + 1;
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
+ int len = strlen(DIR_NAME) + 1 + bucket.size() + 1 + oid.size() + 1;
char buf[len];
int r;
- snprintf(buf, len, "%s/%s/%s", DIR_NAME, bucket.c_str(), obj.c_str());
+ snprintf(buf, len, "%s/%s/%s", DIR_NAME, bucket.c_str(), oid.c_str());
r = setxattr(buf, name, bl.c_str(), bl.length(), 0);
return ret;
}
-int RGWFS::prepare_get_obj(std::string& bucket, std::string& obj, std::string& loc,
+int RGWFS::prepare_get_obj(rgw_obj& obj, std::string& loc,
off_t ofs, off_t *end,
map<string, bufferlist> *attrs,
const time_t *mod_ptr,
void **handle,
struct rgw_err *err)
{
- int len = strlen(DIR_NAME) + 1 + bucket.size() + 1 + obj.size() + 1;
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
+ int len = strlen(DIR_NAME) + 1 + bucket.size() + 1 + oid.size() + 1;
char buf[len];
int fd;
struct stat st;
if (!state)
return -ENOMEM;
- snprintf(buf, len, "%s/%s/%s", DIR_NAME, bucket.c_str(), obj.c_str());
+ snprintf(buf, len, "%s/%s/%s", DIR_NAME, bucket.c_str(), oid.c_str());
fd = open(buf, O_RDONLY, 0755);
return r;
}
-int RGWFS::get_obj(void **handle, std::string& bucket, std::string& obj, std::string& loc,
+int RGWFS::get_obj(void **handle, rgw_obj& obj, std::string& loc,
char **data, off_t ofs, off_t end)
{
uint64_t len;
}
}
-int RGWFS::read(std::string& bucket, std::string& oid, off_t ofs, size_t size, bufferlist& bl)
+int RGWFS::read(rgw_obj& obj, off_t ofs, size_t size, bufferlist& bl)
{
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
int len = strlen(DIR_NAME) + 1 + bucket.size() + 1 + oid.size() + 1;
char buf[len];
int fd;
bool get_content_type);
int create_bucket(std::string& id, std::string& bucket, map<std::string, bufferlist>& attrs, uint64_t auid=0);
- int put_obj_meta(std::string& id, std::string& bucket, std::string& obj, std::string& loc, time_t *mtime,
+ int put_obj_meta(std::string& id, rgw_obj& obj, std::string& loc, time_t *mtime,
map<std::string, bufferlist>& attrs, bool exclusive);
- int put_obj_data(std::string& id, std::string& bucket, std::string& obj, std::string& loc, const char *data,
+ int put_obj_data(std::string& id, rgw_obj& obj, std::string& loc, const char *data,
off_t ofs, size_t size, time_t *mtime);
- int clone_range(std::string& bucket, std::string& dst_oid, off_t dst_ofs,
- std::string& src_oid, off_t src_ofs, size_t size, std::string& loc) { return -ENOTSUP; }
- int copy_obj(std::string& id, std::string& dest_bucket, std::string& dest_obj,
- std::string& src_bucket, std::string& src_obj,
+ int clone_range(rgw_obj& dst_obj, off_t dst_ofs,
+ rgw_obj& src_obj, off_t src_ofs, size_t size, std::string& loc) { return -ENOTSUP; }
+ int copy_obj(std::string& id, rgw_obj& dest_obj,
+ rgw_obj& src_obj,
time_t *mtime,
const time_t *mod_ptr,
const time_t *unmod_ptr,
map<std::string, bufferlist>& attrs,
struct rgw_err *err);
int delete_bucket(std::string& id, std::string& bucket);
- int delete_obj(std::string& id, std::string& bucket, std::string& obj);
+ int delete_obj(std::string& id, rgw_obj& obj);
int get_attr(const char *name, int fd, char **attr);
int get_attr(const char *name, const char *path, char **attr);
- int get_attr(std::string& bucket, std::string& obj, std::string& loc,
- const char *name, bufferlist& dest);
- int set_attr(std::string& bucket, std::string& obj,
- const char *name, bufferlist& bl);
+ int get_attr(rgw_obj& obj, std::string& loc, const char *name, bufferlist& dest);
+ int set_attr(rgw_obj& obj, const char *name, bufferlist& bl);
- int prepare_get_obj(std::string& bucket, std::string& obj, std::string& loc,
+ int prepare_get_obj(rgw_obj& obj, std::string& loc,
off_t ofs, off_t *end,
map<std::string, bufferlist> *attrs,
const time_t *mod_ptr,
void **handle,
struct rgw_err *err);
- int get_obj(void **handle, std::string& bucket, std::string& obj, std::string& loc,
+ int get_obj(void **handle, rgw_obj& obj, std::string& loc,
char **data, off_t ofs, off_t end);
void finish_get_obj(void **handle);
- int read(std::string& bucket, std::string& oid, off_t ofs, size_t size, bufferlist& bl);
- int obj_stat(string& bucket, string& obj, uint64_t *psize, time_t *pmtime);
+ int read(rgw_obj& obj, off_t ofs, size_t size, bufferlist& bl);
+ int obj_stat(rgw_obj& obj, uint64_t *psize, time_t *pmtime);
};
#endif
char buf[entry.bucket.size() + 16];
sprintf(buf, "%.4d-%.2d-%.2d-%s", (bdt.tm_year+1900), (bdt.tm_mon+1), bdt.tm_mday, entry.bucket.c_str());
- string oid = buf;
+ rgw_obj obj;
+ obj.bucket = log_bucket;
+ obj.object = buf;
- int ret = rgwstore->append_async(log_bucket, oid, bl.length(), bl);
+ int ret = rgwstore->append_async(obj, bl.length(), bl);
if (ret == -ENOENT) {
string id;
ret = rgwstore->create_bucket(id, log_bucket, attrs);
if (ret < 0)
goto done;
- ret = rgwstore->append_async(log_bucket, entry.bucket, bl.length(), bl);
+ obj.object = entry.bucket;
+ ret = rgwstore->append_async(obj, bl.length(), bl);
}
done:
if (ret < 0)
int ret = 0;
if (bucket.size()) {
- ret = rgwstore->get_attr(bucket, object, loc,
- RGW_ATTR_ACL, bl);
+ rgw_obj obj(bucket, object);
+ ret = rgwstore->get_attr(obj, loc, RGW_ATTR_ACL, bl);
if (ret >= 0) {
bufferlist::iterator iter = bl.begin();
void RGWGetObj::execute()
{
void *handle = NULL;
+ rgw_obj obj;
if (!verify_permission(s, RGW_PERM_READ)) {
ret = -EACCES;
init_common();
- ret = rgwstore->prepare_get_obj(s->bucket_str, s->object_str, s->object_str, ofs, &end, &attrs, mod_ptr,
+ obj.init(s->bucket_str, s->object_str);
+ ret = rgwstore->prepare_get_obj(obj, s->object_str, ofs, &end, &attrs, mod_ptr,
unmod_ptr, &lastmod, if_match, if_nomatch, &total_len, &handle, &s->err);
if (ret < 0)
goto done;
goto done;
while (ofs <= end) {
- ret = rgwstore->get_obj(&handle, s->bucket_str, s->object_str, s->object_str, &data, ofs, end);
+ ret = rgwstore->get_obj(&handle, obj, s->object_str, &data, ofs, end);
if (ret < 0) {
goto done;
}
}
MD5 hash;
- string obj;
+ string oid;
multipart = s->args.exists("uploadId");
if (!multipart) {
- obj = s->object_str;
+ oid = s->object_str;
} else {
- obj = s->object_str;
- obj.append(".");
- obj.append(s->args.get("uploadId"));
- multipart_meta_obj = obj;
+ oid = s->object_str;
+ oid.append(".");
+ oid.append(s->args.get("uploadId"));
+ multipart_meta_obj = oid;
part_num = s->args.get("partNumber");
if (part_num.empty()) {
ret = -EINVAL;
goto done;
}
- obj.append(".");
- obj.append(part_num);
+ oid.append(".");
+ oid.append(part_num);
}
+ rgw_obj obj(s->bucket_str, oid);
do {
get_data();
if (len > 0) {
hash.Update((unsigned char *)data, len);
// For the first call to put_obj_data, pass -1 as the offset to
// do a write_full.
- ret = rgwstore->put_obj_data(s->user.user_id, s->bucket_str,
- obj, s->object_str, data,
+ ret = rgwstore->put_obj_data(s->user.user_id, obj,
+ s->object_str, data,
((ofs == 0) ? -1 : ofs), len, NULL);
free(data);
if (ret < 0)
get_request_metadata(s, attrs);
- ret = rgwstore->put_obj_meta(s->user.user_id, s->bucket_str, obj, s->object_str, NULL, attrs, false);
+ ret = rgwstore->put_obj_meta(s->user.user_id, obj, s->object_str, NULL, attrs, false);
if (ret < 0)
goto done;
::encode(info, bl);
RGW_LOG(0) << "JJJ name=" << p << "bl.length()=" << bl.length() << dendl;
meta_attrs[p] = bl;
+
+ rgw_obj meta_obj(s->bucket_str, multipart_meta_obj);
- ret = rgwstore->put_obj_meta(s->user.user_id, s->bucket_str, multipart_meta_obj, s->object_str, NULL, meta_attrs, false);
+ ret = rgwstore->put_obj_meta(s->user.user_id, meta_obj, s->object_str, NULL, meta_attrs, false);
}
}
done:
void RGWDeleteObj::execute()
{
ret = -EINVAL;
+ rgw_obj obj(s->bucket_str, s->object_str);
if (s->object) {
- ret = rgwstore->delete_obj(s->user.user_id, s->bucket_str, s->object_str);
+ ret = rgwstore->delete_obj(s->user.user_id, obj);
}
send_response();
void RGWCopyObj::execute()
{
+ rgw_obj src_obj, dst_obj;
+
ret = get_params();
if (ret < 0)
goto done;
if (init_common() < 0)
goto done;
+ src_obj.init(src_bucket, src_object);
+ dst_obj.init(s->bucket_str, s->object_str);
ret = rgwstore->copy_obj(s->user.user_id,
- s->bucket_str, s->object_str,
- src_bucket, src_object,
+ dst_obj,
+ src_obj,
&mtime,
mod_ptr,
unmod_ptr,
char *orig_data = data;
char *new_data = NULL;
ACLOwner owner;
+ rgw_obj obj;
if (!verify_permission(s, RGW_PERM_WRITE_ACP)) {
ret = -EACCES;
}
new_policy.encode(bl);
- ret = rgwstore->set_attr(s->bucket_str, s->object_str,
- RGW_ATTR_ACL, bl);
+ obj.init(s->bucket_str, s->object_str);
+ ret = rgwstore->set_attr(obj, RGW_ATTR_ACL, bl);
done:
free(orig_data);
bufferlist aclbl;
RGWAccessControlPolicy policy;
map<string, bufferlist> attrs;
+ rgw_obj obj;
if (get_params() < 0)
goto done;
tmp_obj_name.append(".");
tmp_obj_name.append(upload_id);
- ret = rgwstore->put_obj_meta(s->user.user_id, s->bucket_str, tmp_obj_name, s->object_str, NULL, attrs, true);
+ obj.init(s->bucket_str, tmp_obj_name);
+ ret = rgwstore->put_obj_meta(s->user.user_id, obj, s->object_str, NULL, attrs, true);
} while (ret == -EEXIST);
done:
send_response();
}
-static int get_multiparts_info(struct req_state *s, string& obj, map<uint32_t, RGWUploadPartInfo>& parts,
+static int get_multiparts_info(struct req_state *s, string& oid, map<uint32_t, RGWUploadPartInfo>& parts,
RGWAccessControlPolicy& policy, map<string, bufferlist>& new_attrs)
{
void *handle;
map<string, bufferlist> attrs;
map<string, bufferlist>::iterator iter;
- int ret = rgwstore->prepare_get_obj(s->bucket_str, obj, s->object_str, 0, NULL, &attrs, NULL,
+ rgw_obj obj(s->bucket_str, oid);
+
+ int ret = rgwstore->prepare_get_obj(obj, s->object_str, 0, NULL, &attrs, NULL,
NULL, NULL, NULL, NULL, NULL, &handle, &s->err);
rgwstore->finish_get_obj(&handle);
RGWMultiCompleteUpload *parts;
map<int, string>::iterator iter;
RGWMultiXMLParser parser;
- string obj = s->object_str;
- string meta_obj;
+ string oid = s->object_str;
+ string meta_oid;
map<uint32_t, RGWUploadPartInfo> obj_parts;
map<uint32_t, RGWUploadPartInfo>::iterator obj_iter;
RGWAccessControlPolicy policy;
char final_etag[CEPH_CRYPTO_MD5_DIGESTSIZE];
char final_etag_str[CEPH_CRYPTO_MD5_DIGESTSIZE * 2 + 16];
bufferlist etag_bl;
-
+ rgw_obj meta_obj;
+ rgw_obj target_obj;
ret = get_params();
goto done;
}
- obj.append(".");
- obj.append(upload_id);
- meta_obj = obj;
- prefix = obj;
+ oid.append(".");
+ oid.append(upload_id);
+ meta_oid = oid;
+ prefix = oid;
prefix.append(".");
- ret = get_multiparts_info(s, obj, obj_parts, policy, attrs);
+ ret = get_multiparts_info(s, oid, obj_parts, policy, attrs);
if (ret == -ENOENT)
ret = -ERR_NO_SUCH_UPLOAD;
if (parts->parts.size() != obj_parts.size())
attrs[RGW_ATTR_ETAG] = etag_bl;
- ret = rgwstore->put_obj_meta(s->user.user_id, s->bucket_str, s->object_str, s->object_str, NULL, attrs, false);
+ target_obj.init(s->bucket_str, s->object_str);
+ ret = rgwstore->put_obj_meta(s->user.user_id, target_obj, s->object_str, NULL, attrs, false);
if (ret < 0)
goto done;
for (obj_iter = obj_parts.begin(); obj_iter != obj_parts.end(); ++obj_iter) {
- obj = prefix;
+ oid = prefix;
char buf[16];
snprintf(buf, sizeof(buf), "%d", obj_iter->second.num);
- obj.append(buf);
- rgwstore->clone_range(s->bucket_str, s->object_str, ofs, obj, 0, obj_iter->second.size, s->object_str);
+ oid.append(buf);
+ rgw_obj src_obj(s->bucket_str, oid);
+ rgw_obj dst_obj(s->bucket_str, s->object_str);
+ rgwstore->clone_range(dst_obj, ofs, src_obj, 0, obj_iter->second.size, s->object_str);
ofs += obj_iter->second.size;
}
// now erase all parts
for (obj_iter = obj_parts.begin(); obj_iter != obj_parts.end(); ++obj_iter) {
- obj = prefix;
+ oid = prefix;
char buf[16];
snprintf(buf, sizeof(buf), "%d", obj_iter->second.num);
- obj.append(buf);
- rgwstore->delete_obj(s->user.user_id, s->bucket_str, obj);
+ oid.append(buf);
+ rgw_obj obj(s->bucket_str, oid);
+ rgwstore->delete_obj(s->user.user_id, obj);
}
// and also remove the metadata obj
- rgwstore->delete_obj(s->user.user_id, s->bucket_str, meta_obj);
+ meta_obj.init(s->bucket_str, meta_oid);
+ rgwstore->delete_obj(s->user.user_id, meta_obj);
done:
* exclusive: create object exclusively
* Returns: 0 on success, -ERR# otherwise.
*/
-int RGWRados::put_obj_meta(std::string& id, std::string& bucket, std::string& oid, std::string& loc,
+int RGWRados::put_obj_meta(std::string& id, rgw_obj& obj, std::string& loc,
time_t *mtime, map<string, bufferlist>& attrs, bool exclusive)
{
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
librados::IoCtx io_ctx;
int r = open_bucket_ctx(bucket, io_ctx);
* attrs: all the given attrs are written to bucket storage for the given object
* Returns: 0 on success, -ERR# otherwise.
*/
-int RGWRados::put_obj_data(std::string& id, std::string& bucket, std::string& oid, std::string& loc,
+int RGWRados::put_obj_data(std::string& id, rgw_obj& obj, std::string& loc,
const char *data, off_t ofs, size_t len, time_t *mtime)
{
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
librados::IoCtx io_ctx;
int r = open_bucket_ctx(bucket, io_ctx);
* err: stores any errors resulting from the get of the original object
* Returns: 0 on success, -ERR# otherwise.
*/
-int RGWRados::copy_obj(std::string& id, std::string& dest_bucket, std::string& dest_obj,
- std::string& src_bucket, std::string& src_obj,
+int RGWRados::copy_obj(std::string& id, rgw_obj& dest_obj,
+ rgw_obj& src_obj,
time_t *mtime,
const time_t *mod_ptr,
const time_t *unmod_ptr,
map<string, bufferlist>& attrs, /* in/out */
struct rgw_err *err)
{
+ string& dest_bucket = dest_obj.bucket;
+ string& dest_oid = dest_obj.object;
+ string& src_bucket = src_obj.bucket;
+ string& src_oid = src_obj.object;
int ret, r;
char *data;
off_t end = -1;
time_t lastmod;
map<string, bufferlist>::iterator iter;
- RGW_LOG(5) << "Copy object " << src_bucket << ":" << src_obj << " => " << dest_bucket << ":" << dest_obj << dendl;
+ RGW_LOG(5) << "Copy object " << src_bucket << ":" << src_oid << " => " << dest_bucket << ":" << dest_oid << dendl;
void *handle = NULL;
map<string, bufferlist> attrset;
- ret = prepare_get_obj(src_bucket, src_obj, src_obj, 0, &end, &attrset,
+ ret = prepare_get_obj(src_obj, src_oid, 0, &end, &attrset,
mod_ptr, unmod_ptr, &lastmod, if_match, if_nomatch, &total_len, &handle, err);
if (ret < 0)
off_t ofs = 0;
do {
- ret = get_obj(&handle, src_bucket, src_obj, src_obj, &data, ofs, end);
+ ret = get_obj(&handle, src_obj, src_oid, &data, ofs, end);
if (ret < 0)
return ret;
// In the first call to put_obj_data, we pass ofs == -1 so that it will do
// a write_full, wiping out whatever was in the object before this
- r = put_obj_data(id, dest_bucket, dest_obj, dest_obj, data,
+ r = put_obj_data(id, dest_obj, dest_oid, data,
((ofs == 0) ? -1 : ofs), ret, NULL);
free(data);
if (r < 0)
}
attrs = attrset;
- ret = put_obj_meta(id, dest_bucket, dest_obj, dest_obj, mtime, attrs, false);
+ ret = put_obj_meta(id, dest_obj, dest_oid, mtime, attrs, false);
finish_get_obj(&handle);
* obj: name of the object to delete
* Returns: 0 on success, -ERR# otherwise.
*/
-int RGWRados::delete_obj(std::string& id, std::string& bucket, std::string& oid)
+int RGWRados::delete_obj(std::string& id, rgw_obj& obj)
{
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
librados::IoCtx io_ctx;
int r = open_bucket_ctx(bucket, io_ctx);
if (r < 0)
* dest: bufferlist to store the result in
* Returns: 0 on success, -ERR# otherwise.
*/
-int RGWRados::get_attr(std::string& bucket, std::string& obj, std::string& loc,
+int RGWRados::get_attr(rgw_obj& obj, std::string& loc,
const char *name, bufferlist& dest)
{
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
librados::IoCtx io_ctx;
string actual_bucket = bucket;
- string actual_obj = obj;
+ string actual_obj = oid;
if (actual_obj.size() == 0) {
actual_obj = bucket;
* bl: the contents of the attr
* Returns: 0 on success, -ERR# otherwise.
*/
-int RGWRados::set_attr(std::string& bucket, std::string& oid,
- const char *name, bufferlist& bl)
+int RGWRados::set_attr(rgw_obj& obj, const char *name, bufferlist& bl)
{
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
librados::IoCtx io_ctx;
string actual_bucket = bucket;
string actual_obj = oid;
* (if get_data==true) length of read data,
* (if get_data==false) length of the object
*/
-int RGWRados::prepare_get_obj(std::string& bucket, std::string& oid, std::string& loc,
+int RGWRados::prepare_get_obj(rgw_obj& obj, std::string& loc,
off_t ofs, off_t *end,
map<string, bufferlist> *attrs,
const time_t *mod_ptr,
void **handle,
struct rgw_err *err)
{
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
int r = -EINVAL;
uint64_t size;
bufferlist etag;
}
}
if (if_match || if_nomatch) {
- r = get_attr(bucket, oid, loc, RGW_ATTR_ETAG, etag);
+ r = get_attr(obj, loc, RGW_ATTR_ETAG, etag);
if (r < 0)
goto done_err;
return r;
}
-int RGWRados::clone_range(std::string& bucket, std::string& dst_oid, off_t dst_ofs,
- std::string& src_oid, off_t src_ofs, size_t size, std::string& loc)
+int RGWRados::clone_range(rgw_obj& dst_obj, off_t dst_ofs,
+ rgw_obj& src_obj, off_t src_ofs, size_t size, std::string& loc)
{
+ std::string& bucket = dst_obj.bucket;
+ std::string& dst_oid = dst_obj.object;
+ std::string& src_oid = src_obj.object;
librados::IoCtx io_ctx;
int r = open_bucket_ctx(bucket, io_ctx);
int RGWRados::get_obj(void **handle,
- std::string& bucket, std::string& oid, string& loc,
+ rgw_obj& obj, string& loc,
char **data, off_t ofs, off_t end)
{
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
uint64_t len;
bufferlist bl;
}
/* a simple object read */
-int RGWRados::read(std::string& bucket, std::string& oid, off_t ofs, size_t size, bufferlist& bl)
+int RGWRados::read(rgw_obj& obj, off_t ofs, size_t size, bufferlist& bl)
{
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
librados::IoCtx io_ctx;
int r = open_bucket_ctx(bucket, io_ctx);
if (r < 0)
return r;
}
-int RGWRados::obj_stat(std::string& bucket, std::string& obj, uint64_t *psize, time_t *pmtime)
+int RGWRados::obj_stat(rgw_obj& obj, uint64_t *psize, time_t *pmtime)
{
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
librados::IoCtx io_ctx;
int r = open_bucket_ctx(bucket, io_ctx);
if (r < 0)
return r;
if (r < 0)
return r;
- r = io_ctx.stat(obj, psize, pmtime);
+ r = io_ctx.stat(oid, psize, pmtime);
return r;
}
-int RGWRados::tmap_set(std::string& bucket, std::string& obj, std::string& key, bufferlist& bl)
+int RGWRados::tmap_set(rgw_obj& obj, std::string& key, bufferlist& bl)
{
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
bufferlist cmdbl, emptybl;
__u8 c = CEPH_OSD_TMAP_SET;
::encode(key, cmdbl);
::encode(bl, cmdbl);
- RGW_LOG(15) << "tmap_set bucket=" << bucket << " obj=" << obj << " key=" << key << dendl;
+ RGW_LOG(15) << "tmap_set bucket=" << bucket << " oid=" << oid << " key=" << key << dendl;
librados::IoCtx io_ctx;
int r = open_bucket_ctx(bucket, io_ctx);
if (r < 0)
return r;
- r = io_ctx.tmap_update(obj, cmdbl);
+ r = io_ctx.tmap_update(oid, cmdbl);
return r;
}
-int RGWRados::tmap_create(std::string& bucket, std::string& obj, std::string& key, bufferlist& bl)
+int RGWRados::tmap_create(rgw_obj& obj, std::string& key, bufferlist& bl)
{
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
bufferlist cmdbl, emptybl;
__u8 c = CEPH_OSD_TMAP_CREATE;
int r = open_bucket_ctx(bucket, io_ctx);
if (r < 0)
return r;
- r = io_ctx.tmap_update(obj, cmdbl);
+ r = io_ctx.tmap_update(oid, cmdbl);
return r;
}
-int RGWRados::tmap_del(std::string& bucket, std::string& obj, std::string& key)
+int RGWRados::tmap_del(rgw_obj& obj, std::string& key)
{
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
bufferlist cmdbl;
__u8 c = CEPH_OSD_TMAP_RM;
int r = open_bucket_ctx(bucket, io_ctx);
if (r < 0)
return r;
- r = io_ctx.tmap_update(obj, cmdbl);
+ r = io_ctx.tmap_update(oid, cmdbl);
return r;
}
int RGWRados::update_containers_stats(map<string, RGWBucketEnt>& m)
return count;
}
-int RGWRados::append_async(std::string& bucket, std::string& oid, size_t size, bufferlist& bl)
+int RGWRados::append_async(rgw_obj& obj, size_t size, bufferlist& bl)
{
+ std::string& bucket = obj.bucket;
+ std::string& oid = obj.object;
librados::IoCtx io_ctx;
int r = open_bucket_ctx(bucket, io_ctx);
if (r < 0)
virtual int create_bucket(std::string& id, std::string& bucket, map<std::string,bufferlist>& attrs, uint64_t auid=0);
/** Write/overwrite an object to the bucket storage. */
- virtual int put_obj_meta(std::string& id, std::string& bucket, std::string& obj, std::string& loc, time_t *mtime,
+ virtual int put_obj_meta(std::string& id, rgw_obj& obj, std::string& loc, time_t *mtime,
map<std::string, bufferlist>& attrs, bool exclusive);
- virtual int put_obj_data(std::string& id, std::string& bucket, std::string& obj, std::string& loc, const char *data,
+ virtual int put_obj_data(std::string& id, rgw_obj& obj, std::string& loc, const char *data,
off_t ofs, size_t len, time_t *mtime);
- virtual int clone_range(std::string& bucket, std::string& dst_oid, off_t dst_ofs,
- std::string& src_oid, off_t src_ofs, size_t size, std::string& loc);
+ virtual int clone_range(rgw_obj& dst_obj, off_t dst_ofs,
+ rgw_obj& src_obj, off_t src_ofs, size_t size, std::string& loc);
/** Copy an object, with many extra options */
- virtual int copy_obj(std::string& id, std::string& dest_bucket, std::string& dest_obj,
- std::string& src_bucket, std::string& src_obj,
+ virtual int copy_obj(std::string& id, rgw_obj& dest_obj,
+ rgw_obj& src_obj,
time_t *mtime,
const time_t *mod_ptr,
const time_t *unmod_ptr,
virtual int delete_bucket(std::string& id, std::string& bucket);
/** Delete an object.*/
- virtual int delete_obj(std::string& id, std::string& bucket, std::string& obj);
+ virtual int delete_obj(std::string& id, rgw_obj& src_obj);
/** Get the attributes for an object.*/
- virtual int get_attr(std::string& bucket, std::string& obj, std::string& loc,
+ virtual int get_attr(rgw_obj& obj, std::string& loc,
const char *name, bufferlist& dest);
/** Set an attr on an object. */
- virtual int set_attr(std::string& bucket, std::string& obj,
- const char *name, bufferlist& bl);
+ virtual int set_attr(rgw_obj& obj, const char *name, bufferlist& bl);
/** Get data about an object out of RADOS and into memory. */
- virtual int prepare_get_obj(std::string& bucket, std::string& obj, std::string& loc,
+ virtual int prepare_get_obj(rgw_obj& obj, std::string& loc,
off_t ofs, off_t *end,
map<string, bufferlist> *attrs,
const time_t *mod_ptr,
void **handle,
struct rgw_err *err);
- virtual int get_obj(void **handle, std::string& bucket, std::string& oid, std::string& loc,
+ virtual int get_obj(void **handle, rgw_obj& obj, std::string& loc,
char **data, off_t ofs, off_t end);
virtual void finish_get_obj(void **handle);
- virtual int read(std::string& bucket, std::string& oid, off_t ofs, size_t size, bufferlist& bl);
+ virtual int read(rgw_obj& obj, off_t ofs, size_t size, bufferlist& bl);
- virtual int obj_stat(std::string& bucket, std::string& obj, uint64_t *psize, time_t *pmtime);
+ virtual int obj_stat(rgw_obj& obj, uint64_t *psize, time_t *pmtime);
virtual bool supports_tmap() { return true; }
- virtual int tmap_set(std::string& bucket, std::string& obj, std::string& key, bufferlist& bl);
- virtual int tmap_create(std::string& bucket, std::string& obj, std::string& key, bufferlist& bl);
- virtual int tmap_del(std::string& bucket, std::string& obj, std::string& key);
+ virtual int tmap_set(rgw_obj& obj, std::string& key, bufferlist& bl);
+ virtual int tmap_create(rgw_obj& obj, std::string& key, bufferlist& bl);
+ virtual int tmap_del(rgw_obj& obj, std::string& key);
virtual int update_containers_stats(map<string, RGWBucketEnt>& m);
- virtual int append_async(std::string& bucket, std::string& oid, size_t size, bufferlist& bl);
+ virtual int append_async(rgw_obj& obj, size_t size, bufferlist& bl);
};
#endif
{
map<string,bufferlist> attrs;
- int ret = rgwstore->put_obj(uid, bucket, oid, oid, data, size, NULL, attrs);
+ rgw_obj obj;
+ obj.bucket = bucket;
+ obj.object = oid;
+
+ int ret = rgwstore->put_obj(uid, obj, oid, data, size, NULL, attrs);
if (ret == -ENOENT) {
ret = rgwstore->create_bucket(uid, bucket, attrs);
if (ret >= 0)
- ret = rgwstore->put_obj(uid, bucket, oid, oid, data, size, NULL, attrs);
+ ret = rgwstore->put_obj(uid, obj, oid, data, size, NULL, attrs);
}
return ret;
void *handle = NULL;
bufferlist::iterator iter;
int request_len = READ_CHUNK_LEN;
- ret = rgwstore->prepare_get_obj(bucket, key, key, 0, NULL, NULL, NULL,
+ rgw_obj obj(bucket, key);
+ ret = rgwstore->prepare_get_obj(obj, key, 0, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, &handle, &err);
if (ret < 0)
return ret;
do {
- ret = rgwstore->get_obj(&handle, bucket, key, key, &data, 0, request_len - 1);
+ ret = rgwstore->get_obj(&handle, obj, key, &data, 0, request_len - 1);
if (ret < 0)
goto done;
if (ret < request_len)
static int rgw_read_buckets_from_attr(string& user_id, RGWUserBuckets& buckets)
{
bufferlist bl;
- int ret = rgwstore->get_attr(ui_uid_bucket, user_id, user_id, RGW_ATTR_BUCKETS, bl);
+ rgw_obj obj(ui_uid_bucket, user_id);
+ int ret = rgwstore->get_attr(obj, user_id, RGW_ATTR_BUCKETS, bl);
if (ret)
return ret;
bufferlist bl;
#define LARGE_ENOUGH_LEN (4096 * 1024)
size_t len = LARGE_ENOUGH_LEN;
+ rgw_obj obj(ui_uid_bucket, buckets_obj_id);
do {
- ret = rgwstore->read(ui_uid_bucket, buckets_obj_id, 0, len, bl);
+ ret = rgwstore->read(obj, 0, len, bl);
if (ret == -ENOENT) {
/* try to read the old format */
ret = rgw_read_buckets_from_attr(user_id, buckets);
bufferlist bl;
buckets.encode(bl);
- int ret = rgwstore->set_attr(ui_uid_bucket, user_id, RGW_ATTR_BUCKETS, bl);
+ rgw_obj obj(ui_uid_bucket, user_id);
+
+ int ret = rgwstore->set_attr(obj, RGW_ATTR_BUCKETS, bl);
return ret;
}
string buckets_obj_id;
get_buckets_obj(user_id, buckets_obj_id);
- ret = rgwstore->tmap_create(ui_uid_bucket, buckets_obj_id, bucket_name, bl);
+ rgw_obj obj(ui_uid_bucket, buckets_obj_id);
+ ret = rgwstore->tmap_create(obj, bucket_name, bl);
if (ret < 0) {
RGW_LOG(0) << "error adding bucket to directory: "
<< cpp_strerror(-ret)<< dendl;
string buckets_obj_id;
get_buckets_obj(user_id, buckets_obj_id);
- ret = rgwstore->tmap_del(ui_uid_bucket, buckets_obj_id, bucket_name);
+ rgw_obj obj(ui_uid_bucket, buckets_obj_id);
+ ret = rgwstore->tmap_del(obj, bucket_name);
if (ret < 0) {
RGW_LOG(0) << "error removing bucket from directory: "
<< cpp_strerror(-ret)<< dendl;
int rgw_remove_key_storage(RGWAccessKey& access_key)
{
- rgwstore->delete_obj(access_key.id, ui_key_bucket, access_key.id);
+ rgw_obj obj(ui_key_bucket, access_key.id);
+ rgwstore->delete_obj(access_key.id, obj);
return 0;
}
i != buckets.end();
++i) {
string bucket_name = i->first;
- rgwstore->delete_obj(info.user_id, rgw_root_bucket, bucket_name);
+ rgw_obj obj(rgw_root_bucket, bucket_name);
+ rgwstore->delete_obj(info.user_id, obj);
}
map<string, RGWAccessKey>::iterator kiter = info.access_keys.begin();
for (; kiter != info.access_keys.end(); ++kiter)
rgw_remove_key_storage(kiter->second);
- rgwstore->delete_obj(info.user_id, ui_uid_bucket, info.user_id);
- rgwstore->delete_obj(info.user_id, ui_email_bucket, info.user_email);
+ rgw_obj uid_obj(ui_uid_bucket, info.user_id);
+ rgwstore->delete_obj(info.user_id, uid_obj);
+ rgw_obj email_obj(ui_email_bucket, info.user_email);
+ rgwstore->delete_obj(info.user_id, email_obj);
return 0;
}