Skip to content

Commit

Permalink
[fix] Resolve instruments with DNS
Browse files Browse the repository at this point in the history
Fixes #16.
  • Loading branch information
mmalecki committed Oct 7, 2013
1 parent 75a449a commit 337b0dd
Show file tree
Hide file tree
Showing 13 changed files with 87 additions and 146 deletions.
2 changes: 1 addition & 1 deletion include/forza.h
Expand Up @@ -50,7 +50,7 @@ enum forza__stdio_type {
} typedef forza__stdio_type_t;


void forza_connect(char** hosts, char* hostname, char* user, char* name, forza_connect_cb connect_cb_);
void forza_connect(char* host, int port, char* hostname, char* user, char* name, forza_connect_cb connect_cb_);
void forza_send(forza_metric_t* metric);
void forza_close();
forza_metric_t* forza_new_metric();
Expand Down
80 changes: 53 additions & 27 deletions src/connect.c
@@ -1,3 +1,4 @@
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Expand All @@ -12,48 +13,42 @@ static uv_tcp_t client;
static uv_loop_t* loop;
static uv_connect_t connect_req;

static int host_index = -1;
static char** hosts;
static int hosts_length;
static struct addrinfo* first_host;
static struct addrinfo* host;
static int port;
static char* user = NULL;
static char* name = NULL;

void forza__reconnect(forza_connect_cb connect_cb);
void forza__on_connect(uv_connect_t* req, int status);
void forza__reconnect_on_close(uv_handle_t* handle);
void forza__reconnect_on_connect_error(uv_handle_t* handle);

