| 774 | |
| 775 | |
| 776 | redis_node* redis_cluster::get_node(string& line) |
| 777 | { |
| 778 | std::vector<string>& tokens = line.split2(" "); |
| 779 | if (tokens.size() < 8) { |
| 780 | logger_warn("invalid tokens's size: %d < 8", (int) tokens.size()); |
| 781 | return NULL; |
| 782 | } |
| 783 | |
| 784 | bool myself = false; |
| 785 | char* node_type = tokens[2].c_str(); |
| 786 | char* ptr = strchr(node_type, ','); |
| 787 | if (ptr != NULL && *(ptr + 1) != 0) { |
| 788 | *ptr++ = 0; |
| 789 | if (strcasecmp(node_type, "myself") == 0) { |
| 790 | myself = true; |
| 791 | } |
| 792 | node_type = ptr; |
| 793 | } |
| 794 | |
| 795 | redis_node* node = NEW redis_node; |
| 796 | node->set_id(tokens[0].c_str()); |
| 797 | node->set_addr(tokens[1].c_str()); |
| 798 | node->set_myself(myself); |
| 799 | node->set_connected(strcasecmp(tokens[7].c_str(), "connected") == 0); |
| 800 | node->set_master_id(tokens[3].c_str()); |
| 801 | |
| 802 | if (strcasecmp(node_type, "master") == 0) { |
| 803 | node->set_master(node); |
| 804 | node->set_type("master"); |
| 805 | masters_[tokens[0]] = node; |
| 806 | size_t n = tokens.size(); |
| 807 | for (size_t i = 8; i < n; i++) { |
| 808 | add_slot_range(node, tokens[i].c_str()); |
| 809 | } |
| 810 | } else if (strcasecmp(node_type, "slave") == 0) { |
| 811 | node->set_type("slave"); |
| 812 | } else if (strcasecmp(node_type, "handshake") == 0) { |
| 813 | node->set_master(node); |
| 814 | node->set_type("handshake"); |
| 815 | node->set_handshaking(true); |
| 816 | masters_[tokens[0]] = node; |
| 817 | size_t n = tokens.size(); |
| 818 | for (size_t i = 8; i < n; i++) { |
| 819 | add_slot_range(node, tokens[i].c_str()); |
| 820 | } |
| 821 | } else { |
| 822 | logger_warn("unknown node type: %s", node_type); |
| 823 | } |
| 824 | |
| 825 | return node; |
| 826 | } |
| 827 | |
| 828 | void redis_cluster::add_slot_range(redis_node* node, char* slots) |
| 829 | { |