diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-04-15 22:49:26 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-04-15 22:49:26 -0700 |
commit | dcfbf691ed84ad87bb5a5bb1f744c0151f6bd9f5 (patch) | |
tree | 76f2de909999b5378461f51d5ea9b4a494d75a9a | |
parent | 564626c80a6048cb24103092f6f4f8d5ccdf8f3c (diff) | |
download | ceph-dcfbf691ed84ad87bb5a5bb1f744c0151f6bd9f5.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.cc | 1 | ||||
-rw-r--r-- | src/cls/rgw/cls_rgw_types.cc | 4 | ||||
-rw-r--r-- | src/cls/rgw/cls_rgw_types.h | 9 | ||||
-rw-r--r-- | src/rgw/rgw_admin.cc | 52 | ||||
-rw-r--r-- | src/rgw/rgw_common.h | 12 | ||||
-rw-r--r-- | src/rgw/rgw_json_enc.cc | 12 | ||||
-rw-r--r-- | src/rgw/rgw_op.h | 6 | ||||
-rw-r--r-- | src/rgw/rgw_rados.cc | 5 | ||||
-rw-r--r-- | src/rgw/rgw_rest_s3.cc | 6 | ||||
-rw-r--r-- | src/rgw/rgw_rest_swift.cc | 3 |
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 13efc0e5b28..026185e0804 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -658,18 +658,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 dab1404c6aa..44d49b2cc01 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -736,12 +736,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 cb3269e20f9..62c29430295 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -4121,6 +4121,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()) { @@ -4297,7 +4298,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()) { @@ -4347,7 +4348,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 b46ff814663..6bb92b4a6cf 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -221,7 +221,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"); @@ -1445,7 +1446,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 576eb99cec6..89af7d451df 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -150,7 +150,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(); } |