Пример #1
0
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);
}
Пример #2
0
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;
	}
}