void as_node_add_address(as_node* node, struct sockaddr_in* addr) { as_address address; address.addr = *addr; as_socket_address_name(addr, address.name); as_vector_append(&node->addresses, &address); }
static as_status as_lookup_node(as_cluster* cluster, as_error* err, struct sockaddr_in* addr, as_node_info* node_info) { uint64_t deadline = as_socket_deadline(cluster->conn_timeout_ms); int fd; as_status status = as_info_create_socket(cluster, err, addr, deadline, &fd); if (status) { return status; } char* response = 0; status = as_info_command(err, fd, "node\nfeatures\n", true, deadline, 0, &response); if (status) { as_close(fd); return status; } as_vector values; as_vector_inita(&values, sizeof(as_name_value), 2); as_info_parse_multi_response(response, &values); if (values.size != 2) { goto Error; } as_name_value* nv = as_vector_get(&values, 0); char* node_name = nv->value; if (node_name == 0 || *node_name == 0) { goto Error; } as_strncpy(node_info->name, node_name, AS_NODE_NAME_SIZE); node_info->fd = fd; nv = as_vector_get(&values, 1); char* features = nv->value; if (features == 0) { goto Error; } char* begin = features; char* end = begin; uint8_t has_batch_index = 0; uint8_t has_replicas_all = 0; uint8_t has_double = 0; uint8_t has_geo = 0; while (*begin && ! (has_batch_index && has_replicas_all && has_double && has_geo)) { while (*end) { if (*end == ';') { *end++ = 0; break; } end++; } if (strcmp(begin, "batch-index") == 0) { has_batch_index = 1; } if (strcmp(begin, "replicas-all") == 0) { has_replicas_all = 1; } if (strcmp(begin, "float") == 0) { has_double = 1; } if (strcmp(begin, "geo") == 0) { has_geo = 1; } begin = end; } node_info->has_batch_index = has_batch_index; node_info->has_replicas_all = has_replicas_all; node_info->has_double = has_double; node_info->has_geo = has_geo; cf_free(response); return AEROSPIKE_OK; Error: { char addr_name[INET_ADDRSTRLEN]; as_socket_address_name(addr, addr_name); as_error_update(err, status, "Invalid node info response from %s: %s", addr_name, response); cf_free(response); as_close(fd); return AEROSPIKE_ERR_CLIENT; } }