commit 2a83fef7ce7879df1f318a442bb1d8d0012fa5e8 from: Omar Polo date: Mon May 27 10:30:13 2024 UTC gotwebd: use less temp files Instead of allocating a whole set of temp fd per `listen' directive, just use a global set per "sockets" process. This is fine since gotwebd doesn't keep multiple connections open at the same time, once it enters gotwebd_process_request() it won't exit until all the page has been processed. (this because we don't have async APIs for got operations.) ok stsp@ commit - da30c05a101318828faf559ea66bc6ce1f638bc8 commit + 2a83fef7ce7879df1f318a442bb1d8d0012fa5e8 blob - f120798b16e653a7e811f59c25faa77f62273169 blob + 9f05cca64a73b00c1cebb028d16f3bd436fc1b1d --- gotwebd/config.c +++ gotwebd/config.c @@ -45,6 +45,8 @@ int config_init(struct gotwebd *env) { + int i; + strlcpy(env->httpd_chroot, D_HTTPD_CHROOT, sizeof(env->httpd_chroot)); env->prefork_gotwebd = GOTWEBD_NUMPROC; @@ -53,6 +55,12 @@ config_init(struct gotwebd *env) TAILQ_INIT(&env->sockets); TAILQ_INIT(&env->addresses); + for (i = 0; i < PRIV_FDS__MAX; i++) + env->priv_fd[i] = -1; + + for (i = 0; i < GOTWEB_PACK_NUM_TEMPFILES; i++) + env->pack_fds[i] = -1; + return 0; } @@ -118,7 +126,6 @@ config_getsock(struct gotwebd *env, struct imsg *imsg) struct socket *sock = NULL; struct socket_conf sock_conf; uint8_t *p = imsg->data; - int i; if (IMSG_DATA_SIZE(imsg) != sizeof(sock_conf)) fatalx("%s: wrong size", __func__); @@ -140,12 +147,6 @@ config_getsock(struct gotwebd *env, struct imsg *imsg) TAILQ_INSERT_TAIL(&env->sockets, sock, entry); - for (i = 0; i < PRIV_FDS__MAX; i++) - sock->priv_fd[i] = -1; - - for (i = 0; i < GOTWEB_PACK_NUM_TEMPFILES; i++) - sock->pack_fds[i] = -1; - /* log new socket info */ log_debug("%s: id=%d af_type=%s socket_path=%s", __func__, sock->conf.id, @@ -159,7 +160,7 @@ config_getsock(struct gotwebd *env, struct imsg *imsg) } int -config_setfd(struct gotwebd *env, struct socket *sock) +config_setfd(struct gotwebd *env) { int i, j, ret, fd; @@ -172,8 +173,7 @@ config_setfd(struct gotwebd *env, struct socket *sock) if (fd == -1) fatal("got_opentemp"); if (imsg_compose_event(&env->iev_server[j], - IMSG_CFG_FD, 0, -1, fd, &sock->conf.id, - sizeof(sock->conf.id)) == -1) + IMSG_CFG_FD, 0, -1, fd, NULL, 0) == -1) fatal("imsg_compose_event IMSG_CFG_FD"); do { @@ -191,34 +191,28 @@ config_setfd(struct gotwebd *env, struct socket *sock) int config_getfd(struct gotwebd *env, struct imsg *imsg) { - struct socket *sock; - uint8_t *p = imsg->data; - int sock_id, match = 0, i, j; + int match = 0, i, j; + const int nfds = GOTWEB_PACK_NUM_TEMPFILES + PRIV_FDS__MAX; - if (IMSG_DATA_SIZE(imsg) != sizeof(sock_id)) + if (imsg_get_len(imsg) != 0) fatalx("%s: wrong size", __func__); - memcpy(&sock_id, p, sizeof(sock_id)); + for (i = 0; i < nfds; i++) { + if (i < PRIV_FDS__MAX && env->priv_fd[i] == -1) { + env->priv_fd[i] = imsg_get_fd(imsg); + log_debug("%s: assigning priv_fd %d", + __func__, env->priv_fd[i]); + match = 1; + break; + } - TAILQ_FOREACH(sock, &env->sockets, entry) { - const int nfds = (GOTWEB_PACK_NUM_TEMPFILES + PRIV_FDS__MAX); - for (i = 0; i < nfds; i++) { - if (i < PRIV_FDS__MAX && sock->priv_fd[i] == -1) { - sock->priv_fd[i] = imsg_get_fd(imsg); - log_debug("%s: assigning socket %d priv_fd %d", - __func__, sock_id, sock->priv_fd[i]); - match = 1; - break; - } - - j = i - PRIV_FDS__MAX; - if (sock->pack_fds[j] == -1) { - sock->pack_fds[j] = imsg_get_fd(imsg); - log_debug("%s: assigning socket %d pack_fd %d", - __func__, sock_id, sock->pack_fds[j]); - match = 1; - break; - } + j = i - PRIV_FDS__MAX; + if (env->pack_fds[j] == -1) { + env->pack_fds[j] = imsg_get_fd(imsg); + log_debug("%s: assigning pack_fd %d", + __func__, env->pack_fds[j]); + match = 1; + break; } } blob - 705f38f364465ae903d2748262dbfbe4d65447d5 blob + 576b6064f0ed5912b47df984533e92f6c2e11a3c --- gotwebd/gotweb.c +++ gotwebd/gotweb.c @@ -1070,7 +1070,6 @@ gotweb_load_got_path(struct repo_dir **rp, const char struct request *c) { const struct got_error *error = NULL; - struct socket *sock = c->sock; struct server *srv = c->srv; struct transport *t = c->t; struct repo_dir *repo_dir; @@ -1121,7 +1120,8 @@ gotweb_load_got_path(struct repo_dir **rp, const char goto err; } - error = got_repo_open(&t->repo, repo_dir->path, NULL, sock->pack_fds); + error = got_repo_open(&t->repo, repo_dir->path, NULL, + gotwebd_env->pack_fds); if (error) goto err; error = gotweb_get_repo_description(&repo_dir->description, srv, blob - e6c663ff42ff32e1e3f11d9873f7735b9f1eb98e blob + 8c143948a32c1b3a74f434684f88151163b53cf9 --- gotwebd/gotwebd.c +++ gotwebd/gotwebd.c @@ -442,9 +442,11 @@ gotwebd_configure(struct gotwebd *env) TAILQ_FOREACH(sock, &env->sockets, entry) { if (config_setsock(env, sock) == -1) fatalx("%s: send socket error", __func__); - if (config_setfd(env, sock) == -1) - fatalx("%s: send priv_fd error", __func__); } + + /* send the temp files */ + if (config_setfd(env) == -1) + fatalx("%s: send priv_fd error", __func__); if (main_compose_sockets(env, IMSG_CFG_DONE, -1, NULL, 0) == -1) fatal("main_compose_sockets IMSG_CFG_DONE"); blob - 54d00805fd26e7a6b11e21510aad032bf7d9e1bc blob + 965575a81e6fa9466d7fa736d9d04e7fdd4d95e5 --- gotwebd/gotwebd.h +++ gotwebd/gotwebd.h @@ -325,9 +325,6 @@ struct socket { struct socket_conf conf; int fd; - int pack_fds[GOTWEB_PACK_NUM_TEMPFILES]; - int priv_fd[PRIV_FDS__MAX]; - struct event evt; struct event ev; struct event pause; @@ -341,6 +338,9 @@ struct gotwebd { struct serverlist servers; struct socketlist sockets; struct addresslist addresses; + + int pack_fds[GOTWEB_PACK_NUM_TEMPFILES]; + int priv_fd[PRIV_FDS__MAX]; char *user; const char *gotwebd_conffile; @@ -514,7 +514,7 @@ int config_setserver(struct gotwebd *, struct server * int config_getserver(struct gotwebd *, struct imsg *); int config_setsock(struct gotwebd *, struct socket *); int config_getsock(struct gotwebd *, struct imsg *); -int config_setfd(struct gotwebd *, struct socket *); +int config_setfd(struct gotwebd *); int config_getfd(struct gotwebd *, struct imsg *); int config_getcfg(struct gotwebd *, struct imsg *); int config_init(struct gotwebd *); blob - 4be3e313ba6f47241bfb619b9f17e04e0b2bddf8 blob + e4e422a7568c7bafebdb57d3377c40636ff1945b --- gotwebd/sockets.c +++ gotwebd/sockets.c @@ -574,7 +574,7 @@ sockets_socket_accept(int fd, short event, void *arg) c->fd = s; c->sock = sock; - memcpy(c->priv_fd, sock->priv_fd, sizeof(c->priv_fd)); + memcpy(c->priv_fd, gotwebd_env->priv_fd, sizeof(c->priv_fd)); c->buf_pos = 0; c->buf_len = 0; c->request_started = 0;