[master] f658f830d Unify some of the code from client/server using a "session" concept, which will become more and more important.

Dridi Boukelmoune dridi at varni.sh
Mon Aug 31 16:22:06 UTC 2020


On Mon, Aug 31, 2020 at 2:25 PM Poul-Henning Kamp <phk at freebsd.org> wrote:
>
>
> commit f658f830df003e7258cba883c3ccd3a2f2cbfb95
> Author: Poul-Henning Kamp <phk at FreeBSD.org>
> Date:   Mon Aug 31 14:23:06 2020 +0000
>
>     Unify some of the code from client/server using a "session"
>     concept, which will become more and more important.
>
> diff --git a/bin/varnishtest/Makefile.am b/bin/varnishtest/Makefile.am
> index 34f11f77e..61c2be73d 100644
> --- a/bin/varnishtest/Makefile.am
> +++ b/bin/varnishtest/Makefile.am
> @@ -47,6 +47,7 @@ varnishtest_SOURCES = \
>                 vtc_process.c \
>                 vtc_proxy.c \
>                 vtc_server.c \
> +               vtc_sess.c \

vtc_sess.c appears to be missing from this patch!

>                 vtc_subr.c \
>                 vtc_syslog.c \
>                 vtc_varnish.c
> diff --git a/bin/varnishtest/vtc.h b/bin/varnishtest/vtc.h
> index cd21edb75..23a3a6472 100644
> --- a/bin/varnishtest/vtc.h
> +++ b/bin/varnishtest/vtc.h
> @@ -88,6 +88,27 @@ extern int ign_unknown_macro;
>  void init_server(void);
>  void init_syslog(void);
>
> +/* Sessions */
> +struct vtc_sess *Sess_New(struct vtclog *vl, const char *name);
> +void Sess_Destroy(struct vtc_sess **spp);
> +int Sess_GetOpt(struct vtc_sess *, char * const **);
> +int sess_process(struct vtclog *vl, const struct vtc_sess *,
> +    const char *spec, int sock, int *sfd, const char *addr);
> +
> +typedef int sess_conn_f(void *priv, struct vtclog *);
> +typedef void sess_disc_f(void *priv, struct vtclog *, int *fd);
> +pthread_t
> +Sess_Start_Thread(
> +    void *priv,
> +    struct vtc_sess *vsp,
> +    sess_conn_f *conn,
> +    sess_disc_f *disc,
> +    const char *listen_addr,
> +    int *asocket,
> +    const char *spec
> +);
> +
> +
>  int http_process(struct vtclog *vl, const char *spec, int sock, int *sfd,
>      const char *addr, int rcvbuf);
>
> diff --git a/bin/varnishtest/vtc_client.c b/bin/varnishtest/vtc_client.c
> index 6ccfbb8d3..41cc3a581 100644
> --- a/bin/varnishtest/vtc_client.c
> +++ b/bin/varnishtest/vtc_client.c
> @@ -52,19 +52,16 @@ struct client {
>         char                    *name;
>         struct vtclog           *vl;
>         VTAILQ_ENTRY(client)    list;
> +       struct vtc_sess         *vsp;
>
>         char                    *spec;
>
>         char                    connect[256];
> -       const char              *addr;
> -       int                     rcvbuf;
> +       char                    *addr;
>
>         char                    *proxy_spec;
>         int                     proxy_version;
>
> -       int                     repeat;
> -       unsigned                keepalive;
> -
>         unsigned                running;
>         pthread_t               tp;
>  };
> @@ -207,54 +204,21 @@ client_connect(struct vtclog *vl, struct client *c)
>   * Client thread
>   */
>
> -static void *
> -client_thread(void *priv)
> +static int
> +client_conn(void *priv, struct vtclog *vl)
>  {
>         struct client *c;
> -       struct vtclog *vl;
> -       int fd;
> -       int i;
> -       struct vsb *vsb;
>
>         CAST_OBJ_NOTNULL(c, priv, CLIENT_MAGIC);
> -       AN(*c->connect);
> -
> -       vl = vtc_logopen(c->name);
> -       pthread_cleanup_push(vtc_logclose, vl);
> +       return (client_connect(vl, c));
> +}
>
> -       vsb = macro_expand(vl, c->connect);
> -       AN(vsb);
> -#if !defined(__sun)
> -       pthread_cleanup_push((void (*)(void *))VSB_destroy, &vsb);
> -#endif
> -       c->addr = VSB_data(vsb);
> -
> -       if (c->repeat == 0)
> -               c->repeat = 1;
> -       if (c->repeat != 1)
> -               vtc_log(vl, 2, "Started (%u iterations%s)", c->repeat,
> -                       c->keepalive ? " using keepalive" : "");
> -       for (i = 0; i < c->repeat; i++) {
> -               fd = client_connect(vl, c);
> -
> -               if (! c->keepalive)
> -                       fd = http_process(vl, c->spec, fd, NULL, c->addr,
> -                           c->rcvbuf);
> -               else
> -                       while (fd >= 0 && i++ < c->repeat)
> -                               fd = http_process(vl, c->spec, fd, NULL,
> -                                   c->addr, c->rcvbuf);
> -               vtc_log(vl, 3, "closing fd %d", fd);
> -               VTCP_close(&fd);
> -       }
> -       vtc_log(vl, 2, "Ending");
> -#if !defined(__sun)
> -       pthread_cleanup_pop(0);
> -#endif
> -       pthread_cleanup_pop(0);
> -       VSB_destroy(&vsb);
> -       vtc_logclose(vl);
> -       return (NULL);
> +static void
> +client_disc(void *priv, struct vtclog *vl, int *fdp)
> +{
> +       (void)priv;
> +       vtc_log(vl, 3, "closing fd %d", *fdp);
> +       VTCP_close(fdp);
>  }
>
>  /**********************************************************************
> @@ -271,6 +235,8 @@ client_new(const char *name)
>         REPLACE(c->name, name);
>         c->vl = vtc_logopen(name);
>         AN(c->vl);
> +       c->vsp = Sess_New(c->vl, name);
> +       AN(c->vsp);
>
>         bprintf(c->connect, "%s", "${v1_sock}");
>         VTAILQ_INSERT_TAIL(&clients, c, list);
> @@ -286,9 +252,11 @@ client_delete(struct client *c)
>  {
>
>         CHECK_OBJ_NOTNULL(c, CLIENT_MAGIC);
> +       Sess_Destroy(&c->vsp);
>         vtc_logclose(c->vl);
>         free(c->spec);
>         free(c->name);
> +       free(c->addr);
>         free(c->proxy_spec);
>         /* XXX: MEMLEAK (?)*/
>         FREE_OBJ(c);
> @@ -301,11 +269,24 @@ client_delete(struct client *c)
>  static void
>  client_start(struct client *c)
>  {
> +       struct vsb *vsb;
>
>         CHECK_OBJ_NOTNULL(c, CLIENT_MAGIC);
>         vtc_log(c->vl, 2, "Starting client");
> -       AZ(pthread_create(&c->tp, NULL, client_thread, c));
>         c->running = 1;
> +       vsb = macro_expand(c->vl, c->connect);
> +       AN(vsb);
> +       REPLACE(c->addr, VSB_data(vsb));
> +       VSB_destroy(&vsb);
> +       c->tp = Sess_Start_Thread(
> +           c,
> +           c->vsp,
> +           client_conn,
> +           client_disc,
> +           c->addr,
> +           NULL,
> +           c->spec
> +       );
>  }
>
>  /**********************************************************************
> @@ -386,6 +367,10 @@ cmd_client(CMD_ARGS)
>                 if (c->running)
>                         client_wait(c);
>
> +               AZ(c->running);
> +               if (Sess_GetOpt(c->vsp, &av))
> +                       continue;
> +
>                 if (!strcmp(*av, "-connect")) {
>                         bprintf(c->connect, "%s", av[1]);
>                         av++;
> @@ -403,20 +388,6 @@ cmd_client(CMD_ARGS)
>                         av++;
>                         continue;
>                 }
> -               if (!strcmp(*av, "-repeat")) {
> -                       c->repeat = atoi(av[1]);
> -                       av++;
> -                       continue;
> -               }
> -               if (!strcmp(*av, "-keepalive")) {
> -                       c->keepalive = 1;
> -                       continue;
> -               }
> -               if (!strcmp(*av, "-rcvbuf")) {
> -                       c->rcvbuf = atoi(av[1]);
> -                       av++;
> -                       continue;
> -               }
>                 if (!strcmp(*av, "-start")) {
>                         client_start(c);
>                         continue;
> diff --git a/bin/varnishtest/vtc_server.c b/bin/varnishtest/vtc_server.c
> index 9ed58d923..4043c27da 100644
> --- a/bin/varnishtest/vtc_server.c
> +++ b/bin/varnishtest/vtc_server.c
> @@ -50,16 +50,14 @@ struct server {
>         char                    *name;
>         struct vtclog           *vl;
>         VTAILQ_ENTRY(server)    list;
> +       struct vtc_sess         *vsp;
>         char                    run;
>
> -       int                     repeat;
> -       unsigned                keepalive;
>         char                    *spec;
>
>         int                     depth;
>         int                     sock;
>         int                     fd;
> -       int                     rcvbuf;
>         char                    listen[256];
>         char                    aaddr[32];
>         char                    aport[32];
> @@ -87,9 +85,10 @@ server_new(const char *name, struct vtclog *vl)
>         REPLACE(s->name, name);
>         s->vl = vtc_logopen(s->name);
>         AN(s->vl);
> +       s->vsp = Sess_New(s->vl, name);
> +       AN(s->vsp);
>
>         bprintf(s->listen, "%s", "127.0.0.1 0");
> -       s->repeat = 1;
>         s->depth = 10;
>         s->sock = -1;
>         s->fd = -1;
> @@ -108,6 +107,7 @@ server_delete(struct server *s)
>  {
>
>         CHECK_OBJ_NOTNULL(s, SERVER_MAGIC);
> +       Sess_Destroy(&s->vsp);
>         macro_undef(s->vl, s->name, "addr");
>         macro_undef(s->vl, s->name, "port");
>         macro_undef(s->vl, s->name, "sock");
> @@ -219,56 +219,61 @@ server_listen(struct server *s)
>   * Server thread
>   */
>
> -static void *
> -server_thread(void *priv)
> +static int
> +server_conn(void *priv, struct vtclog *vl)
>  {
>         struct server *s;
> -       struct vtclog *vl;
> -       int i, j, fd;
>         struct sockaddr_storage addr_s;
>         struct sockaddr *addr;
> -       socklen_t l;
>         char abuf[VTCP_ADDRBUFSIZE];
>         char pbuf[VTCP_PORTBUFSIZE];
> +       socklen_t l;
> +       int fd;
>
>         CAST_OBJ_NOTNULL(s, priv, SERVER_MAGIC);
> -       assert(s->sock >= 0);
>
> -       vl = vtc_logopen(s->name);
> -       pthread_cleanup_push(vtc_logclose, vl);
> +       addr = (void*)&addr_s;
> +       l = sizeof addr_s;
> +       fd = accept(s->sock, addr, &l);
> +       if (fd < 0)
> +               vtc_fatal(vl, "Accept failed: %s", strerror(errno));
> +       if (*s->listen != '/') {
> +               VTCP_hisname(fd, abuf, sizeof abuf, pbuf, sizeof pbuf);
> +               vtc_log(vl, 3, "accepted fd %d %s %s", fd, abuf, pbuf);
> +       } else
> +               vtc_log(vl, 3, "accepted fd %d 0.0.0.0 0", fd);
> +       return (fd);
> +}
>
> -       vtc_log(vl, 2, "Started on %s (%u iterations%s)", s->listen,
> -               s->repeat, s->keepalive ? " using keepalive" : "");
> -       for (i = 0; i < s->repeat; i++) {
> -               addr = (void*)&addr_s;
> -               l = sizeof addr_s;
> -               fd = accept(s->sock, addr, &l);
> -               if (fd < 0)
> -                       vtc_fatal(vl, "Accept failed: %s", strerror(errno));
> -               if (*s->listen != '/') {
> -                       VTCP_hisname(fd, abuf, sizeof abuf, pbuf, sizeof pbuf);
> -                       vtc_log(vl, 3, "accepted fd %d %s %s", fd, abuf, pbuf);
> -               } else
> -                       vtc_log(vl, 3, "accepted fd %d 0.0.0.0 0", fd);
> -               if (! s->keepalive)
> -                       fd = http_process(vl, s->spec, fd, &s->sock, s->listen,
> -                           s->rcvbuf);
> -               else
> -                       while (fd >= 0 && i++ < s->repeat)
> -                               fd = http_process(vl, s->spec, fd,
> -                                   &s->sock, s->listen, s->rcvbuf);
> -               vtc_log(vl, 3, "shutting fd %d", fd);
> -               j = shutdown(fd, SHUT_WR);
> -               if (!VTCP_Check(j))
> -                       vtc_fatal(vl, "Shutdown failed: %s", strerror(errno));
> -               VTCP_close(&fd);
> -       }
> -       vtc_log(vl, 2, "Ending");
> -       pthread_cleanup_pop(0);
> -       vtc_logclose(vl);
> -       return (NULL);
> +static void
> +server_disc(void *priv, struct vtclog *vl, int *fdp)
> +{
> +       int j;
> +       struct server *s;
> +
> +       CAST_OBJ_NOTNULL(s, priv, SERVER_MAGIC);
> +       vtc_log(vl, 3, "shutting fd %d", *fdp);
> +       j = shutdown(*fdp, SHUT_WR);
> +       if (!VTCP_Check(j))
> +               vtc_fatal(vl, "Shutdown failed: %s", strerror(errno));
> +       VTCP_close(fdp);
>  }
>
> +static void
> +server_start_thread(struct server *s)
> +{
> +
> +       s->run = 1;
> +       s->tp = Sess_Start_Thread(
> +           s,
> +           s->vsp,
> +           server_conn,
> +           server_disc,
> +           s->listen,
> +           &s->sock,
> +           s->spec
> +       );
> +}
>
>  /**********************************************************************
>   * Start the server thread
> @@ -281,8 +286,7 @@ server_start(struct server *s)
>         vtc_log(s->vl, 2, "Starting server");
>         server_listen(s);
>         vtc_log(s->vl, 1, "Listen on %s", s->listen);
> -       s->run = 1;
> -       AZ(pthread_create(&s->tp, NULL, server_thread, s));
> +       server_start_thread(s);
>  }
>
>  /**********************************************************************
> @@ -304,7 +308,7 @@ server_dispatch_wrk(void *priv)
>         fd = s->fd;
>
>         vtc_log(vl, 3, "start with fd %d", fd);
> -       fd = http_process(vl, s->spec, fd, &s->sock, s->listen, s->rcvbuf);
> +       fd = sess_process(vl, s->vsp, s->spec, fd, &s->sock, s->listen);
>         vtc_log(vl, 3, "shutting fd %d", fd);
>         j = shutdown(fd, SHUT_WR);
>         if (!VTCP_Check(j))
> @@ -530,15 +534,10 @@ cmd_server(CMD_ARGS)
>                         server_wait(s);
>
>                 AZ(s->run);
> -               if (!strcmp(*av, "-repeat")) {
> -                       s->repeat = atoi(av[1]);
> -                       av++;
> -                       continue;
> -               }
> -               if (!strcmp(*av, "-keepalive")) {
> -                       s->keepalive = 1;
> +
> +               if (Sess_GetOpt(s->vsp, &av))
>                         continue;
> -               }
> +
>                 if (!strcmp(*av, "-listen")) {
>                         if (s->sock >= 0)
>                                 VTCP_close(&s->sock);
> @@ -546,11 +545,6 @@ cmd_server(CMD_ARGS)
>                         av++;
>                         continue;
>                 }
> -               if (!strcmp(*av, "-rcvbuf")) {
> -                       s->rcvbuf = atoi(av[1]);
> -                       av++;
> -                       continue;
> -               }
>                 if (!strcmp(*av, "-start")) {
>                         server_start(s);
>                         continue;
> _______________________________________________
> varnish-commit mailing list
> varnish-commit at varnish-cache.org
> https://www.varnish-cache.org/lists/mailman/listinfo/varnish-commit


More information about the varnish-commit mailing list