* Ceph string constants
*/
#include "include/types.h"
+#include "include/ceph_features.h"
const char *ceph_entity_type_name(int type)
{
return "nearfull";
case CEPH_OSD_BACKFILLFULL:
return "backfillfull";
+ case CEPH_OSD_DESTROYED:
+ return "destroyed";
+ case CEPH_OSD_NOUP:
+ return "noup";
+ case CEPH_OSD_NODOWN:
+ return "nodown";
+ case CEPH_OSD_NOIN:
+ return "noin";
+ case CEPH_OSD_NOOUT:
+ return "noout";
default:
return "???";
- }
+ }
+}
+
+const char *ceph_release_name(int r)
+{
+ switch (r) {
+ case CEPH_RELEASE_ARGONAUT:
+ return "argonaut";
+ case CEPH_RELEASE_BOBTAIL:
+ return "bobtail";
+ case CEPH_RELEASE_CUTTLEFISH:
+ return "cuttlefish";
+ case CEPH_RELEASE_DUMPLING:
+ return "dumpling";
+ case CEPH_RELEASE_EMPEROR:
+ return "emperor";
+ case CEPH_RELEASE_FIREFLY:
+ return "firefly";
+ case CEPH_RELEASE_GIANT:
+ return "giant";
+ case CEPH_RELEASE_HAMMER:
+ return "hammer";
+ case CEPH_RELEASE_INFERNALIS:
+ return "infernalis";
+ case CEPH_RELEASE_JEWEL:
+ return "jewel";
+ case CEPH_RELEASE_KRAKEN:
+ return "kraken";
+ case CEPH_RELEASE_LUMINOUS:
+ return "luminous";
+ case CEPH_RELEASE_MIMIC:
+ return "mimic";
+ default:
+ return "unknown";
+ }
+}
+
+int ceph_release_from_name(const char *s)
+{
+ if (!s) {
+ return -1;
+ }
+ if (strcmp(s, "mimic") == 0) {
+ return CEPH_RELEASE_MIMIC;
+ }
+ if (strcmp(s, "luminous") == 0) {
+ return CEPH_RELEASE_LUMINOUS;
+ }
+ if (strcmp(s, "kraken") == 0) {
+ return CEPH_RELEASE_KRAKEN;
+ }
+ if (strcmp(s, "jewel") == 0) {
+ return CEPH_RELEASE_JEWEL;
+ }
+ if (strcmp(s, "infernalis") == 0) {
+ return CEPH_RELEASE_INFERNALIS;
+ }
+ if (strcmp(s, "hammer") == 0) {
+ return CEPH_RELEASE_HAMMER;
+ }
+ if (strcmp(s, "giant") == 0) {
+ return CEPH_RELEASE_GIANT;
+ }
+ if (strcmp(s, "firefly") == 0) {
+ return CEPH_RELEASE_FIREFLY;
+ }
+ if (strcmp(s, "emperor") == 0) {
+ return CEPH_RELEASE_EMPEROR;
+ }
+ if (strcmp(s, "dumpling") == 0) {
+ return CEPH_RELEASE_DUMPLING;
+ }
+ if (strcmp(s, "cuttlefish") == 0) {
+ return CEPH_RELEASE_CUTTLEFISH;
+ }
+ if (strcmp(s, "bobtail") == 0) {
+ return CEPH_RELEASE_BOBTAIL;
+ }
+ if (strcmp(s, "argonaut") == 0) {
+ return CEPH_RELEASE_ARGONAUT;
+ }
+ return -1;
+}
+
+uint64_t ceph_release_features(int r)
+{
+ uint64_t req = 0;
+
+ req |= CEPH_FEATURE_CRUSH_TUNABLES;
+ if (r <= CEPH_RELEASE_CUTTLEFISH)
+ return req;
+
+ req |= CEPH_FEATURE_CRUSH_TUNABLES2 |
+ CEPH_FEATURE_OSDHASHPSPOOL;
+ if (r <= CEPH_RELEASE_EMPEROR)
+ return req;
+
+ req |= CEPH_FEATURE_CRUSH_TUNABLES3 |
+ CEPH_FEATURE_OSD_PRIMARY_AFFINITY |
+ CEPH_FEATURE_OSD_CACHEPOOL;
+ if (r <= CEPH_RELEASE_GIANT)
+ return req;
+
+ req |= CEPH_FEATURE_CRUSH_V4;
+ if (r <= CEPH_RELEASE_INFERNALIS)
+ return req;
+
+ req |= CEPH_FEATURE_CRUSH_TUNABLES5;
+ if (r <= CEPH_RELEASE_JEWEL)
+ return req;
+
+ req |= CEPH_FEATURE_MSG_ADDR2;
+ if (r <= CEPH_RELEASE_KRAKEN)
+ return req;
+
+ req |= CEPH_FEATUREMASK_CRUSH_CHOOSE_ARGS; // and overlaps
+ if (r <= CEPH_RELEASE_LUMINOUS)
+ return req;
+
+ return req;
+}
+
+/* return oldest/first release that supports these features */
+int ceph_release_from_features(uint64_t features)
+{
+ int r = 1;
+ while (true) {
+ uint64_t need = ceph_release_features(r);
+ if ((need & features) != need ||
+ r == CEPH_RELEASE_MAX) {
+ r--;
+ need = ceph_release_features(r);
+ /* we want the first release that looks like this */
+ while (r > 1 && ceph_release_features(r - 1) == need) {
+ r--;
+ }
+ break;
+ }
+ ++r;
+ }
+ return r;
}
const char *ceph_osd_watch_op_name(int o)