By setting the HTTP-Rgwx-Shard-Id header to the shard id.
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
formatter->open_array_section("objects");
while (is_truncated) {
map<string, RGWObjEnt> result;
- int r = store->cls_bucket_list(bucket, marker, prefix, 1000, true,
+ int r = store->cls_bucket_list(bucket, RGW_NO_SHARD, marker, prefix, 1000, true,
result, &is_truncated, &marker,
bucket_object_check_filter);
while (is_truncated) {
map<string, RGWObjEnt> result;
- int r = store->cls_bucket_list(bucket, marker, prefix, 1000, true,
+ int r = store->cls_bucket_list(bucket, RGW_NO_SHARD, marker, prefix, 1000, true,
result, &is_truncated, &marker,
bucket_object_check_filter);
if (r == -ENOENT) {
}
RGWRados::Bucket target(store, s->bucket);
+ if (shard_id >= 0) {
+ target.set_shard_id(shard_id);
+ }
RGWRados::Bucket::List list_op(&target);
list_op.params.prefix = prefix;
int default_max;
bool is_truncated;
+ int shard_id;
+
int parse_max_keys();
public:
RGWListBucket() : list_versions(false), max(0),
- default_max(0), is_truncated(false) {}
+ default_max(0), is_truncated(false), shard_id(-1) {}
int verify_permission();
void pre_exec();
void execute();
RGWRados *store = target->get_store();
CephContext *cct = store->ctx();
rgw_bucket& bucket = target->get_bucket();
+ int shard_id = target->get_shard_id();
int count = 0;
bool truncated = true;
ldout(cct, 20) << "setting cur_marker=" << cur_marker.name << "[" << cur_marker.instance << "]" << dendl;
}
std::map<string, RGWObjEnt> ent_map;
- int r = store->cls_bucket_list(bucket, cur_marker, cur_prefix, max + 1 - count, params.list_versions, ent_map,
+ int r = store->cls_bucket_list(bucket, shard_id, cur_marker, cur_prefix, max + 1 - count, params.list_versions, ent_map,
&truncated, &cur_marker);
if (r < 0)
return r;
do {
#define NUM_ENTRIES 1000
- r = cls_bucket_list(bucket, marker, prefix, NUM_ENTRIES, true, ent_map,
+ r = cls_bucket_list(bucket, RGW_NO_SHARD, marker, prefix, NUM_ENTRIES, true, ent_map,
&is_truncated, &marker);
if (r < 0)
return r;
return CLSRGWIssueSetTagTimeout(index_ctx, bucket_objs, cct->_conf->rgw_bucket_index_max_aio, timeout)();
}
-int RGWRados::cls_bucket_list(rgw_bucket& bucket, rgw_obj_key& start, const string& prefix,
+int RGWRados::cls_bucket_list(rgw_bucket& bucket, int shard_id, rgw_obj_key& start, const string& prefix,
uint32_t num_entries, bool list_versions, map<string, RGWObjEnt>& m,
bool *is_truncated, rgw_obj_key *last_entry,
bool (*force_check_filter)(const string& name))
// value - list result for the corresponding oid (shard), it is filled by the AIO callback
map<int, string> oids;
map<int, struct rgw_cls_list_ret> list_results;
- int r = open_bucket_index(bucket, index_ctx, oids);
+ int r = open_bucket_index(bucket, index_ctx, oids, shard_id);
if (r < 0)
return r;
class Bucket {
RGWRados *store;
rgw_bucket& bucket;
+ int shard_id;
public:
- Bucket(RGWRados *_store, rgw_bucket& _bucket) : store(_store), bucket(_bucket) {}
+ Bucket(RGWRados *_store, rgw_bucket& _bucket) : store(_store), bucket(_bucket), shard_id(RGW_NO_SHARD) {}
RGWRados *get_store() { return store; }
rgw_bucket& get_bucket() { return bucket; }
+ int get_shard_id() { return shard_id; }
+ void set_shard_id(int id) {
+ shard_id = id;
+ }
+
class UpdateIndex {
RGWRados::Bucket *target;
string optag;
list<rgw_obj_key> *remove_objs, uint16_t bilog_flags);
int cls_obj_complete_cancel(BucketShard& bs, string& tag, rgw_obj& obj, uint16_t bilog_flags);
int cls_obj_set_bucket_tag_timeout(rgw_bucket& bucket, uint64_t timeout);
- int cls_bucket_list(rgw_bucket& bucket, rgw_obj_key& start, const string& prefix,
+ int cls_bucket_list(rgw_bucket& bucket, int shard_id, rgw_obj_key& start, const string& prefix,
uint32_t num_entries, bool list_versions, map<string, RGWObjEnt>& m,
bool *is_truncated, rgw_obj_key *last_entry,
bool (*force_check_filter)(const string& name) = NULL);
}
delimiter = s->info.args.get("delimiter");
encoding_type = s->info.args.get("encoding-type");
+ if (s->system_request) {
+ const char *shard_id_str = s->info.env->get("HTTP_RGWX_SHARD_ID");
+ if (shard_id_str) {
+ string err;
+ shard_id = strict_strtol(shard_id_str, 10, &err);
+ if (!err.empty()) {
+ ldout(s->cct, 5) << "bad shard id specified: " << shard_id_str << dendl;
+ return -EINVAL;
+ }
+ }
+ }
return 0;
}