| 4695 | /* Cluster Manager Commands */ |
| 4696 | |
| 4697 | static int clusterManagerCommandCreate(int argc, char **argv) { |
| 4698 | int i, j, success = 1; |
| 4699 | cluster_manager.nodes = listCreate(); |
| 4700 | for (i = 0; i < argc; i++) { |
| 4701 | char *addr = argv[i]; |
| 4702 | char *c = strrchr(addr, '@'); |
| 4703 | if (c != NULL) *c = '\0'; |
| 4704 | c = strrchr(addr, ':'); |
| 4705 | if (c == NULL) { |
| 4706 | fprintf(stderr, "Invalid address format: %s\n", addr); |
| 4707 | return 0; |
| 4708 | } |
| 4709 | *c = '\0'; |
| 4710 | char *ip = addr; |
| 4711 | int port = atoi(++c); |
| 4712 | clusterManagerNode *node = clusterManagerNewNode(ip, port); |
| 4713 | if (!clusterManagerNodeConnect(node)) { |
| 4714 | freeClusterManagerNode(node); |
| 4715 | return 0; |
| 4716 | } |
| 4717 | char *err = NULL; |
| 4718 | if (!clusterManagerNodeIsCluster(node, &err)) { |
| 4719 | clusterManagerPrintNotClusterNodeError(node, err); |
| 4720 | if (err) zfree(err); |
| 4721 | freeClusterManagerNode(node); |
| 4722 | return 0; |
| 4723 | } |
| 4724 | err = NULL; |
| 4725 | if (!clusterManagerNodeLoadInfo(node, 0, &err)) { |
| 4726 | if (err) { |
| 4727 | CLUSTER_MANAGER_PRINT_REPLY_ERROR(node, err); |
| 4728 | zfree(err); |
| 4729 | } |
| 4730 | freeClusterManagerNode(node); |
| 4731 | return 0; |
| 4732 | } |
| 4733 | err = NULL; |
| 4734 | if (!clusterManagerNodeIsEmpty(node, &err)) { |
| 4735 | clusterManagerPrintNotEmptyNodeError(node, err); |
| 4736 | if (err) zfree(err); |
| 4737 | freeClusterManagerNode(node); |
| 4738 | return 0; |
| 4739 | } |
| 4740 | listAddNodeTail(cluster_manager.nodes, node); |
| 4741 | } |
| 4742 | int node_len = cluster_manager.nodes->len; |
| 4743 | int replicas = config.cluster_manager_command.replicas; |
| 4744 | int masters_count = CLUSTER_MANAGER_MASTERS_COUNT(node_len, replicas); |
| 4745 | if (masters_count < 3) { |
| 4746 | clusterManagerLogErr( |
| 4747 | "*** ERROR: Invalid configuration for cluster creation.\n" |
| 4748 | "*** KeyDB Cluster requires at least 3 master nodes.\n" |
| 4749 | "*** This is not possible with %d nodes and %d replicas per node.", |
| 4750 | node_len, replicas); |
| 4751 | clusterManagerLogErr("\n*** At least %d nodes are required.\n", |
| 4752 | 3 * (replicas + 1)); |
| 4753 | return 0; |
| 4754 | } |
nothing calls this directly
no test coverage detected