Skip to content

Commit

Permalink
mon: check changes to the whole CRUSH map and to tunables against clu…
Browse files Browse the repository at this point in the history
…ster features

When we change the tunables, or set a new CRUSH map, we need to make sure it's
supported by all the monitors and OSDs currently participating in the cluster.

Fixes: ceph#8738

Signed-off-by: Greg Farnum <[email protected]>
  • Loading branch information
gregsfortytwo committed Jul 3, 2014
1 parent 2280c0e commit 54af810
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 0 deletions.
32 changes: 32 additions & 0 deletions src/mon/OSDMonitor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3035,6 +3035,27 @@ int OSDMonitor::check_cluster_features(uint64_t features,
return 0;
}

bool OSDMonitor::validate_crush_against_features(const CrushWrapper *newcrush,
stringstream& ss)
{
OSDMap::Incremental new_pending = pending_inc;
::encode(*newcrush, new_pending.crush);
OSDMap newmap;
newmap.deepish_copy_from(osdmap);
newmap.apply_incremental(new_pending);
uint64_t features = newmap.get_features(CEPH_ENTITY_TYPE_MON, NULL);

stringstream features_ss;

int r = check_cluster_features(features, features_ss);

if (!r)
return true;

ss << "Could not change CRUSH: " << features_ss.str();
return false;
}

bool OSDMonitor::erasure_code_profile_in_use(const map<int64_t, pg_pool_t> &pools,
const string &profile,
ostream &ss)
Expand Down Expand Up @@ -3649,6 +3670,11 @@ bool OSDMonitor::prepare_command_impl(MMonCommand *m,
goto reply;
}

if (!validate_crush_against_features(&crush, ss)) {
err = -EINVAL;
goto reply;
}

// sanity check: test some inputs to make sure this map isn't totally broken
dout(10) << " testing map" << dendl;
stringstream ess;
Expand Down Expand Up @@ -4066,6 +4092,12 @@ bool OSDMonitor::prepare_command_impl(MMonCommand *m,
err = -EINVAL;
goto reply;
}

if (!validate_crush_against_features(&newcrush, ss)) {
err = -EINVAL;
goto reply;
}

pending_inc.crush.clear();
newcrush.encode(pending_inc.crush);
ss << "adjusted tunables profile to " << profile;
Expand Down
9 changes: 9 additions & 0 deletions src/mon/OSDMonitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,15 @@ class OSDMonitor : public PaxosService {

void update_msgr_features();
int check_cluster_features(uint64_t features, stringstream &ss);
/**
* check if the cluster supports the features required by the
* given crush map. Outputs the daemons which don't support it
* to the stringstream.
*
* @returns true if the map is passable, false otherwise
*/
bool validate_crush_against_features(const CrushWrapper *newcrush,
stringstream &ss);

void share_map_with_random_osd();

Expand Down

0 comments on commit 54af810

Please sign in to comment.