"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Stefan Sperling <stsp@stsp.name>
Subject:
run just one gotwebd listen process
To:
gameoftrees@openbsd.org
Date:
Sun, 7 Sep 2025 10:26:28 +0200

Download raw body.

Thread
I recently made gotwebd run one server per "server" block in the
configuration file, rather than one server per amount of "prefork".

However, this still isn't quite right.

The listen statement is a global configuration setting and it does not
make sense to have more than one process listening on a given socket.

Run just one process which listens and is now again called "sockets",
having been renamed from "sockets" to "server" some time ago.

There is no good reason to run more than one "server" since server-specific
settings from gotwebd.conf are selected based on the SERVER_NAME sent in
the FastCGI request. This selection is handled by the gotweb.c process.

M  gotwebd/fcgi.c     |  11+  11-
M  gotwebd/gotweb.c   |  10+  26-
M  gotwebd/gotwebd.c  |  47+  66-
M  gotwebd/gotwebd.h  |   1+   2-

4 files changed, 69 insertions(+), 105 deletions(-)

commit - b12e0fe80f3f1d8051f7f6cb6708d3a65c163d05
commit + 968aa2bf0321618be8cfe7a56f986fc176fd3736
blob - 2446e2dde7afc86c2e450ef5c9845b2bd569261f
blob + 7aded7f0ba3070a6bf7233a97f5272a4baefc58b
--- gotwebd/fcgi.c
+++ gotwebd/fcgi.c
@@ -66,9 +66,9 @@ fcgi_shutdown(void)
 {
 	imsgbuf_clear(&gotwebd_env->iev_parent->ibuf);
 	free(gotwebd_env->iev_parent);
-	if (gotwebd_env->iev_server) {
-		imsgbuf_clear(&gotwebd_env->iev_server->ibuf);
-		free(gotwebd_env->iev_server);
+	if (gotwebd_env->iev_sockets) {
+		imsgbuf_clear(&gotwebd_env->iev_sockets->ibuf);
+		free(gotwebd_env->iev_sockets);
 	}
 
 	free(gotwebd_env);
@@ -106,7 +106,7 @@ send_parsed_params(struct gotwebd_fcgi_params *params)
 {
 	struct gotwebd *env = gotwebd_env;
 
-	if (imsg_compose_event(env->iev_server, GOTWEBD_IMSG_FCGI_PARAMS,
+	if (imsg_compose_event(env->iev_sockets, GOTWEBD_IMSG_FCGI_PARAMS,
 	    GOTWEBD_PROC_SERVER, -1, -1, params, sizeof(*params)) == -1)
 		log_warn("imsg_compose_event");
 }
@@ -116,7 +116,7 @@ abort_request(uint32_t request_id)
 {
 	struct gotwebd *env = gotwebd_env;
 
-	if (imsg_compose_event(env->iev_server, GOTWEBD_IMSG_REQ_ABORT,
+	if (imsg_compose_event(env->iev_sockets, GOTWEBD_IMSG_REQ_ABORT,
 	    GOTWEBD_PROC_SERVER, -1, -1, &request_id, sizeof(request_id)) == -1)
 		log_warn("imsg_compose_event");
 }
@@ -439,13 +439,13 @@ dump_fcgi_end_request_body(const char *p, struct fcgi_
 static void
 fcgi_launch(struct gotwebd *env)
 {
-	if (env->iev_server == NULL)
-		fatalx("server process not connected");
+	if (env->iev_sockets == NULL)
+		fatalx("sockets process not connected");
 #ifndef PROFILE
 	if (pledge("stdio", NULL) == -1)
 		fatal("pledge");
 #endif
-	event_add(&env->iev_server->ev, NULL);
+	event_add(&env->iev_sockets->ev, NULL);
 }
 
 static struct gotwebd_fcgi_record *
@@ -530,8 +530,8 @@ recv_server_pipe(struct gotwebd *env, struct imsg *ims
 	struct imsgev *iev;
 	int fd;
 
-	if (env->iev_server != NULL) {
-		log_warn("server pipe already received");
+	if (env->iev_sockets != NULL) {
+		log_warn("sockets pipe already received");
 		return;
 	}
 
@@ -553,7 +553,7 @@ recv_server_pipe(struct gotwebd *env, struct imsg *ims
 	event_set(&iev->ev, fd, EV_READ, fcgi_dispatch_server, iev);
 	imsg_event_add(iev);
 
-	env->iev_server = iev;
+	env->iev_sockets = iev;
 }
 
 static void
blob - 5f2b1c6836e35e7f9ed602b0e1425472f331e026
blob + d871db0ccd691ec62818bcca37d685f311e32482
--- gotwebd/gotweb.c
+++ gotwebd/gotweb.c
@@ -163,7 +163,7 @@ cleanup_request(struct request *c)
 
 	fcgi_cleanup_request(c);
 
-	if (imsg_compose_event(gotwebd_env->iev_server, GOTWEBD_IMSG_REQ_ABORT,
+	if (imsg_compose_event(gotwebd_env->iev_sockets, GOTWEBD_IMSG_REQ_ABORT,
 	    GOTWEBD_PROC_GOTWEB, -1, -1, &request_id, sizeof(request_id)) == -1)
 		log_warn("imsg_compose_event");
 }
@@ -1389,15 +1389,11 @@ gotweb_render_age(struct template *tp, time_t committe
 static void
 gotweb_shutdown(void)
 {
-	struct gotwebd *env = gotwebd_env;
-	int i;
-
 	imsgbuf_clear(&gotwebd_env->iev_parent->ibuf);
 	free(gotwebd_env->iev_parent);
 
-	for (i = 0; i < env->server_cnt - env->servers_pending; i++)
-		imsgbuf_clear(&gotwebd_env->iev_server[i].ibuf);
-	free(gotwebd_env->iev_server);
+	imsgbuf_clear(&gotwebd_env->iev_sockets->ibuf);
+	free(gotwebd_env->iev_sockets);
 
 	while (!TAILQ_EMPTY(&gotwebd_env->servers)) {
 		struct server *srv;
@@ -1449,10 +1445,9 @@ gotweb_launch(struct gotwebd *env)
 {
 	struct server *srv;
 	const struct got_error *error;
-	int i;
 
-	if (env->servers_pending != 0)
-		fatal("server process not connected");
+	if (env->iev_sockets == NULL)
+		fatal("sockets process not connected");
 
 #ifndef PROFILE
 	if (pledge("stdio rpath recvfd sendfd proc exec unveil", NULL) == -1)
@@ -1471,8 +1466,7 @@ gotweb_launch(struct gotwebd *env)
 	if (unveil(NULL, NULL) == -1)
 		fatal("unveil");
 
-	for (i = 0; i < env->server_cnt; i++)
-		event_add(&env->iev_server[i].ev, NULL);
+	event_add(&env->iev_sockets->ev, NULL);
 }
 
 static void
@@ -1547,16 +1541,13 @@ recv_server_pipe(struct gotwebd *env, struct imsg *ims
 	struct imsgev *iev;
 	int fd;
 
-	if (env->servers_pending <= 0) {
-		log_warn("server pipes already received");
-		return;
-	}
-
 	fd = imsg_get_fd(imsg);
 	if (fd == -1)
 		fatalx("invalid server pipe fd");
 
-	iev = &env->iev_server[env->servers_pending - 1];
+	iev = calloc(1, sizeof(*iev));
+	if (iev == NULL)
+		fatal("calloc");
 	if (imsgbuf_init(&iev->ibuf, fd) == -1)
 		fatal("imsgbuf_init");
 	imsgbuf_allow_fdpass(&iev->ibuf);
@@ -1566,7 +1557,7 @@ recv_server_pipe(struct gotwebd *env, struct imsg *ims
 	event_set(&iev->ev, fd, EV_READ, gotweb_dispatch_server, iev);
 	imsg_event_add(iev);
 
-	env->servers_pending--;
+	env->iev_sockets = iev;
 }
 
 static void
@@ -1656,13 +1647,6 @@ gotweb(struct gotwebd *env, int fd)
 	    env->iev_parent);
 	event_add(&env->iev_parent->ev, NULL);
 
-	if (env->server_cnt <= 0)
-		fatalx("invalid server count: %d", env->server_cnt);
-	env->iev_server = calloc(env->server_cnt, sizeof(*env->iev_server));
-	if (env->iev_server == NULL)
-		fatal("calloc");
-	env->servers_pending = env->server_cnt;
-
 	signal(SIGPIPE, SIG_IGN);
 
 	signal_set(&sighup, SIGHUP, gotweb_sighdlr, env);
blob - 361e94d9fc08626854f1c0e4d31af3be36bec935
blob + ecc7fd3254c6a09eb4b56485c161763b345e14a1
--- gotwebd/gotwebd.c
+++ gotwebd/gotwebd.c
@@ -120,16 +120,7 @@ int
 main_compose_sockets(struct gotwebd *env, uint32_t type, int fd,
     const void *data, uint16_t len)
 {
-	size_t i;
-	int ret = 0;
-
-	for (i = 0; i < env->server_cnt; ++i) {
-		ret = send_imsg(&env->iev_server[i], type, fd, data, len);
-		if (ret)
-			break;
-	}
-
-	return ret;
+	return send_imsg(env->iev_sockets, type, fd, data, len);
 }
 
 int
@@ -530,8 +521,8 @@ main(int argc, char **argv)
 
 	switch (proc_type) {
 	case GOTWEBD_PROC_SERVER:
-		setproctitle("server");
-		log_procinit("server");
+		setproctitle("sockets");
+		log_procinit("sockets");
 
 		if (chroot(env->httpd_chroot) == -1)
 			fatal("chroot %s", env->httpd_chroot);
@@ -581,11 +572,11 @@ main(int argc, char **argv)
 
 	evb = event_init();
 
-	env->iev_server = calloc(env->server_cnt, sizeof(*env->iev_server));
-	if (env->iev_server == NULL)
+	env->iev_sockets = calloc(1, sizeof(*env->iev_sockets));
+	if (env->iev_sockets == NULL)
 		fatal("calloc");
 
-	env->iev_fcgi = calloc(env->server_cnt, sizeof(*env->iev_fcgi));
+	env->iev_fcgi = calloc(1, sizeof(*env->iev_fcgi));
 	if (env->iev_fcgi == NULL)
 		fatal("calloc");
 
@@ -593,15 +584,13 @@ main(int argc, char **argv)
 	if (env->iev_gotweb == NULL)
 		fatal("calloc");
 
-	for (i = 0; i < env->server_cnt; ++i) {
-		spawn_process(env, argv0, &env->iev_server[i],
-		    GOTWEBD_PROC_SERVER, gotwebd_username,
-		    gotwebd_dispatch_server);
+	spawn_process(env, argv0, env->iev_sockets,
+	    GOTWEBD_PROC_SERVER, gotwebd_username,
+	    gotwebd_dispatch_server);
 
-		spawn_process(env, argv0, &env->iev_fcgi[i],
-		    GOTWEBD_PROC_FCGI, gotwebd_username,
-		    gotwebd_dispatch_fcgi);
-	}
+	spawn_process(env, argv0, env->iev_fcgi,
+	    GOTWEBD_PROC_FCGI, gotwebd_username,
+	    gotwebd_dispatch_fcgi);
 
 	for (i = 0; i < env->prefork; ++i) {
 		spawn_process(env, argv0, &env->iev_gotweb[i],
@@ -663,40 +652,32 @@ main(int argc, char **argv)
 static void
 connect_children(struct gotwebd *env)
 {
-	struct imsgev *iev_server, *iev_fcgi, *iev_gotweb;
+	struct imsgev *iev_gotweb;
 	int pipe[2];
-	int i, j;
+	int i;
 
-	for (i = 0; i < env->server_cnt; i++) {
-		iev_server = &env->iev_server[i];
-		iev_fcgi = &env->iev_fcgi[i];
+	if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pipe) == -1)
+		fatal("socketpair");
 
+	if (main_compose_sockets(env, GOTWEBD_IMSG_CTL_PIPE, pipe[0], NULL, 0))
+		fatal("main_compose_sockets");
+
+	if (send_imsg(env->iev_fcgi, GOTWEBD_IMSG_CTL_PIPE, pipe[1], NULL, 0))
+		fatal("send_imsg");
+
+	for (i = 0; i < env->prefork; i++) {
+		iev_gotweb = &env->iev_gotweb[i];
+
 		if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pipe) == -1)
 			fatal("socketpair");
 
-		if (send_imsg(iev_server, GOTWEBD_IMSG_CTL_PIPE, pipe[0],
-		    NULL, 0))
+		if (main_compose_sockets(env, GOTWEBD_IMSG_CTL_PIPE,
+		    pipe[0], NULL, 0))
 			fatal("send_imsg");
 
-		if (send_imsg(iev_fcgi, GOTWEBD_IMSG_CTL_PIPE, pipe[1],
-		    NULL, 0))
+		if (send_imsg(iev_gotweb, GOTWEBD_IMSG_CTL_PIPE,
+		    pipe[1], NULL, 0))
 			fatal("send_imsg");
-
-		for (j = 0; j < env->prefork; j++) {
-			iev_gotweb = &env->iev_gotweb[j];
-
-			if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC,
-			    pipe) == -1)
-				fatal("socketpair");
-
-			if (send_imsg(iev_server, GOTWEBD_IMSG_CTL_PIPE,
-			    pipe[0], NULL, 0))
-				fatal("send_imsg");
-
-			if (send_imsg(iev_gotweb, GOTWEBD_IMSG_CTL_PIPE,
-			    pipe[1], NULL, 0))
-				fatal("send_imsg");
-		}
 	}
 }
 
@@ -707,14 +688,13 @@ gotwebd_configure(struct gotwebd *env, uid_t uid, gid_
 	struct socket *sock;
 
 	/* gotweb need to reload its config. */
-	env->servers_pending = env->server_cnt;
 	env->gotweb_pending = env->prefork;
 
 	/* send our gotweb servers */
 	TAILQ_FOREACH(srv, &env->servers, entry) {
 		if (main_compose_sockets(env, GOTWEBD_IMSG_CFG_SRV,
 		    -1, srv, sizeof(*srv)) == -1)
-			fatal("main_compose_sockets GOTWEBD_IMSG_CFG_SRV");
+			fatal("send_imsg GOTWEBD_IMSG_CFG_SRV");
 		if (main_compose_gotweb(env, GOTWEBD_IMSG_CFG_SRV,
 		    -1, srv, sizeof(*srv)) == -1)
 			fatal("main_compose_gotweb GOTWEBD_IMSG_CFG_SRV");
@@ -733,8 +713,9 @@ gotwebd_configure(struct gotwebd *env, uid_t uid, gid_
 	/* Connect servers and gotwebs. */
 	connect_children(env);
 
-	if (main_compose_sockets(env, GOTWEBD_IMSG_CFG_DONE, -1, NULL, 0) == -1)
-		fatal("main_compose_sockets GOTWEBD_IMSG_CFG_DONE");
+	if (main_compose_sockets(env, GOTWEBD_IMSG_CFG_DONE, -1,
+	    NULL, 0) == -1)
+		fatal("send_imsg GOTWEBD_IMSG_CFG_DONE");
 
 	return (0);
 }
@@ -742,13 +723,9 @@ gotwebd_configure(struct gotwebd *env, uid_t uid, gid_
 void
 gotwebd_configure_done(struct gotwebd *env)
 {
-	if (env->servers_pending > 0) {
-		env->servers_pending--;
-		if (env->servers_pending == 0 &&
-		    main_compose_sockets(env, GOTWEBD_IMSG_CTL_START,
-		        -1, NULL, 0) == -1)
-			fatal("main_compose_sockets GOTWEBD_IMSG_CTL_START");
-	}
+	if (main_compose_sockets(env, GOTWEBD_IMSG_CTL_START,
+	    -1, NULL, 0) == -1)
+		fatal("send_imsg GOTWEBD_IMSG_CTL_START");
 
 	if (env->gotweb_pending > 0) {
 		env->gotweb_pending--;
@@ -766,14 +743,18 @@ gotwebd_shutdown(void)
 	pid_t		 pid;
 	int		 i, status;
 
-	for (i = 0; i < env->server_cnt; ++i) {
-		event_del(&env->iev_server[i].ev);
-		imsgbuf_clear(&env->iev_server[i].ibuf);
-		close(env->iev_server[i].ibuf.fd);
-		env->iev_server[i].ibuf.fd = -1;
-	}
-	free(env->iev_server);
+	event_del(&env->iev_sockets->ev);
+	imsgbuf_clear(&env->iev_sockets->ibuf);
+	close(env->iev_sockets->ibuf.fd);
+	env->iev_sockets->ibuf.fd = -1;
+	free(env->iev_sockets);
 
+	event_del(&env->iev_fcgi->ev);
+	imsgbuf_clear(&env->iev_fcgi->ibuf);
+	close(env->iev_fcgi->ibuf.fd);
+	env->iev_fcgi->ibuf.fd = -1;
+	free(env->iev_fcgi);
+
 	for (i = 0; i < env->prefork; ++i) {
 		event_del(&env->iev_gotweb[i].ev);
 		imsgbuf_clear(&env->iev_gotweb[i].ibuf);
blob - 18fe22bae49e8cf885500524c79e5780dd102d28
blob + 0719d555453958214b9038725b19d44c068a5c05
--- gotwebd/gotwebd.h
+++ gotwebd/gotwebd.h
@@ -384,12 +384,11 @@ struct gotwebd {
 	int		 gotwebd_verbose;
 
 	struct imsgev	*iev_parent;
-	struct imsgev	*iev_server;
+	struct imsgev	*iev_sockets;
 	struct imsgev	*iev_fcgi;
 	struct imsgev	*iev_gotweb;
 
 	uint16_t	 prefork;
-	int		 servers_pending;
 	int		 gotweb_pending;
 	int		 gotweb_cur;