Skip to content

Commit d2b6c30

Browse files
committed
Correctly resolve addresses in raftable
1 parent 7c42a86 commit d2b6c30

File tree

3 files changed

+73
-41
lines changed

3 files changed

+73
-41
lines changed

contrib/mmts/tests2/docker-entrypoint.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ if [ "$1" = 'postgres' ]; then
6262
############################################################################
6363

6464
CONNSTRS='dbname=postgres host=node1, dbname=postgres host=node2, dbname=postgres host=node3'
65-
RAFT_PEERS='1:172.18.0.2:6666, 2:172.18.0.4:6666, 3:172.18.0.3:6666'
65+
RAFT_PEERS='1:node1:6666, 2:node2:6666, 3:node3:6666'
6666

6767
cat <<-EOF >> $PGDATA/postgresql.conf
6868
listen_addresses='*'

contrib/raftable/raft/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#override CC := clang
2-
override CFLAGS += -fpic -Wall -Wfatal-errors -O0 -g -pedantic -std=c99
2+
override CFLAGS += -fpic -Wall -Wfatal-errors -O0 -g -pedantic -std=c99 -D_POSIX_C_SOURCE=200112L
33
override CPPFLAGS += -I. -Iinclude #-DDEBUG
44
override HEART_LDFLAGS += -Llib -lraft -ljansson
55

contrib/raftable/raft/src/raft.c

Lines changed: 71 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#include <sys/socket.h>
33
#include <netinet/in.h>
44
#include <arpa/inet.h>
5+
#include <netdb.h>
6+
#include <unistd.h>
57

