mirror of
https://github.com/ceph/ceph
synced 2025-01-02 17:12:31 +00:00
crush: fix potential weight overflow
E.g.: ./bin/ceph osd crush reweight osd.0 32768 ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY -4 32770.00000 root default~hdd -3 - host gitbuilder-ceph-rpm-centos7-amd64-basic~hdd 0 - osd.0 up 1.00000 1.00000 1 1.00000 osd.1 up 1.00000 1.00000 2 1.00000 osd.2 up 1.00000 1.00000 -1 32770.00000 root default -2 - host gitbuilder-ceph-rpm-centos7-amd64-basic 0 - osd.0 up 1.00000 1.00000 1 1.00000 osd.1 up 1.00000 1.00000 2 1.00000 osd.2 up 1.00000 1.00000 Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
This commit is contained in:
parent
b08b485ce8
commit
7d07356383
@ -104,6 +104,7 @@ o3=`ceph osd create`
|
||||
ceph osd crush add $o3 123 root=default
|
||||
ceph osd tree | grep osd.$o3 | grep 123
|
||||
ceph osd crush reweight osd.$o3 113
|
||||
expect_false ceph osd crush reweight osd.$o3 123456
|
||||
ceph osd tree | grep osd.$o3 | grep 113
|
||||
ceph osd crush rm osd.$o3
|
||||
ceph osd rm osd.$o3
|
||||
@ -116,6 +117,7 @@ ceph osd crush add $o5 123 root=default host=foobaz
|
||||
ceph osd tree | grep osd.$o4 | grep 123
|
||||
ceph osd tree | grep osd.$o5 | grep 123
|
||||
ceph osd crush reweight-subtree foobaz 155
|
||||
expect_false ceph osd crush reweight-subtree foobaz 123456
|
||||
ceph osd tree | grep osd.$o4 | grep 155
|
||||
ceph osd tree | grep osd.$o5 | grep 155
|
||||
ceph osd crush rm osd.$o4
|
||||
|
@ -807,6 +807,11 @@ int CrushWrapper::insert_item(CephContext *cct, int item, float weight, string n
|
||||
if (!is_valid_crush_loc(cct, loc))
|
||||
return -EINVAL;
|
||||
|
||||
int r = validate_weightf(weight);
|
||||
if (r < 0) {
|
||||
return r;
|
||||
}
|
||||
|
||||
if (name_exists(name)) {
|
||||
if (get_item_id(name) != item) {
|
||||
ldout(cct, 10) << "device name '" << name << "' already exists as id "
|
||||
@ -1021,6 +1026,11 @@ int CrushWrapper::update_item(CephContext *cct, int item, float weight, string n
|
||||
if (!is_valid_crush_loc(cct, loc))
|
||||
return -EINVAL;
|
||||
|
||||
ret = validate_weightf(weight);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
// compare quantized (fixed-point integer) weights!
|
||||
int iweight = (int)(weight * (float)0x10000);
|
||||
int old_iweight;
|
||||
|
@ -849,18 +849,37 @@ public:
|
||||
return (float)get_item_weight_in_loc(id, loc) / (float)0x10000;
|
||||
}
|
||||
|
||||
int validate_weightf(float weight) {
|
||||
uint64_t iweight = weight * 0x10000;
|
||||
if (iweight > std::numeric_limits<int>::max()) {
|
||||
return -EOVERFLOW;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int adjust_item_weight(CephContext *cct, int id, int weight);
|
||||
int adjust_item_weightf(CephContext *cct, int id, float weight) {
|
||||
int r = validate_weightf(weight);
|
||||
if (r < 0) {
|
||||
return r;
|
||||
}
|
||||
return adjust_item_weight(cct, id, (int)(weight * (float)0x10000));
|
||||
}
|
||||
int adjust_item_weight_in_loc(CephContext *cct, int id, int weight, const map<string,string>& loc);
|
||||
int adjust_item_weightf_in_loc(CephContext *cct, int id, float weight, const map<string,string>& loc) {
|
||||
int r = validate_weightf(weight);
|
||||
if (r < 0) {
|
||||
return r;
|
||||
}
|
||||
return adjust_item_weight_in_loc(cct, id, (int)(weight * (float)0x10000), loc);
|
||||
}
|
||||
void reweight(CephContext *cct);
|
||||
|
||||
int adjust_subtree_weight(CephContext *cct, int id, int weight);
|
||||
int adjust_subtree_weightf(CephContext *cct, int id, float weight) {
|
||||
int r = validate_weightf(weight);
|
||||
if (r < 0) {
|
||||
return r;
|
||||
}
|
||||
return adjust_subtree_weight(cct, id, (int)(weight * (float)0x10000));
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user