diff options
author | joerg <joerg> | 2008-01-26 00:34:57 +0000 |
---|---|---|
committer | joerg <joerg> | 2008-01-26 00:34:57 +0000 |
commit | e9b0a4060b801fb8f4f17b91bf9d47100c79e30c (patch) | |
tree | 9ab87c6b287fc6488950355f4bdb6687deda67f0 /pkgtools/pbulk/files | |
parent | 66d7cf2508b50491458407e1a4740269f305a02b (diff) | |
download | pkgsrc-e9b0a4060b801fb8f4f17b91bf9d47100c79e30c.tar.gz |
pbulk-0.24:
When all jobs are processed in master mode, close the listen socket
and shutdown(2) all peers. Give them a second to close(2) the
connection themselve, so that the port remains usable on the master.
This is the standard compliant fix for PR 37002.
Diffstat (limited to 'pkgtools/pbulk/files')
-rw-r--r-- | pkgtools/pbulk/files/pbulk/pbuild/master.c | 23 | ||||
-rw-r--r-- | pkgtools/pbulk/files/pbulk/pscan/master.c | 23 |
2 files changed, 40 insertions, 6 deletions
diff --git a/pkgtools/pbulk/files/pbulk/pbuild/master.c b/pkgtools/pbulk/files/pbulk/pbuild/master.c index df8f3bdf6c9..040dce3622c 100644 --- a/pkgtools/pbulk/files/pbulk/pbuild/master.c +++ b/pkgtools/pbulk/files/pbulk/pbuild/master.c @@ -1,4 +1,4 @@ -/* $NetBSD: master.c,v 1.5 2008/01/15 21:43:32 joerg Exp $ */ +/* $NetBSD: master.c,v 1.6 2008/01/26 00:34:57 joerg Exp $ */ /*- * Copyright (c) 2007 Joerg Sonnenberger <joerg@NetBSD.org>. @@ -55,6 +55,8 @@ #include "pbuild.h" static LIST_HEAD(, build_peer) active_peers, inactive_peers, unassigned_peers; +static struct event listen_event; +static int listen_event_socket; struct build_peer { LIST_ENTRY(build_peer) peer_link; @@ -170,6 +172,21 @@ send_build_stats(struct build_peer *peer) } static void +shutdown_master(void) +{ + struct timeval tv; + struct build_peer *peer; + + event_del(&listen_event); + (void)close(listen_event_socket); + LIST_FOREACH(peer, &inactive_peers, peer_link) + (void)shutdown(peer->fd, SHUT_RDWR); + tv.tv_sec = 1; + tv.tv_usec = 0; + event_loopexit(&tv); +} + +static void assign_job(void *arg) { struct build_peer *peer = arg; @@ -192,7 +209,7 @@ assign_job(void *arg) if (peer->job == NULL) { LIST_INSERT_HEAD(&unassigned_peers, peer, peer_link); if (LIST_EMPTY(&active_peers)) - event_loopexit(NULL); + shutdown_master(); return; } @@ -251,7 +268,6 @@ listen_handler(int sock, short event, void *arg) void master_mode(const char *master_port, const char *start_script) { - struct event listen_event; struct sockaddr_in dst; int fd; @@ -293,6 +309,7 @@ master_mode(const char *master_port, const char *start_script) event_set(&listen_event, fd, EV_READ | EV_PERSIST, listen_handler, NULL); event_add(&listen_event, NULL); + listen_event_socket = fd; event_dispatch(); diff --git a/pkgtools/pbulk/files/pbulk/pscan/master.c b/pkgtools/pbulk/files/pbulk/pscan/master.c index ff94ca3bafb..ebaa67f6731 100644 --- a/pkgtools/pbulk/files/pbulk/pscan/master.c +++ b/pkgtools/pbulk/files/pbulk/pscan/master.c @@ -1,4 +1,4 @@ -/* $NetBSD: master.c,v 1.4 2007/07/21 15:36:36 tnn Exp $ */ +/* $NetBSD: master.c,v 1.5 2008/01/26 00:34:57 joerg Exp $ */ /*- * Copyright (c) 2007 Joerg Sonnenberger <joerg@NetBSD.org>. @@ -55,6 +55,8 @@ #include "pscan.h" static LIST_HEAD(, scan_peer) active_peers, inactive_peers; +static struct event listen_event; +static int listen_event_socket; struct scan_peer { LIST_ENTRY(scan_peer) peer_link; @@ -147,6 +149,21 @@ send_job_path(void *arg) } static void +shutdown_master(void) +{ + struct timeval tv; + struct scan_peer *peer; + + event_del(&listen_event); + (void)close(listen_event_socket); + LIST_FOREACH(peer, &inactive_peers, peer_link) + (void)shutdown(peer->fd, SHUT_RDWR); + tv.tv_sec = 1; + tv.tv_usec = 0; + event_loopexit(&tv); +} + +static void assign_job(struct scan_peer *peer) { size_t job_len; @@ -156,7 +173,7 @@ assign_job(struct scan_peer *peer) if (peer->job == NULL) { LIST_INSERT_HEAD(&inactive_peers, peer, peer_link); if (LIST_EMPTY(&active_peers)) - event_loopexit(NULL); + shutdown_master(); return; } @@ -201,7 +218,6 @@ listen_handler(int sock, short event, void *arg) void master_mode(const char *master_port, const char *start_script) { - struct event listen_event; struct sockaddr_in dst; int fd; @@ -242,6 +258,7 @@ master_mode(const char *master_port, const char *start_script) event_set(&listen_event, fd, EV_READ | EV_PERSIST, listen_handler, NULL); event_add(&listen_event, NULL); + listen_event_socket = fd; event_dispatch(); |