X-Git-Url: http://git.onelab.eu/?p=distributedratelimiting.git;a=blobdiff_plain;f=drl%2Fpeer_comm.c;h=41ed778bdaf6bbe166035cab8d6c6bcc33e2aae8;hp=869cde90a171c8eec38dc7f2342b693e5c610d25;hb=f83340496f632165030cc92cd98408a87082f6b1;hpb=74f52acf84cbf11faab8aa53e069464063ce11b9 diff --git a/drl/peer_comm.c b/drl/peer_comm.c index 869cde9..41ed778 100644 --- a/drl/peer_comm.c +++ b/drl/peer_comm.c @@ -42,6 +42,10 @@ #include "peer_comm.h" #include "logging.h" +/* Artifically makes a network partition. */ +int do_partition = 0; +int partition_set = 0xfffffff; + extern limiter_t limiter; static const uint32_t MAGIC_MSG = 0x123123; @@ -386,11 +390,22 @@ static void ident_receive(comm_ident_t *ident, pthread_rwlock_t *limiter_rwlock) } #endif +#define ALLOW_PARTITION + int send_udp_mesh(comm_t *comm, uint32_t id, int sock) { int result = 0; remote_limiter_t *remote; message_t msg; struct sockaddr_in toaddr; + int i; + +#ifdef ALLOW_PARTITION + + int partition_count = 0; + struct in_addr dest; + char dest_ip[22]; + +#endif memset(&toaddr, 0, sizeof(struct sockaddr_in)); toaddr.sin_family = AF_INET; @@ -404,8 +419,28 @@ int send_udp_mesh(comm_t *comm, uint32_t id, int sock) { message_to_nbo(&msg); /* Iterate though and send update to all remote limiters in our identity. */ - map_reset_iterate(comm->remote_node_map); - while ((remote = map_next(comm->remote_node_map))) { + for (i = 0; i < comm->remote_node_count; ++i) { + remote = &comm->remote_limiters[i]; + +#ifdef ALLOW_PARTITION + + if (do_partition) { + printlog(LOG_DEBUG, "Testing partition, partition set is %x, count is %d, test is %d.\n", + partition_set, partition_count, partition_set & (1 << partition_count)); + /* If the partition count bit isn't high in the set, don't actually send anything. */ + if ((partition_set & (1 << partition_count)) == 0) { + dest.s_addr = ntohl(remote->addr); + strcpy(dest_ip, inet_ntoa(dest)); + + printlog(LOG_DEBUG, "Partition: ignoring host %s\n", dest_ip); + + partition_count += 1; + continue; + } + } + +#endif + toaddr.sin_addr.s_addr = remote->addr; /* Already in network byte order. */ toaddr.sin_port = remote->port; if (sendto(sock, &msg, sizeof(msg), 0, (struct sockaddr *) &toaddr, sizeof(struct sockaddr_in)) < 0) { @@ -414,6 +449,7 @@ int send_udp_mesh(comm_t *comm, uint32_t id, int sock) { printlog(LOG_WARN, " - The error was |%d|\n", strerror(result)); break; } + partition_count += 1; } return result; @@ -435,6 +471,8 @@ int send_udp_gossip(comm_t *comm, uint32_t id, int sock) { for (i = 0; i < comm->gossip.gossip_branch; ++i) { message_t msg; + printlog(LOG_DEBUG, "Gossip loop iteration, i=%d, branch=%d\n", i, comm->gossip.gossip_branch); + if (comm->retrys[i] >= 0) { remote = &comm->remote_limiters[comm->retrys[i]]; targetid = comm->retrys[i];