cls_method_handle_t h_rgw_lc_list_entries;
-#define ROUND_BLOCK_SIZE 4096
-
-
#define BI_PREFIX_CHAR 0x80
#define BI_BUCKET_OBJS_INDEX 0
/* this must be the last index */
"9999_",};
-static uint64_t get_rounded_size(uint64_t size)
-{
- return (size + ROUND_BLOCK_SIZE - 1) & ~(ROUND_BLOCK_SIZE - 1);
-}
-
static bool bi_is_objs_index(const string& s) {
return ((unsigned char)s[0] != BI_PREFIX_CHAR);
}
struct rgw_bucket_category_stats& stats = calc_header->stats[entry.meta.category];
stats.num_entries++;
stats.total_size += entry.meta.accounted_size;
- stats.total_size_rounded += get_rounded_size(entry.meta.accounted_size);
+ stats.total_size_rounded += cls_rgw_get_rounded_size(entry.meta.accounted_size);
start_obj = kiter->first;
}
struct rgw_bucket_category_stats& stats = header.stats[entry.meta.category];
stats.num_entries--;
stats.total_size -= entry.meta.accounted_size;
- stats.total_size_rounded -= get_rounded_size(entry.meta.accounted_size);
+ stats.total_size_rounded -= cls_rgw_get_rounded_size(entry.meta.accounted_size);
}
static void log_entry(const char *func, const char *str, struct rgw_bucket_dir_entry *entry)
entry.tag = op.tag;
stats.num_entries++;
stats.total_size += meta.accounted_size;
- stats.total_size_rounded += get_rounded_size(meta.accounted_size);
+ stats.total_size_rounded += cls_rgw_get_rounded_size(meta.accounted_size);
bufferlist new_key_bl;
::encode(entry, new_key_bl);
int ret = cls_cxx_map_set_val(hctx, idx, &new_key_bl);
CLS_LOG(10, "total_entries: %" PRId64 " -> %" PRId64 "\n", old_stats.num_entries, old_stats.num_entries - 1);
old_stats.num_entries--;
old_stats.total_size -= cur_disk.meta.accounted_size;
- old_stats.total_size_rounded -= get_rounded_size(cur_disk.meta.accounted_size);
+ old_stats.total_size_rounded -= cls_rgw_get_rounded_size(cur_disk.meta.accounted_size);
header_changed = true;
}
struct rgw_bucket_category_stats& stats =
cur_change.key.name.c_str(), cur_change.key.instance.c_str(), stats.num_entries, stats.num_entries + 1);
stats.num_entries++;
stats.total_size += cur_change.meta.accounted_size;
- stats.total_size_rounded += get_rounded_size(cur_change.meta.accounted_size);
+ stats.total_size_rounded += cls_rgw_get_rounded_size(cur_change.meta.accounted_size);
header_changed = true;
cur_change.index_ver = header.ver;
bufferlist cur_state_bl;
};
void cls_rgw_bucket_update_stats(librados::ObjectWriteOperation& o, bool absolute,
- map<uint8_t, rgw_bucket_category_stats>& stats);
+ const map<uint8_t, rgw_bucket_category_stats>& stats);
void cls_rgw_bucket_prepare_op(librados::ObjectWriteOperation& o, RGWModifyOp op, string& tag,
const cls_rgw_obj_key& key, const string& locator, bool log_op,
dump_bi_entry(data, type, f);
}
-void rgw_cls_bi_entry::get_key(cls_rgw_obj_key *key)
+bool rgw_cls_bi_entry::get_info(cls_rgw_obj_key *key, uint8_t *category, rgw_bucket_category_stats *accounted_stats)
{
+ bool account = false;
bufferlist::iterator iter = data.begin();
switch (type) {
case PlainIdx:
rgw_bucket_dir_entry entry;
::decode(entry, iter);
*key = entry.key;
+ *category = entry.meta.category;
+ accounted_stats->num_entries++;
+ accounted_stats->total_size += entry.meta.accounted_size;
+ accounted_stats->total_size_rounded += cls_rgw_get_rounded_size(entry.meta.accounted_size);
+ account = true;
}
break;
case OLHIdx:
default:
break;
}
+
+ return account;
}
void rgw_bucket_olh_entry::dump(Formatter *f) const
CLS_RGW_CHECK_TIME_MTIME_GE = 4,
};
+#define ROUND_BLOCK_SIZE 4096
+
+static inline uint64_t cls_rgw_get_rounded_size(uint64_t size)
+{
+ return (size + ROUND_BLOCK_SIZE - 1) & ~(ROUND_BLOCK_SIZE - 1);
+}
+
struct rgw_bucket_pending_info {
RGWPendingState state;
ceph::real_time timestamp;
OLHIdx = 3,
};
+struct rgw_bucket_category_stats;
+
struct rgw_cls_bi_entry {
BIIndexType type;
string idx;
void dump(Formatter *f) const;
void decode_json(JSONObj *obj, cls_rgw_obj_key *effective_key = NULL);
- void get_key(cls_rgw_obj_key *key);
+ bool get_info(cls_rgw_obj_key *key, uint8_t *category, rgw_bucket_category_stats *accounted_stats);
};
WRITE_CLASS_ENCODER(rgw_cls_bi_entry)
#include "common/errno.h"
#include "common/safe_io.h"
+#include "cls/rgw/cls_rgw_client.h"
+
#include "global/global_init.h"
#include "include/utime.h"
int num_shard;
RGWRados::BucketShard bs;
vector<rgw_cls_bi_entry> entries;
+ map<uint8_t, rgw_bucket_category_stats> stats;
public:
BucketReshardShard(RGWRados *_store, RGWBucketInfo& _bucket_info, int _num_shard) : store(_store), bucket_info(_bucket_info), bs(store) {
bs.init(bucket_info.bucket, num_shard);
}
- int add_entry(rgw_cls_bi_entry& entry) {
+ int add_entry(rgw_cls_bi_entry& entry, bool account, uint8_t category,
+ rgw_bucket_category_stats entry_stats) {
entries.push_back(entry);
+ if (account) {
+ rgw_bucket_category_stats& target = stats[category];
+ target.num_entries += entry_stats.num_entries;
+ target.total_size += entry_stats.total_size;
+ target.total_size_rounded += entry_stats.total_size_rounded;
+ }
if (entries.size() >= RESHARD_SHARD_WINDOW) {
int ret = flush();
if (ret < 0) {
for (auto& entry : entries) {
store->bi_put(op, bs, entry);
}
+ cls_rgw_bucket_update_stats(op, false, stats);
int ret = bs.index_ctx.operate(bs.bucket_obj, &op);
if (ret < 0) {
std::cerr << "ERROR: failed to store entries in target bucket shard (bs=" << bs.bucket << "/" << bs.shard_id << ") error=" << cpp_strerror(-ret) << std::endl;
return ret;
}
entries.clear();
+ stats.clear();
return 0;
}
};
int target_shard_id;
cls_rgw_obj_key cls_key;
- entry.get_key(&cls_key);
+ uint8_t category;
+ rgw_bucket_category_stats stats;
+ bool account = entry.get_info(&cls_key, &category, &stats);
rgw_obj_key key(cls_key);
rgw_obj obj(new_bucket_info.bucket, key);
int ret = store->get_target_shard_id(new_bucket_info, obj.get_hash_object(), &target_shard_id);
int shard_index = (target_shard_id > 0 ? target_shard_id : 0);
- ret = target_shards[shard_index]->add_entry(entry);
+ ret = target_shards[shard_index]->add_entry(entry, account, category, stats);
if (ret < 0) {
cerr << "ERROR: target_shards.add_entry(" << key << ") returned error: " << cpp_strerror(-ret) << std::endl;
return ret;