summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-04-15 22:49:26 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-05-08 10:57:46 -0700
commitb295c649597381bfd5e84450a4d4fb9678bcd62c (patch)
tree8f7e77c2d4514d2b5f1c2265d28a45ccaac22ade
parent3d7b83900ce23c013c2dd7c120a88b7a864a0ac8 (diff)
downloadceph-b295c649597381bfd5e84450a4d4fb9678bcd62c.tar.gz
rgw: radosgw-admin bucket list --bucket lists bucket objects
Also lists tag for each object. Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r--src/cls/rgw/cls_rgw.cc1
-rw-r--r--src/cls/rgw/cls_rgw_types.cc4
-rw-r--r--src/cls/rgw/cls_rgw_types.h9
-rw-r--r--src/rgw/rgw_admin.cc52
-rw-r--r--src/rgw/rgw_common.h12
-rw-r--r--src/rgw/rgw_json_enc.cc12
-rw-r--r--src/rgw/rgw_op.h6
-rw-r--r--src/rgw/rgw_rados.cc5
-rw-r--r--src/rgw/rgw_rest_s3.cc6
-rw-r--r--src/rgw/rgw_rest_swift.cc3
10 files changed, 84 insertions, 26 deletions
diff --git a/src/cls/rgw/cls_rgw.cc b/src/cls/rgw/cls_rgw.cc
index ad2ab155346..461e40a662a 100644
--- a/src/cls/rgw/cls_rgw.cc
+++ b/src/cls/rgw/cls_rgw.cc
@@ -572,6 +572,7 @@ int rgw_bucket_complete_op(cls_method_context_t hctx, bufferlist *in, bufferlist
entry.meta = meta;
entry.name = op.name;
entry.exists = true;
+ entry.tag = op.tag;
stats.num_entries++;
stats.total_size += meta.size;
stats.total_size_rounded += get_rounded_size(meta.size);
diff --git a/src/cls/rgw/cls_rgw_types.cc b/src/cls/rgw/cls_rgw_types.cc
index 07098be8681..e2b7a07f165 100644
--- a/src/cls/rgw/cls_rgw_types.cc
+++ b/src/cls/rgw/cls_rgw_types.cc
@@ -27,7 +27,6 @@ void rgw_bucket_dir_entry_meta::generate_test_instances(list<rgw_bucket_dir_entr
m->etag = "etag";
m->owner = "owner";
m->owner_display_name = "display name";
- m->tag = "tag";
m->content_type = "content/type";
o.push_back(m);
o.push_back(new rgw_bucket_dir_entry_meta);
@@ -41,7 +40,6 @@ void rgw_bucket_dir_entry_meta::dump(Formatter *f) const
f->dump_string("etag", etag);
f->dump_string("owner", owner);
f->dump_string("owner_display_name", owner_display_name);
- f->dump_string("tag", tag);
f->dump_string("content_type", content_type);
}
@@ -60,6 +58,7 @@ void rgw_bucket_dir_entry::generate_test_instances(list<rgw_bucket_dir_entry*>&
e->locator = "locator";
e->exists = true;
e->meta = *m;
+ e->tag = "tag";
o.push_back(e);
@@ -84,6 +83,7 @@ void rgw_bucket_dir_entry::dump(Formatter *f) const
f->open_object_section("meta");
meta.dump(f);
f->close_section();
+ f->dump_string("tag", tag);
map<string, struct rgw_bucket_pending_info>::const_iterator iter = pending_map.begin();
f->open_array_section("pending_map");
diff --git a/src/cls/rgw/cls_rgw_types.h b/src/cls/rgw/cls_rgw_types.h
index 430b1df662c..3f7abaff857 100644
--- a/src/cls/rgw/cls_rgw_types.h
+++ b/src/cls/rgw/cls_rgw_types.h
@@ -62,7 +62,6 @@ struct rgw_bucket_dir_entry_meta {
string etag;
string owner;
string owner_display_name;
- string tag;
string content_type;
rgw_bucket_dir_entry_meta() :
@@ -143,18 +142,21 @@ void decode_packed_val(T& val, bufferlist::iterator& bl)
::decode(v, bl);
val = v;
}
+ break;
case 2:
{
uint16_t v;
::decode(v, bl);
val = v;
}
+ break;
case 4:
{
uint32_t v;
::decode(v, bl);
val = v;
}
+ break;
case 8:
{
uint64_t v;
@@ -199,9 +201,10 @@ struct rgw_bucket_dir_entry {
struct rgw_bucket_dir_entry_meta meta;
map<string, struct rgw_bucket_pending_info> pending_map;
uint64_t index_ver;
+ string tag;
rgw_bucket_dir_entry() :
- exists(false) {}
+ exists(false), index_ver(0) {}
void encode(bufferlist &bl) const {
ENCODE_START(5, 3, bl);
@@ -212,6 +215,7 @@ struct rgw_bucket_dir_entry {
::encode(pending_map, bl);
::encode(locator, bl);
::encode_packed_val(index_ver, bl);
+ ::encode(tag, bl);
ENCODE_FINISH(bl);
}
void decode(bufferlist::iterator &bl) {
@@ -231,6 +235,7 @@ struct rgw_bucket_dir_entry {
}
if (struct_v >= 5) {
::decode_packed_val(index_ver, bl);
+ ::decode(tag, bl);
}
DECODE_FINISH(bl);
}
diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc
index bc876456b48..e49dfe97729 100644
--- a/src/rgw/rgw_admin.cc
+++ b/src/rgw/rgw_admin.cc
@@ -1161,9 +1161,55 @@ int main(int argc, char **argv)
}
}
- if (opt_cmd == OPT_BUCKETS_LIST || opt_cmd == OPT_BUCKET_STATS) {
- if (opt_cmd == OPT_BUCKET_STATS)
- bucket_op.set_fetch_stats(true);
+ if (opt_cmd == OPT_BUCKETS_LIST) {
+ if (bucket_name.empty()) {
+ RGWBucketAdminOp::info(store, bucket_op, f);
+ } else {
+ int ret = init_bucket(bucket_name, bucket);
+ if (ret < 0) {
+ cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl;
+ return -ret;
+ }
+ formatter->open_array_section("entries");
+ bool truncated;
+ int count = 0;
+ if (max_entries < 0)
+ max_entries = 1000;
+
+ string prefix;
+ string delim;
+ vector<RGWObjEnt> result;
+ map<string, bool> common_prefixes;
+ string ns;
+
+ do {
+ list<rgw_bi_log_entry> entries;
+ ret = store->list_objects(bucket, max_entries - count, prefix, delim,
+ marker, result, common_prefixes, true, ns,
+ &truncated, NULL);
+ if (ret < 0) {
+ cerr << "ERROR: store->list_objects(): " << cpp_strerror(-ret) << std::endl;
+ return -ret;
+ }
+
+ count += result.size();
+
+ for (vector<RGWObjEnt>::iterator iter = result.begin(); iter != result.end(); ++iter) {
+ RGWObjEnt& entry = *iter;
+ encode_json("entry", entry, formatter);
+
+ marker = entry.name;
+ }
+ formatter->flush(cout);
+ } while (truncated && count < max_entries);
+
+ formatter->close_section();
+ formatter->flush(cout);
+ }
+ }
+
+ if (opt_cmd == OPT_BUCKET_STATS) {
+ bucket_op.set_fetch_stats(true);
RGWBucketAdminOp::info(store, bucket_op, f);
}
diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h
index b36055334fb..65401dfc0de 100644
--- a/src/rgw/rgw_common.h
+++ b/src/rgw/rgw_common.h
@@ -661,18 +661,14 @@ struct RGWObjEnt {
std::string owner;
std::string owner_display_name;
uint64_t size;
- time_t mtime;
+ utime_t mtime;
string etag;
string content_type;
+ string tag;
- RGWObjEnt() : size(0), mtime(0) {}
+ RGWObjEnt() : size(0) {}
- void clear() { // not clearing etag
- name="";
- size = 0;
- mtime = 0;
- content_type="";
- }
+ void dump(Formatter *f) const;
};
/** Store basic data on bucket */
diff --git a/src/rgw/rgw_json_enc.cc b/src/rgw/rgw_json_enc.cc
index f299f0e64b0..b376be991b3 100644
--- a/src/rgw/rgw_json_enc.cc
+++ b/src/rgw/rgw_json_enc.cc
@@ -397,6 +397,18 @@ void RGWBucketInfo::dump(Formatter *f) const
encode_json("flags", flags, f);
}
+void RGWObjEnt::dump(Formatter *f) const
+{
+ encode_json("name", name, f);
+ encode_json("owner", owner, f);
+ encode_json("owner_display_name", owner_display_name, f);
+ encode_json("size", size, f);
+ encode_json("mtime", mtime, f);
+ encode_json("etag", etag, f);
+ encode_json("content_type", content_type, f);
+ encode_json("tag", tag, f);
+}
+
void RGWBucketEnt::dump(Formatter *f) const
{
encode_json("bucket", bucket, f);
diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h
index b3e8c86e3f0..658a611915c 100644
--- a/src/rgw/rgw_op.h
+++ b/src/rgw/rgw_op.h
@@ -748,12 +748,6 @@ public:
struct RGWMultipartUploadEntry {
RGWObjEnt obj;
RGWMPObj mp;
-
- void clear() {
- obj.clear();
- string empty;
- mp.init(empty, empty);
- }
};
class RGWListBucketMultiparts : public RGWOp {
diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc
index f2821f25723..fe6b291538c 100644
--- a/src/rgw/rgw_rados.cc
+++ b/src/rgw/rgw_rados.cc
@@ -4130,6 +4130,7 @@ int RGWRados::cls_bucket_list(rgw_bucket& bucket, string start, string prefix,
e.owner = dirent.meta.owner;
e.owner_display_name = dirent.meta.owner_display_name;
e.content_type = dirent.meta.content_type;
+ e.tag = dirent.tag;
/* oh, that shouldn't happen! */
if (e.name.empty()) {
@@ -4306,7 +4307,7 @@ int RGWRados::check_disk_state(librados::IoCtx io_ctx,
ACLOwner owner;
object.size = astate->size;
- object.mtime = astate->mtime;
+ object.mtime = utime_t(astate->mtime, 0);
map<string, bufferlist>::iterator iter = astate->attrset.find(RGW_ATTR_ETAG);
if (iter != astate->attrset.end()) {
@@ -4356,7 +4357,7 @@ int RGWRados::check_disk_state(librados::IoCtx io_ctx,
list_state.meta.etag = etag;
list_state.meta.content_type = content_type;
if (astate->obj_tag.length() > 0)
- list_state.meta.tag = astate->obj_tag.c_str();
+ list_state.tag = astate->obj_tag.c_str();
list_state.meta.owner = owner.get_id();
list_state.meta.owner_display_name = owner.get_display_name();
diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc
index 38fab1bd2c1..2268a2781c8 100644
--- a/src/rgw/rgw_rest_s3.cc
+++ b/src/rgw/rgw_rest_s3.cc
@@ -237,7 +237,8 @@ void RGWListBucket_ObjStore_S3::send_response()
for (iter = objs.begin(); iter != objs.end(); ++iter) {
s->formatter->open_array_section("Contents");
s->formatter->dump_string("Key", iter->name);
- dump_time(s, "LastModified", &iter->mtime);
+ time_t mtime = iter->mtime.sec();
+ dump_time(s, "LastModified", &mtime);
s->formatter->dump_format("ETag", "\"%s\"", iter->etag.c_str());
s->formatter->dump_int("Size", iter->size);
s->formatter->dump_string("StorageClass", "STANDARD");
@@ -1461,7 +1462,8 @@ void RGWListBucketMultiparts_ObjStore_S3::send_response()
dump_owner(s, s->user.user_id, s->user.display_name, "Initiator");
dump_owner(s, s->user.user_id, s->user.display_name);
s->formatter->dump_string("StorageClass", "STANDARD");
- dump_time(s, "Initiated", &iter->obj.mtime);
+ time_t mtime = iter->obj.mtime.sec();
+ dump_time(s, "Initiated", &mtime);
s->formatter->close_section();
}
if (common_prefixes.size() > 0) {
diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc
index f656bfb6821..051060a5a20 100644
--- a/src/rgw/rgw_rest_swift.cc
+++ b/src/rgw/rgw_rest_swift.cc
@@ -173,7 +173,8 @@ void RGWListBucket_ObjStore_SWIFT::send_response()
}
s->formatter->dump_string("content_type", single_content_type);
}
- dump_time(s, "last_modified", &iter->mtime);
+ time_t mtime = iter->mtime.sec();
+ dump_time(s, "last_modified", &mtime);
s->formatter->close_section();
}