From 82adec241db558fe8e145237c6e5653a3ce20580 Mon Sep 17 00:00:00 2001 From: Gerrit Renker Date: Sun, 13 Jun 2010 11:30:47 +0200 Subject: [PATCH] udp: transition to use sender_client 'name' field This replaces all occurrences of ut->host/ut->port in the UDP sender with a 'canonical' socket name contained in the embedded sender_client struct. This field is filled in as soon as the target is added and persists across shutting down / restarting it. The host/port fields are now obsolete, thus removed. --- udp_send.c | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/udp_send.c b/udp_send.c index b542f5a9..8baf15e3 100644 --- a/udp_send.c +++ b/udp_send.c @@ -41,10 +41,6 @@ /** Describes one entry in the list of targets for the udp sender. */ struct udp_target { - /** The hostname (DNS name or IPv4/v6 address string). */ - char host[MAX_HOSTLEN]; - /** The UDP port. */ - int port; /** Track time (seconds) of last ICMP Port Unreachable error */ time_t last_unreachable; /** Common sender client data */ @@ -63,21 +59,17 @@ static void udp_close_target(struct sender_client *sc) if (sc->cq != NULL) { del_close_on_fork_list(sc->fd); cq_destroy(sc->cq); - free(sc->name); - sc->name = NULL; sc->cq = NULL; - } } static void udp_delete_target(struct udp_target *ut, const char *msg) { - - PARA_NOTICE_LOG("deleting %s#%d (%s) from list\n", ut->host, - ut->port, msg); + PARA_NOTICE_LOG("deleting %s (%s) from list\n", ut->sc->name, msg); udp_close_target(ut->sc); vss_del_fec_client(ut->fc); list_del(&ut->sc->node); + free(ut->sc->name); free(ut->sc); free(ut); } @@ -166,9 +158,8 @@ err: static void udp_init_session(struct sender_client *sc) { if (sc->cq == NULL) { + sc->cq = cq_new(UDP_CQ_BYTES); add_close_on_fork_list(sc->fd); - sc->cq = cq_new(UDP_CQ_BYTES); - sc->name = para_strdup(remote_name(sc->fd)); PARA_NOTICE_LOG("sending to udp %s\n", sc->name); } } @@ -225,14 +216,17 @@ static int udp_com_off(__a_unused struct sender_command_data *scd) static int udp_com_delete(struct sender_command_data *scd) { struct sender_client *sc, *tmp; + char host[MAX_HOSTLEN]; + int32_t port; list_for_each_entry_safe(sc, tmp, &targets, node) { struct udp_target *ut = sc->private_data; + parse_url(sc->name, host, sizeof(host), &port); /* Unspecified port means wildcard port match */ - if (scd->port > 0 && scd->port != ut->port) + if (scd->port > 0 && scd->port != port) continue; - if (strcmp(ut->host, scd->host)) + if (strcmp(host, scd->host)) continue; udp_delete_target(ut, "com_delete"); } @@ -274,9 +268,9 @@ static int udp_check_socket_state(struct udp_target *ut) * unreachable_time < dist <= 2 * unreachable_time * No errors are allowed during this time window. */ - PARA_NOTICE_LOG("Evicting %s#%d after %d seconds " + PARA_NOTICE_LOG("Evicting %s after %d seconds " "of connection errors.\n", - ut->host, ut->port, (int)dist); + ut->sc->name, (int)dist); } } return -ERRNO_TO_PARA_ERROR(ret); @@ -347,7 +341,8 @@ static void udp_add_target(struct sender_command_data *scd) ret = mark_fd_nonblocking(ut->sc->fd); if (ret < 0) goto err; - PARA_INFO_LOG("adding to target list (%s#%d)\n", ut->host, ut->port); + ut->sc->name = para_strdup(remote_name(ut->sc->fd)); + PARA_INFO_LOG("adding to target list (%s)\n", ut->sc->name); ut->fc = vss_add_fec_client(ut->sc, &ut->fcp); para_list_add(&ut->sc->node, &targets); return; @@ -373,10 +368,8 @@ static char *udp_info(void) list_for_each_entry(sc, &targets, node) { struct udp_target *ut = sc->private_data; - bool is_v6 = strchr(ut->host, ':') != NULL; - char *tmp = make_message("%s%s%s%s:%d/%u:%u:%u ", tgts ? : "", - is_v6 ? "[" : "", ut->host, - is_v6 ? "]" : "", ut->port, + char *tmp = make_message("%s%s/%u:%u:%u ", tgts ? : "", + ut->sc->name, ut->fcp.max_slice_bytes, ut->fcp.data_slices_per_group, ut->fcp.slices_per_group -- 2.39.2