68
#include <assert.h>
79
#include <errno.h>
@@ -203,6 +205,7 @@ static void raft_entry_init(raft_entry_t *e) {
203205

204206
static bool raft_log_init(raft_t raft) {
205207
raft_log_t *l = &raft->log;
208+
int i;
206209
l->first = 0;
207210
l->size = 0;
208211
l->acked = 0;
@@ -212,20 +215,21 @@ static bool raft_log_init(raft_t raft) {
212215
shout("failed to allocate memory for raft log\n");
213216
return false;
214217
}
215-
for (int i = 0; i < raft->config.log_len; i++) {
218+
for (i = 0; i < raft->config.log_len; i++) {
216219
raft_entry_init(l->entries + i);
217220
}
218221
raft_entry_init(&l->newentry);
219222
return true;
220223
}
221224

222225
static bool raft_peers_init(raft_t raft) {
226+
int i;
223227
raft->peers = malloc(raft->config.peernum_max * sizeof(raft_peer_t));
224228
if (!raft->peers) {
225229
shout("failed to allocate memory for raft peers\n");
226230
return false;
227231
}
228-
for (int i = 0; i < raft->config.peernum_max; i++) {
232+
for (i = 0; i < raft->config.peernum_max; i++) {
229233
raft_peer_init(raft->peers + i);
230234
}
231235
return true;
@@ -282,27 +286,38 @@ static void raft_reset_timer(raft_t r) {
282286
}
283287

284288
bool raft_peer_up(raft_t r, int id, char *host, int port, bool self) {
289+
raft_peer_t *p = r->peers + id;
290+
struct addrinfo hint;
291+
struct addrinfo *a = NULL;
292+
char portstr[6];
293+
285294
if (r->peernum >= r->config.peernum_max) {
286295
shout("too many peers\n");
287296
return false;
288297
}
289298

290-
raft_peer_t *p = r->peers + id;
291-
292299
raft_peer_init(p);
293300
p->up = true;
294301
p->host = host;
295302
p->port = port;
296303

297-
if (inet_aton(p->host, &p->addr.sin_addr) == 0) {
304+
memset(&hint, 0, sizeof(hint));
305+
hint.ai_socktype = SOCK_DGRAM;
306+
hint.ai_family = AF_INET;
307+
hint.ai_protocol = getprotobyname("udp")->p_proto;
308+
309+
snprintf(portstr, 6, "%d", port);
310+
311+
if (getaddrinfo(host, portstr, &hint, &a))
312+
{
298313
shout(
299314
"cannot convert the host string '%s'"
300-
" to a valid address\n", p->host
301-
);
315+
" to a valid address: %s\n", host, strerror(errno));
302316
return false;
303317
}
304-
p->addr.sin_family = AF_INET;
305-
p->addr.sin_port = htons(p->port);
318+
319+
assert(a != NULL && a->ai_addrlen <= sizeof(p->addr));
320+
memcpy(&p->addr, a->ai_addr, a->ai_addrlen);
306321

307322
if (self) {
308323
if (r->me != NOBODY) {
@@ -352,40 +367,54 @@ static void socket_set_reuseaddr(int sock) {
352367
int raft_create_udp_socket(raft_t r) {
353368
assert(r->me != NOBODY);
354369
raft_peer_t *me = r->peers + r->me;
370+
struct addrinfo hint;
371+
struct addrinfo *addrs = NULL;
372+
struct addrinfo *a;
373+
char portstr[6];
355374

356-
r->sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
357-
if (r->sock == -1) {
358-
shout(
359-
"cannot create the listening"
360-
" socket: %s\n",
361-
strerror(errno)
362-
);
363-
return -1;
364-
}
365-
366-
socket_set_reuseaddr(r->sock);
367-
socket_set_recv_timeout(r->sock, r->config.heartbeat_ms);
375+
memset(&hint, 0, sizeof(hint));
376+
hint.ai_socktype = SOCK_DGRAM;
377+
hint.ai_family = AF_INET;
378+
hint.ai_protocol = getprotobyname("udp")->p_proto;
368379

369-
// zero out the structure
370-
memset((char*)&me->addr, 0, sizeof(me->addr));
380+
snprintf(portstr, 6, "%d", me->port);
371381

372-
me->addr.sin_family = AF_INET;
373-
if (inet_aton(me->host, &me->addr.sin_addr) == 0) {
382+
if (getaddrinfo(me->host, portstr, &hint, &addrs))
383+
{
374384
shout(
375385
"cannot convert the host string"
376386
" '%s' to a valid address\n",
377387
me->host
378388
);
379389
return -1;
380390
}
381-
me->addr.sin_port = htons(me->port);
382-
debug("binding udp %s:%d\n", me->host, me->port);
383-
if (bind(r->sock, (struct sockaddr*)&me->addr, sizeof(me->addr)) == -1) {
384-
shout("cannot bind the socket: %s\n", strerror(errno));
385-
return -1;
391+
392+
for (a = addrs; a != NULL; a = a->ai_next)
393+
{
394+
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
395+
if (sock < 0) {
396+
shout("cannot create socket: %s\n", strerror(errno));
397+
continue;
398+
}
399+
socket_set_reuseaddr(sock);
400+
socket_set_recv_timeout(sock, r->config.heartbeat_ms);
401+
402+
debug("binding udp %s:%d\n", me->host, me->port);
403+
if (bind(sock, a->ai_addr, a->ai_addrlen) < 0) {
404+
shout("cannot bind the socket: %s\n", strerror(errno));
405+
close(sock);
406+
continue;
407+
}
408+
r->sock = sock;
409+
assert(a->ai_addrlen <= sizeof(me->addr));
410+
memcpy(&me->addr, a->ai_addr, a->ai_addrlen);
411+
return sock;
386412
}
387413

388-
return r->sock;
414+
shout("cannot resolve the host string '%s' to a valid address\n",
415+
me->host
416+
);
417+
return -1;
389418
}
390419

391420
static bool msg_size_is(raft_msg_t m, int mlen) {
@@ -500,13 +529,15 @@ static void raft_beat(raft_t r, int dst) {
500529
}
501530

502531
static void raft_reset_bytes_acked(raft_t r) {
503-
for (int i = 0; i < r->config.peernum_max; i++) {
532+
int i;
533+
for (i = 0; i < r->config.peernum_max; i++) {
504534
r->peers[i].acked.bytes = 0;
505535
}
506536
}
507537

508538
static void raft_reset_silent_time(raft_t r, int id) {
509-
for (int i = 0; i < r->config.peernum_max; i++) {
539+
int i;
540+
for (i = 0; i < r->config.peernum_max; i++) {
510541
if ((i == id) || (id == NOBODY)) {
511542
r->peers[i].silent_ms = 0;
512543
}
@@ -601,8 +632,8 @@ static void raft_refresh_acked(raft_t r) {
601632

602633
static int raft_increase_silent_time(raft_t r, int ms) {
603634
int recent_peers = 1; // count myself as recent
604-
605-
for (int i = 0; i < r->config.peernum_max; i++) {
635+
int i;
636+
for (i = 0; i < r->config.peernum_max; i++) {
606637
if (!r->peers[i].up) continue;
607638
if (i == r->me) continue;
608639

@@ -655,9 +686,9 @@ void raft_tick(raft_t r, int msec) {
655686

656687
static int raft_compact(raft_t raft) {
657688
raft_log_t *l = &raft->log;
658-
689+
int i;
659690
int compacted = 0;
660-
for (int i = l->first; i < l->applied; i++) {
691+
for (i = l->first; i < l->applied; i++) {
661692
raft_entry_t *e = &RAFT_LOG(raft, i);
662693

663694
e->snapshot = false;
@@ -677,7 +708,7 @@ static int raft_compact(raft_t raft) {
677708
assert(l->first == l->applied - 1);
678709

679710
// reset bytes progress of peers that were receiving the compacted entries
680-
for (int i = 0; i < raft->config.peernum_max; i++) {
711+
for (i = 0; i < raft->config.peernum_max; i++) {
681712
raft_peer_t *p = raft->peers + i;
682713
if (!p->up) continue;
683714
if (i == raft->me) continue;
@@ -735,9 +766,10 @@ bool raft_applied(raft_t r, int id, int index) {
735766
}
736767

737768
static bool raft_restore(raft_t r, int previndex, raft_entry_t *e) {
769+
int i;
738770
assert(e->bytes == e->update.len);
739771
assert(e->snapshot);
740-
for (int i = RAFT_LOG_FIRST_INDEX(r); i <= RAFT_LOG_LAST_INDEX(r); i++) {
772+
for (i = RAFT_LOG_FIRST_INDEX(r); i <= RAFT_LOG_LAST_INDEX(r); i++) {
741773
raft_entry_t *victim = &RAFT_LOG(r, i);
742774
free(victim->update.data);
743775
victim->update.len = 0;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy