| 5608 | /* Cluster Manager Commands */ |
| 5609 | |
| 5610 | static int clusterManagerCommandCreate(int argc, char **argv) { |
| 5611 | int i, j, success = 1; |
| 5612 | cluster_manager.nodes = listCreate(); |
| 5613 | for (i = 0; i < argc; i++) { |
| 5614 | char *addr = argv[i]; |
| 5615 | char *c = strrchr(addr, '@'); |
| 5616 | if (c != NULL) *c = '\0'; |
| 5617 | c = strrchr(addr, ':'); |
| 5618 | if (c == NULL) { |
| 5619 | fprintf(stderr, "Invalid address format: %s\n", addr); |
| 5620 | return 0; |
| 5621 | } |
| 5622 | *c = '\0'; |
| 5623 | char *ip = addr; |
| 5624 | int port = atoi(++c); |
| 5625 | clusterManagerNode *node = clusterManagerNewNode(ip, port); |
| 5626 | if (!clusterManagerNodeConnect(node)) { |
| 5627 | freeClusterManagerNode(node); |
| 5628 | return 0; |
| 5629 | } |
| 5630 | char *err = NULL; |
| 5631 | if (!clusterManagerNodeIsCluster(node, &err)) { |
| 5632 | clusterManagerPrintNotClusterNodeError(node, err); |
| 5633 | if (err) zfree(err); |
| 5634 | freeClusterManagerNode(node); |
| 5635 | return 0; |
| 5636 | } |
| 5637 | err = NULL; |
| 5638 | if (!clusterManagerNodeLoadInfo(node, 0, &err)) { |
| 5639 | if (err) { |
| 5640 | CLUSTER_MANAGER_PRINT_REPLY_ERROR(node, err); |
| 5641 | zfree(err); |
| 5642 | } |
| 5643 | freeClusterManagerNode(node); |
| 5644 | return 0; |
| 5645 | } |
| 5646 | err = NULL; |
| 5647 | if (!clusterManagerNodeIsEmpty(node, &err)) { |
| 5648 | clusterManagerPrintNotEmptyNodeError(node, err); |
| 5649 | if (err) zfree(err); |
| 5650 | freeClusterManagerNode(node); |
| 5651 | return 0; |
| 5652 | } |
| 5653 | listAddNodeTail(cluster_manager.nodes, node); |
| 5654 | } |
| 5655 | int node_len = cluster_manager.nodes->len; |
| 5656 | int replicas = config.cluster_manager_command.replicas; |
| 5657 | int masters_count = CLUSTER_MANAGER_MASTERS_COUNT(node_len, replicas); |
| 5658 | if (masters_count < 3) { |
| 5659 | clusterManagerLogErr( |
| 5660 | "*** ERROR: Invalid configuration for cluster creation.\n" |
| 5661 | "*** Redis Cluster requires at least 3 master nodes.\n" |
| 5662 | "*** This is not possible with %d nodes and %d replicas per node.", |
| 5663 | node_len, replicas); |
| 5664 | clusterManagerLogErr("\n*** At least %d nodes are required.\n", |
| 5665 | 3 * (replicas + 1)); |
| 5666 | return 0; |
| 5667 | } |
nothing calls this directly
no test coverage detected