]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph_fs: Split CEPH_FEATURE_{SUPPORTED, REQUIRED} flags into service-based flags
authorGreg Farnum <gregf@hq.newdream.net>
Fri, 26 Feb 2010 18:57:37 +0000 (10:57 -0800)
committerGreg Farnum <gregf@hq.newdream.net>
Tue, 2 Mar 2010 18:02:03 +0000 (10:02 -0800)
msgr: New get_{required,supported}_bits methods which calculate required bits
based on type of self and of peer. Replace all hard-coded flag uses with these.

src/include/ceph_fs.h
src/msg/SimpleMessenger.cc
src/msg/SimpleMessenger.h

index 291c405ce0ba71526c2279f30118a15db17f5f38..18d57ffd60f0c6a49c074511773bf278f3ef0d12 100644 (file)
  * feature bits
  */
 #define CEPH_FEATURE_UID        1
-#define CEPH_FEATURE_SUPPORTED  CEPH_FEATURE_UID
-#define CEPH_FEATURE_REQUIRED   CEPH_FEATURE_UID
+
+#define CEPH_FEATURE_SUPPORTED_MON  CEPH_FEATURE_UID
+#define CEPH_FEATURE_REQUIRED_MON   CEPH_FEATURE_UID
+#define CEPH_FEATURE_SUPPORTED_MDS  CEPH_FEATURE_UID
+#define CEPH_FEATURE_REQUIRED_MDS   CEPH_FEATURE_UID
+#define CEPH_FEATURE_SUPPORTED_OSD  CEPH_FEATURE_UID
+#define CEPH_FEATURE_REQUIRED_OSD   CEPH_FEATURE_UID
+#define CEPH_FEATURE_SUPPORTED_CLIENT 0
+#define CEPH_FEATURE_REQUIRED_CLIENT 0
 
 
 /*
index 148eff82ac7809710f03cb68b870f69dcb3d58ec..32be1979b845b7356a7d385e83d15c761df48f0e 100644 (file)
@@ -505,7 +505,71 @@ static int get_proto_version(int my_type, int peer_type, bool connect)
   return 0;
 }
 
+int SimpleMessenger::Pipe::get_required_bits()
+{
+  int my_reqs = 0;
+  int peer_reqs = 0;
+  switch(messenger->my_type) {
+  case CEPH_ENTITY_TYPE_OSD: my_reqs = CEPH_FEATURE_REQUIRED_OSD;
+    break;
+  case CEPH_ENTITY_TYPE_MDS: my_reqs = CEPH_FEATURE_REQUIRED_MDS;
+    break;
+  case CEPH_ENTITY_TYPE_MON: my_reqs = CEPH_FEATURE_REQUIRED_MON;
+    break;
+  case CEPH_ENTITY_TYPE_CLIENT: my_reqs = CEPH_FEATURE_REQUIRED_CLIENT;
+    break;
+  default: dout(0) << "I have no/unexpected type: "
+                  << messenger->my_type << dendl;
+    //die somehow?
+  }
+  switch(peer_type) {
+  case CEPH_ENTITY_TYPE_OSD: peer_reqs = CEPH_FEATURE_REQUIRED_OSD;
+    break;
+  case CEPH_ENTITY_TYPE_MDS: peer_reqs = CEPH_FEATURE_REQUIRED_MDS;
+    break;
+  case CEPH_ENTITY_TYPE_MON: peer_reqs = CEPH_FEATURE_REQUIRED_MON;
+    break;
+  case CEPH_ENTITY_TYPE_CLIENT: peer_reqs = CEPH_FEATURE_REQUIRED_CLIENT;
+    break;
+  default: dout(0) << "Peer has no/unexpected type: "
+                  <<peer_type << dendl;
+    //die somewhow?
+  }
+  return my_reqs & peer_reqs; // only need those required by both
+}
 
+int SimpleMessenger::Pipe::get_supported_bits()
+{
+  int my_sup = 0;
+  int peer_sup = 0;
+  switch(messenger->my_type) {
+  case CEPH_ENTITY_TYPE_OSD: my_sup = CEPH_FEATURE_SUPPORTED_OSD;
+    break;
+  case CEPH_ENTITY_TYPE_MDS: my_sup = CEPH_FEATURE_SUPPORTED_MDS;
+    break;
+  case CEPH_ENTITY_TYPE_MON: my_sup = CEPH_FEATURE_SUPPORTED_MON;
+    break;
+  case CEPH_ENTITY_TYPE_CLIENT: my_sup = CEPH_FEATURE_SUPPORTED_CLIENT;
+    break;
+  default: dout(0) << "I have no/unexpected type: " 
+                  << messenger->my_type << dendl;
+    //die somehow?
+  }
+  switch(peer_type) {
+  case CEPH_ENTITY_TYPE_OSD: peer_sup = CEPH_FEATURE_SUPPORTED_OSD;
+    break;
+  case CEPH_ENTITY_TYPE_MDS: peer_sup = CEPH_FEATURE_SUPPORTED_MDS;
+    break;
+  case CEPH_ENTITY_TYPE_MON: peer_sup = CEPH_FEATURE_SUPPORTED_MON;
+    break;
+  case CEPH_ENTITY_TYPE_CLIENT: peer_sup = CEPH_FEATURE_SUPPORTED_CLIENT;
+    break;
+  default: dout(0) << "Peer has no/unexpected type: "
+                  << peer_type << dendl;
+    //die somewhow?
+  }
+  return my_sup & peer_sup; // only need those required by both
+}
 int SimpleMessenger::Pipe::accept()
 {
   dout(10) << "accept" << dendl;
@@ -642,7 +706,7 @@ int SimpleMessenger::Pipe::accept()
       goto reply;
     }
 
-    feat_missing = CEPH_FEATURE_REQUIRED & ~(__u64)connect.features;
+    feat_missing = get_required_bits() & ~(__u64)connect.features;
     if (feat_missing) {
       dout(1) << "peer missing required features " << std::hex << feat_missing << std::dec << dendl;
       reply.tag = CEPH_MSGR_TAG_FEATURES;
@@ -774,7 +838,7 @@ int SimpleMessenger::Pipe::accept()
     assert(0);    
 
   reply:
-    reply.features = ((__u64)connect.features & CEPH_FEATURE_SUPPORTED) | CEPH_FEATURE_REQUIRED;
+    reply.features = ((__u64)connect.features & get_supported_bits()) | get_required_bits();
     reply.authorizer_len = authorizer_reply.length();
     rc = tcp_write(sd, (char*)&reply, sizeof(reply));
     if (rc < 0)
@@ -813,7 +877,7 @@ int SimpleMessenger::Pipe::accept()
 
   // send READY reply
   reply.tag = CEPH_MSGR_TAG_READY;
-  reply.features = CEPH_FEATURE_SUPPORTED;
+  reply.features = get_supported_bits();
   reply.global_seq = messenger->get_global_seq();
   reply.connect_seq = connect_seq;
   reply.flags = 0;
@@ -992,7 +1056,7 @@ int SimpleMessenger::Pipe::connect()
     bufferlist authorizer_reply;
 
     ceph_msg_connect connect;
-    connect.features = CEPH_FEATURE_SUPPORTED;
+    connect.features = get_supported_bits();
     connect.host_type = messenger->my_type;
     connect.global_seq = gseq;
     connect.connect_seq = cseq;
@@ -1067,7 +1131,7 @@ int SimpleMessenger::Pipe::connect()
     if (reply.tag == CEPH_MSGR_TAG_FEATURES) {
       dout(0) << "connect protocol feature mismatch, my " << std::hex
              << connect.features << " < peer " << reply.features
-             << " missing " << (reply.features & ~CEPH_FEATURE_SUPPORTED)
+             << " missing " << (reply.features & ~get_supported_bits())
              << std::dec << dendl;
       goto fail_locked;
     }
@@ -1117,7 +1181,7 @@ int SimpleMessenger::Pipe::connect()
     }
 
     if (reply.tag == CEPH_MSGR_TAG_READY) {
-      __u64 feat_missing = CEPH_FEATURE_REQUIRED & ~(__u64)reply.features;
+      __u64 feat_missing = get_required_bits() & ~(__u64)reply.features;
       if (feat_missing) {
        dout(1) << "missing required features " << std::hex << feat_missing << std::dec << dendl;
        goto fail_locked;
index ebdf34859270f2eb43eafa5b724941135a881f39..7a9ee73e8e2c8e05fcf9b24536f4dbc760da9e89 100644 (file)
@@ -134,6 +134,10 @@ private:
     __u64 out_seq;
     __u64 in_seq, in_seq_acked;
     
+    int get_required_bits(); /* get bits this Messenger requires
+                             * the peer to support */
+    int get_supported_bits(); /* get bits this Messenger expects
+                              * the peer to support */
     int accept();   // server handshake
     int connect();  // client handshake
     void reader();