summaryrefslogtreecommitdiff
path: root/pkgtools/pbulk
diff options
context:
space:
mode:
authorjoerg <joerg>2008-01-27 14:01:23 +0000
committerjoerg <joerg>2008-01-27 14:01:23 +0000
commit72a799788d04adafe9e846219963609f06b58f72 (patch)
tree1ad3c9659d93efbc7e4f882ca2da73366d8607a9 /pkgtools/pbulk
parent09aea29a14faa717ab358f0cc1279b572abcdb7c (diff)
downloadpkgsrc-72a799788d04adafe9e846219963609f06b58f72.tar.gz
pbulk-0.27:
When running the start script in master mode, already accept incoming connections. This makes the start script more useful when using more clients than the default listen back log.
Diffstat (limited to 'pkgtools/pbulk')
-rw-r--r--pkgtools/pbulk/Makefile4
-rw-r--r--pkgtools/pbulk/files/pbulk/pbuild/master.c55
-rw-r--r--pkgtools/pbulk/files/pbulk/pscan/master.c57
3 files changed, 84 insertions, 32 deletions
diff --git a/pkgtools/pbulk/Makefile b/pkgtools/pbulk/Makefile
index 74ff6281084..493bd21a37a 100644
--- a/pkgtools/pbulk/Makefile
+++ b/pkgtools/pbulk/Makefile
@@ -1,6 +1,6 @@
-# $NetBSD: Makefile,v 1.33 2008/01/26 23:44:08 joerg Exp $
+# $NetBSD: Makefile,v 1.34 2008/01/27 14:01:23 joerg Exp $
-DISTNAME= pbulk-0.26
+DISTNAME= pbulk-0.27
CATEGORIES= pkgtools
MASTER_SITES= # empty
DISTFILES= # empty
diff --git a/pkgtools/pbulk/files/pbulk/pbuild/master.c b/pkgtools/pbulk/files/pbulk/pbuild/master.c
index 040dce3622c..08ab55e65b6 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.6 2008/01/26 00:34:57 joerg Exp $ */
+/* $NetBSD: master.c,v 1.7 2008/01/27 14:01:23 joerg Exp $ */
/*-
* Copyright (c) 2007 Joerg Sonnenberger <joerg@NetBSD.org>.
@@ -54,9 +54,12 @@
#include "pbulk.h"
#include "pbuild.h"
+static int clients_started;
static LIST_HEAD(, build_peer) active_peers, inactive_peers, unassigned_peers;
static struct event listen_event;
static int listen_event_socket;
+static struct event child_event;
+static pid_t child_pid;
struct build_peer {
LIST_ENTRY(build_peer) peer_link;
@@ -205,10 +208,10 @@ assign_job(void *arg)
LIST_REMOVE(peer, peer_link);
- peer->job = get_job();
+ peer->job = clients_started ? get_job() : NULL;
if (peer->job == NULL) {
LIST_INSERT_HEAD(&unassigned_peers, peer, peer_link);
- if (LIST_EMPTY(&active_peers))
+ if (LIST_EMPTY(&active_peers) && clients_started)
shutdown_master();
return;
}
@@ -265,6 +268,29 @@ listen_handler(int sock, short event, void *arg)
recv_command(peer);
}
+static void
+child_handler(int dummy, short event, void *arg)
+{
+ struct build_peer *peer;
+ int status;
+
+ if (waitpid(child_pid, &status, WNOHANG) == -1) {
+ if (errno == ECHILD)
+ return;
+ err(1, "Could not wait for child");
+ }
+ if (status != 0)
+ err(1, "Start script failed");
+
+ clients_started = 1;
+ signal_del(&child_event);
+
+ if ((peer = LIST_FIRST(&inactive_peers)) != NULL) {
+ LIST_REMOVE(peer, peer_link);
+ assign_job(peer);
+ }
+}
+
void
master_mode(const char *master_port, const char *start_script)
{
@@ -292,25 +318,24 @@ master_mode(const char *master_port, const char *start_script)
if (listen(fd, 5) == -1)
err(1, "Could not listen on socket");
+ event_set(&listen_event, fd, EV_READ | EV_PERSIST, listen_handler, NULL);
+ event_add(&listen_event, NULL);
+ listen_event_socket = fd;
+
if (start_script) {
- pid_t child;
- int status;
-
- if ((child = vfork()) == 0) {
+ signal_set(&child_event, SIGCHLD, child_handler, NULL);
+ signal_add(&child_event, NULL);
+
+ if ((child_pid = vfork()) == 0) {
execlp(start_script, start_script, (char *)NULL);
_exit(255);
}
- if (child == -1)
+ if (child_pid == -1)
err(1, "Could not fork start script");
- waitpid(child, &status, 0);
- if (status != 0)
- err(1, "Start script failed");
+ } else {
+ clients_started = 1;
}
- event_set(&listen_event, fd, EV_READ | EV_PERSIST, listen_handler, NULL);
- event_add(&listen_event, NULL);
- listen_event_socket = fd;
-
event_dispatch();
(void)close(fd);
diff --git a/pkgtools/pbulk/files/pbulk/pscan/master.c b/pkgtools/pbulk/files/pbulk/pscan/master.c
index ebaa67f6731..b68b7eb5fd4 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.5 2008/01/26 00:34:57 joerg Exp $ */
+/* $NetBSD: master.c,v 1.6 2008/01/27 14:01:23 joerg Exp $ */
/*-
* Copyright (c) 2007 Joerg Sonnenberger <joerg@NetBSD.org>.
@@ -54,9 +54,12 @@
#include "pbulk.h"
#include "pscan.h"
+static int clients_started;
static LIST_HEAD(, scan_peer) active_peers, inactive_peers;
static struct event listen_event;
static int listen_event_socket;
+static struct event child_event;
+static pid_t child_pid;
struct scan_peer {
LIST_ENTRY(scan_peer) peer_link;
@@ -169,10 +172,10 @@ assign_job(struct scan_peer *peer)
size_t job_len;
uint16_t net_job_len;
- peer->job = get_job();
+ peer->job = clients_started ? get_job() : NULL;
if (peer->job == NULL) {
LIST_INSERT_HEAD(&inactive_peers, peer, peer_link);
- if (LIST_EMPTY(&active_peers))
+ if (LIST_EMPTY(&active_peers) && clients_started)
shutdown_master();
return;
}
@@ -215,6 +218,31 @@ listen_handler(int sock, short event, void *arg)
assign_job(peer);
}
+static void
+child_handler(int dummy, short event, void *arg)
+{
+ struct scan_peer *peer;
+ int status;
+
+ if (waitpid(child_pid, &status, WNOHANG) == -1) {
+ if (errno == ECHILD)
+ return;
+ err(1, "Could not wait for child");
+ }
+ if (status != 0)
+ err(1, "Start script failed");
+
+ clients_started = 1;
+ signal_del(&child_event);
+
+ while ((peer = LIST_FIRST(&inactive_peers)) != NULL) {
+ LIST_REMOVE(peer, peer_link);
+ assign_job(peer);
+ if (peer-> job == NULL)
+ break;
+ }
+}
+
void
master_mode(const char *master_port, const char *start_script)
{
@@ -241,25 +269,24 @@ master_mode(const char *master_port, const char *start_script)
if (listen(fd, 5) == -1)
err(1, "Could not listen on socket");
+ event_set(&listen_event, fd, EV_READ | EV_PERSIST, listen_handler, NULL);
+ event_add(&listen_event, NULL);
+ listen_event_socket = fd;
+
if (start_script) {
- pid_t child;
- int status;
-
- if ((child = vfork()) == 0) {
+ signal_set(&child_event, SIGCHLD, child_handler, NULL);
+ signal_add(&child_event, NULL);
+
+ if ((child_pid = vfork()) == 0) {
execlp(start_script, start_script, (char *)NULL);
_exit(255);
}
- if (child == -1)
+ if (child_pid == -1)
err(1, "Could not fork start script");
- waitpid(child, &status, 0);
- if (status != 0)
- err(1, "Start script failed");
+ } else {
+ clients_started = 1;
}
- event_set(&listen_event, fd, EV_READ | EV_PERSIST, listen_handler, NULL);
- event_add(&listen_event, NULL);
- listen_event_socket = fd;
-
event_dispatch();
(void)close(fd);