item_id[name] = id;
item_weight[id] = bucketweight;
- crush.add_bucket(id, alg, hash, type, size, &items[0], &weights[0]);
- crush.set_item_name(id, name.c_str());
- return 0;
+ assert(id != 0);
+ int r = crush.add_bucket(id, alg, hash, type, size, &items[0], &weights[0], NULL);
+ if (r < 0) {
+ if (r == -EEXIST)
+ err << "Duplicate bucket id " << id << std::endl;
+ else
+ err << "add_bucket failed " << strerror(-r) << std::endl;
+ return r;
+ }
+ r = crush.set_item_name(id, name.c_str());
+ return r;
}
int CrushCompiler::parse_rule(iter_t const& i)
if (!name_exists(q->second)) {
ldout(cct, 5) << "insert_item creating bucket " << q->second << dendl;
- int empty = 0;
- cur = add_bucket(0, CRUSH_BUCKET_STRAW, CRUSH_HASH_DEFAULT, p->first, 1, &cur, &empty);
- set_item_name(cur, q->second);
+ int empty = 0, newid;
+ int r = add_bucket(0, CRUSH_BUCKET_STRAW, CRUSH_HASH_DEFAULT, p->first, 1, &cur, &empty, &newid);
+ if (r < 0) {
+ char buf[128];
+ ldout(cct, 1) << "add_bucket failure error: " << strerror_r(-r, buf, sizeof(buf)) << dendl;
+ return r;
+ }
+ set_item_name(newid, q->second);
+ cur = newid;
continue;
}
/* modifiers */
int add_bucket(int bucketno, int alg, int hash, int type, int size,
- int *items, int *weights) {
+ int *items, int *weights, int *idout) {
crush_bucket *b = crush_make_bucket(alg, hash, type, size, items, weights);
assert(b);
- return crush_add_bucket(crush, bucketno, b);
+ return crush_add_bucket(crush, bucketno, b, idout);
}
void finalize() {
int crush_add_bucket(struct crush_map *map,
int id,
- struct crush_bucket *bucket)
+ struct crush_bucket *bucket,
+ int *idout)
{
int pos;
memset(map->buckets + oldsize, 0, (map->max_buckets-oldsize) * sizeof(map->buckets[0]));
}
- assert(map->buckets[pos] == 0);
+ if (map->buckets[pos] != 0) {
+ return -EEXIST;
+ }
/* add it */
bucket->id = id;
map->buckets[pos] = bucket;
- return id;
+ if (idout) *idout = id;
+ return 0;
}
int crush_remove_bucket(struct crush_map *map, struct crush_bucket *bucket)
extern int crush_get_next_bucket_id(struct crush_map *map);
extern int crush_add_bucket(struct crush_map *map,
int bucketno,
- struct crush_bucket *bucket);
+ struct crush_bucket *bucket, int *idout);
struct crush_bucket *crush_make_bucket(int alg, int hash, int type, int size, int *items, int *weights);
extern int crush_bucket_add_item(struct crush_bucket *bucket, int item, int weight);
extern int crush_bucket_adjust_item_weight(struct crush_bucket *bucket, int item, int weight);
err = -EINVAL;
goto reply;
}
- int bucketno = newcrush.add_bucket(0, CRUSH_BUCKET_STRAW,
+ int bucketno;
+ err = newcrush.add_bucket(0, CRUSH_BUCKET_STRAW,
CRUSH_HASH_DEFAULT, type, 0, NULL,
- NULL);
+ NULL, &bucketno);
+ if (err < 0) {
+ char buf[128];
+ ss << "add_bucket error: '" << strerror_r(-err, buf, sizeof(buf)) << "'";
+ goto reply;
+ }
err = newcrush.set_item_name(bucketno, name);
if (err < 0) {
ss << "error setting bucket name to '" << name << "'";
crush.set_type_name(6, "root");
// root
- int rootid = crush.add_bucket(0, CRUSH_BUCKET_STRAW, CRUSH_HASH_DEFAULT, 6 /* pool */, 0, NULL, NULL);
+ int rootid;
+ int r = crush.add_bucket(0, CRUSH_BUCKET_STRAW, CRUSH_HASH_DEFAULT, 6 /* pool */, 0, NULL, NULL, &rootid);
+ assert(r == 0);
crush.set_item_name(rootid, "default");
for (int o=0; o<nosd; o++) {
set<string> hosts, racks;
// root
- int rootid = crush.add_bucket(0, CRUSH_BUCKET_STRAW, CRUSH_HASH_DEFAULT, 6 /* pool */, 0, NULL, NULL);
+ int rootid;
+ int r = crush.add_bucket(0, CRUSH_BUCKET_STRAW, CRUSH_HASH_DEFAULT, 6 /* pool */, 0, NULL, NULL, &rootid);
+ assert(r == 0);
crush.set_item_name(rootid, "default");
// add osds
crush_bucket *b = crush_make_bucket(buckettype, CRUSH_HASH_DEFAULT, type, j, items, weights);
assert(b);
- int id = crush_add_bucket(crush.crush, 0, b);
+ int id;
+ int r = crush_add_bucket(crush.crush, 0, b, &id);
+ if (r < 0) {
+ dout(0) << "Couldn't add root bucket: " << strerror(-r) << dendl;
+ }
rootid = id;
char format[20];