]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/common/ceph_strings.cc
update sources to v12.1.0
[ceph.git] / ceph / src / common / ceph_strings.cc
index 1fec2f7b0a1e28f1e16aaff3e6c5bf06e4225a5f..ac1e8fd6473ec40b12c70a3e77e6dcb816ade16e 100644 (file)
@@ -2,6 +2,7 @@
  * Ceph string constants
  */
 #include "include/types.h"
+#include "include/ceph_features.h"
 
 const char *ceph_entity_type_name(int type)
 {
@@ -44,9 +45,159 @@ const char *ceph_osd_state_name(int s)
                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)