void forza__reconnect(forza_connect_cb connect_cb) {
char* pair;
char* port_sep;
char host[16];
char addr_str[17] = {'\0'};
int r;
int port;
struct sockaddr_in addr;

++host_index;
pair = hosts[host_index];
if (pair == NULL) {
host_index = 0;
pair = hosts[host_index];
}

port_sep = strchr(pair, ':');
strncpy(host, pair, port_sep - pair);
host[port_sep - pair] = '\0';
sscanf(port_sep + 1, "%d", &port);

printf("connecting to %s:%d...\n", host, port);

addr = uv_ip4_addr(host, port);
host = host->ai_next;
if (host == NULL) {
host = first_host;
}

loop = uv_default_loop();
uv_ip4_name((struct sockaddr_in*) host->ai_addr, addr_str, 16);
printf("connecting to %s:%d...\n", addr_str, port);

connect_req.data = (void*) connect_cb;

/* Set up a TCP keepalive connection to the godot server */
uv_tcp_init(loop, &client);
uv_tcp_keepalive(&client, 1, 180);
r = uv_tcp_connect(&connect_req, &client, addr, forza__on_connect);
r = uv_tcp_connect(
&connect_req,
&client,
*(struct sockaddr_in*) host->ai_addr,
forza__on_connect
);

if (r != 0) {
//
Expand All @@ -72,15 +67,46 @@ void forza__reconnect(forza_connect_cb connect_cb) {
}
}

void forza_connect(char** hosts_, char* hostname_, char* user_, char* name_, forza_connect_cb connect_cb) {
void forza_connect(char* host_, int port_, char* hostname_, char* user_, char* name_, forza_connect_cb connect_cb) {
struct addrinfo hints;
struct addrinfo* t;
int r, count, random;
char port_str[6];

loop = uv_default_loop();

/* set user and app name to be used in metric if they exist */
user = user_;
name = name_;
/* Get the hostname so that it can be provided to the server */
hostname = hostname_;
hosts = hosts_;
for (hosts_length = 0; hosts[hosts_length] != NULL; hosts_length++);
host_index = (rand() % hosts_length) - 1;
port = port_;

hints.ai_family = PF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = 0;

//
// Do this synchronously since we're not doing anything important anyway.
//
sprintf(port_str, "%d", port);
r = getaddrinfo(host_, port_str, &hints, &first_host);
if (r == -1) {
fprintf(stderr, "getaddrinfo: %s\n", uv_err_name(uv_last_error(loop)));
connect_cb(r);
return;
}

host = first_host;
for (count = 0, t = first_host; t != NULL; t = t->ai_next, count++);

random = rand() % count;

while (random-- > 0) {
host = host->ai_next;
}

forza__reconnect(connect_cb);
}

Expand Down
28 changes: 24 additions & 4 deletions src/forza.c
Expand Up @@ -181,10 +181,12 @@ void forza__on_sigterm() {
}

int main(int argc, char *argv[]) {
char** hosts;
char* host;
char* hostname;
char* user;
char* name;
char* port_str;
int port;
int i, c = 0;
uv_interface_address_t* addresses;
uv_err_t err;
Expand All @@ -203,13 +205,28 @@ int main(int argc, char *argv[]) {
#endif

opt = saneopt_init(argc - 1, argv + 1);

saneopt_alias(opt, "host", "h");
hosts = saneopt_get_all(opt, "host");
saneopt_alias(opt, "port", "p");

host = saneopt_get(opt, "host");
port_str = saneopt_get(opt, "port");
hostname = saneopt_get(opt, "hostname");
user = saneopt_get(opt, "app-user");
name = saneopt_get(opt, "app-name");
arguments = saneopt_arguments(opt);

if (host == NULL || port_str == NULL) {
fprintf(stderr, "Host and port required\n");
return 2;
}

sscanf(port_str, "%d", &port);
if (port <= 0 || port > 65535) {
fprintf(stderr, "Port has to be <= 0 and > 65535\n");
return 3;
}

if (hostname == NULL) {
hostname = malloc(256 * sizeof(*hostname));
err = uv_interface_addresses(&addresses, &c);
Expand All @@ -228,11 +245,14 @@ int main(int argc, char *argv[]) {
uv_free_interface_addresses(addresses, c);
}

forza_connect(hosts, hostname, user, name, on_connect);
forza_connect(host, port, hostname, user, name, on_connect);

uv_run(loop, UV_RUN_DEFAULT);

free(hosts);
free(host);
free(port_str);
free(user);
free(name);

return 0;
}
3 changes: 2 additions & 1 deletion test/custom-hostname-test.js
Expand Up @@ -33,7 +33,8 @@ server.listen(PORT, function () {
child = spawn(
path.join(__dirname, '..', 'forza'),
[
'-h', '127.0.0.1:' + PORT.toString(),
'-h', '127.0.0.1',
'-p', PORT.toString(),
'--hostname', HOSTNAME,
'--', 'node', path.join(__dirname, 'fixtures', 'exit-after-1-s.js')
]
Expand Down
40 changes: 0 additions & 40 deletions test/failover-on-connect-test.js

This file was deleted.

66 changes: 0 additions & 66 deletions test/failover-on-write-test.js

This file was deleted.

2 changes: 1 addition & 1 deletion test/logs-test.js
Expand Up @@ -34,6 +34,6 @@ var server = net.createServer(cb(function (socket) {
server.listen(PORT, function () {
var child = spawn(
path.join(__dirname, '..', 'forza'),
[ '-h', '127.0.0.1:' + PORT.toString(), '--', 'node', path.join(__dirname, 'fixtures', 'output.js') ]
[ '-h', '127.0.0.1', '-p', PORT.toString(), '--', 'node', path.join(__dirname, 'fixtures', 'output.js') ]
);
});
2 changes: 1 addition & 1 deletion test/start-0-test.js
Expand Up @@ -37,7 +37,7 @@ server.listen(PORT, cb(function () {
child = spawn(
path.join(__dirname, '..', 'forza'),
[
'-h', '127.0.0.1:' + PORT.toString(), '--app-name', 'test-app', '--app-user', 'maciej',
'-h', '127.0.0.1', '-p', PORT.toString(), '--app-name', 'test-app', '--app-user', 'maciej',
'--', 'node', path.join(__dirname, 'fixtures', 'listen-0.js')
]
);
Expand Down
2 changes: 1 addition & 1 deletion test/start-80-test.js
Expand Up @@ -36,7 +36,7 @@ server.listen(PORT, cb(function () {
child = spawn(
path.join(__dirname, '..', 'forza'),
[
'-h', '127.0.0.1:' + PORT.toString(), '--app-name', 'test-app', '--app-user', 'maciej',
'-h', '127.0.0.1', '-p', PORT.toString(), '--app-name', 'test-app', '--app-user', 'maciej',
'--', 'node', path.join(__dirname, 'fixtures', 'listen-80.js')
]
);
Expand Down
2 changes: 1 addition & 1 deletion test/start-no-script-test.js
Expand Up @@ -33,7 +33,7 @@ server.listen(PORT, cb(function () {
var child = spawn(
path.join(__dirname, '..', 'forza'),
[
'-h', '127.0.0.1:' + PORT.toString(), '--app-name', 'test-app', '--app-user', 'maciej',
'-h', '127.0.0.1', '-p', PORT.toString(), '--app-name', 'test-app', '--app-user', 'maciej',
'--', 'node', path.join(__dirname, 'fixtures', 'no-such-script.js')
]
);
Expand Down
2 changes: 1 addition & 1 deletion test/start-premature-quit-test.js
Expand Up @@ -33,7 +33,7 @@ server.listen(PORT, cb(function () {
var child = spawn(
path.join(__dirname, '..', 'forza'),
[
'-h', '127.0.0.1:' + PORT.toString(), '--app-name', 'test-app', '--app-user', 'maciej',
'-h', '127.0.0.1', '-p', PORT.toString(), '--app-name', 'test-app', '--app-user', 'maciej',
'--', 'node', path.join(__dirname, 'fixtures', 'exit-after-1-s.js')
]
);
Expand Down
2 changes: 1 addition & 1 deletion test/start-success-test.js
Expand Up @@ -35,7 +35,7 @@ server.listen(PORT, cb(function () {
child = spawn(
path.join(__dirname, '..', 'forza'),
[
'-h', '127.0.0.1:' + PORT.toString(), '--app-name', 'test-app', '--app-user', 'maciej',
'-h', '127.0.0.1', '-p', PORT.toString(), '--app-name', 'test-app', '--app-user', 'maciej',
'--', 'node', path.join(__dirname, 'fixtures', 'listen.js')
]
);
Expand Down
2 changes: 1 addition & 1 deletion test/start-udp-test.js
Expand Up @@ -36,7 +36,7 @@ server.listen(PORT, cb(function () {
child = spawn(
path.join(__dirname, '..', 'forza'),
[
'-h', '127.0.0.1:' + PORT.toString(), '--app-name', 'test-app', '--app-user', 'maciej',
'-h', '127.0.0.1', '-p', PORT.toString(), '--app-name', 'test-app', '--app-user', 'maciej',
'--', 'node', path.join(__dirname, 'fixtures', 'listen-with-udp.js')
]
);
Expand Down

0 comments on commit 337b0dd

Please sign in to comment.