]> err.no Git - varnish/commitdiff
Further revamp the CLI handling in the cacher process, making it
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Wed, 12 Mar 2008 14:07:08 +0000 (14:07 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Wed, 12 Mar 2008 14:07:08 +0000 (14:07 +0000)
possible for various modules to add cli functions so they can
be manipulated on the fly.

CLI_AddFuncs() registers a set of CLI functions.  We operate
with three lists: the ones not shown in "help" because the
manager already showed them, the normal ones and the debug
commands which are also not shown in a plain "help".

Move the registration of cli functions out to the code they
belong in: VCL, BAN and VCA.

Give VCA a real Init function, and have the cli function ("start")
initiate the acceptor thread which listens for incoming connections.

Split CLI_Init() into CLI_Init() and CLI_Run()

git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@2598 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/cache.h
varnish-cache/bin/varnishd/cache_acceptor.c
varnish-cache/bin/varnishd/cache_ban.c
varnish-cache/bin/varnishd/cache_cli.c
varnish-cache/bin/varnishd/cache_main.c
varnish-cache/bin/varnishd/cache_vcl.c
varnish-cache/bin/varnishd/mgt.h

index 536fb69f5acd43ae3361cd5c12fc57bf1704eac2..467ad37a65541eaac98c51debf11e27ef791dffb 100644 (file)
@@ -79,6 +79,7 @@ struct workreq;
 struct addrinfo;
 struct esi_bit;
 struct vrt_backend;
+struct cli_proto;
 
 /*--------------------------------------------------------------------*/
 
@@ -415,8 +416,6 @@ void VBE_SelectBackend(struct sess *sp);
 /* cache_ban.c */
 void AddBan(const char *, int hash);
 void BAN_Init(void);
-void ccf_url_purge(struct cli *cli, const char * const *av, void *priv);
-void ccf_hash_purge(struct cli *cli, const char * const *av, void *priv);
 void BAN_NewObj(struct object *o);
 int BAN_CheckObject(struct object *o, const char *url, const char *hash);
 
@@ -426,6 +425,9 @@ void CNT_Init(void);
 
 /* cache_cli.c [CLI] */
 void CLI_Init(void);
+void CLI_Run(void);
+enum cli_set_e {MASTER_CLI, PUBLIC_CLI, DEBUG_CLI};
+void CLI_AddFuncs(enum cli_set_e which, struct cli_proto *p);
 extern pthread_t cli_thread;
 #define ASSERT_CLI() do {assert(pthread_self() == cli_thread);} while (0)
 
@@ -558,13 +560,6 @@ void VCL_Idle(void);
 #undef VCL_MET_MAC
 #undef VCL_RET_MAC
 
-#ifdef CLI_PRIV_H
-cli_func_t     ccf_config_list;
-cli_func_t     ccf_config_load;
-cli_func_t     ccf_config_discard;
-cli_func_t     ccf_config_use;
-#endif
-
 /* cache_vrt_esi.c */
 
 void ESI_Deliver(struct sess *);
index 09dffdba9217a036b93a8f15bfcd938cbf31ba35..12a77a937860ca9aaa31a0411045408ef206383a 100644 (file)
@@ -50,6 +50,8 @@
 #include "compat/srandomdev.h"
 #endif
 
+#include "cli.h"
+#include "cli_priv.h"
 #include "shmlog.h"
 #include "cache.h"
 #include "cache_acceptor.h"
@@ -274,11 +276,13 @@ vca_return_session(struct sess *sp)
 
 /*--------------------------------------------------------------------*/
 
-void
-VCA_Init(void)
+static void
+ccf_start(struct cli *cli, const char * const *av, void *priv)
 {
 
-
+       (void)cli;
+       (void)av;
+       (void)priv;
        /* XXX: Add selector mechanism at some point */
        vca_act = vca_acceptors[0];
 
@@ -291,3 +295,15 @@ VCA_Init(void)
        AZ(pthread_create(&vca_thread_acct, NULL, vca_acct, NULL));
        VSL(SLT_Debug, 0, "Acceptor is %s", vca_act->name);
 }
+
+static struct cli_proto vca_cmds[] = {
+       { CLI_SERVER_START,     ccf_start },
+       { NULL }
+};
+
+void
+VCA_Init(void)
+{
+
+       CLI_AddFuncs(MASTER_CLI, vca_cmds);
+}
index d6e924ae0f873d2fedff9fe211cb013ab7b0f55f..5dcbccd3948468dc817711f53d1fcf55e59455bd 100644 (file)
@@ -40,6 +40,7 @@
 #include <regex.h>
 
 #include "shmlog.h"
+#include "cli.h"
 #include "cli_priv.h"
 #include "cache.h"
 
@@ -103,7 +104,7 @@ BAN_CheckObject(struct object *o, const char *url, const char *hash)
        return (0);
 }
 
-void
+static void
 ccf_url_purge(struct cli *cli, const char * const *av, void *priv)
 {
 
@@ -112,7 +113,7 @@ ccf_url_purge(struct cli *cli, const char * const *av, void *priv)
        cli_out(cli, "PURGE %s\n", av[2]);
 }
 
-void
+static void
 ccf_hash_purge(struct cli *cli, const char * const *av, void *priv)
 {
 
@@ -121,9 +122,16 @@ ccf_hash_purge(struct cli *cli, const char * const *av, void *priv)
        cli_out(cli, "PURGE %s\n", av[2]);
 }
 
+static struct cli_proto ban_cmds[] = {
+       { CLI_URL_PURGE,        ccf_url_purge },
+       { CLI_HASH_PURGE,       ccf_hash_purge },
+       { NULL }
+};
+
 void
 BAN_Init(void)
 {
 
+       CLI_AddFuncs(PUBLIC_CLI, ban_cmds);
        AddBan("\001", 0);
 }
index 5bdf0cb772116d872b4e270bee6a8535131ff7a9..63b0563932a47e13921fe595a9eaea88402b9931 100644 (file)
  * SUCH DAMAGE.
  *
  * $Id$
+ *
+ * Caching process CLI handling.
+ *
+ * We only have one CLI source, the stdin/stdout pipes from the manager
+ * process, but we complicate things by having undocumented commands that
+ * we do not want to show in a plain help, and by having commands that the
+ * manager has already shown in help before asking us.
  */
 
 #include "config.h"
 #include "vsb.h"
 
 pthread_t      cli_thread;
+static MTX     cli_mtx;
 
-/*--------------------------------------------------------------------*/
-
-static void
-cli_debug_sizeof(struct cli *cli, const char * const *av, void *priv)
-{
-       (void)av;
-       (void)priv;
-
-#define SZOF(foo)       cli_out(cli, \
-    "sizeof(%s) = %zd = 0x%zx\n", #foo, sizeof(foo), sizeof(foo));
-        SZOF(struct ws);
-        SZOF(struct http);
-        SZOF(struct http_conn);
-        SZOF(struct acct);
-        SZOF(struct worker);
-        SZOF(struct workreq);
-        SZOF(struct bereq);
-        SZOF(struct storage);
-        SZOF(struct object);
-        SZOF(struct objhead);
-        SZOF(struct sess);
-        SZOF(struct vbe_conn);
-}
-
-/*--------------------------------------------------------------------*/
-
-static void
-ccf_start(struct cli *cli, const char * const *av, void *priv)
-{
-
-       (void)cli;
-       (void)av;
-       (void)priv;
-       VCA_Init();
-       return;
-}
-
-/*--------------------------------------------------------------------*/
-
-static void ccf_help(struct cli *cli, const char * const *av, void *priv);
-
-/*--------------------------------------------------------------------
+/*
  * The CLI commandlist is split in three:
- *     Commands we get from/share with the manager
- *     Cache process commands
- *     Undocumented commands
+ *  - Commands we get from/share with the manager, we don't show these
+ *     in help, as the manager already did that.
+ *  - Cache process commands, show in help
+ *  - Undocumented debug commands, show in undocumented "help -d"
  */
 
-static struct cli_proto master_cmds[] = {
-       { CLI_PING,             cli_func_ping },
-       { CLI_SERVER_START,     ccf_start },
-       { CLI_VCL_LOAD,         ccf_config_load },
-       { CLI_VCL_LIST,         ccf_config_list },
-       { CLI_VCL_DISCARD,      ccf_config_discard },
-       { CLI_VCL_USE,          ccf_config_use },
-       { NULL }
-};
-
-static struct cli_proto cacher_cmds[] = {
-       { CLI_HELP,             ccf_help, NULL },
-       { CLI_URL_PURGE,        ccf_url_purge },
-       { CLI_HASH_PURGE,       ccf_hash_purge },
-#if 0
-       { CLI_URL_QUERY,        ccf_url_query },
-#endif
-       { NULL }
-};
-
-static struct cli_proto undoc_cmds[] = {
-       { "debug.sizeof", "debug.sizeof",
-               "\tDump sizeof various data structures\n",
-               0, 0, cli_debug_sizeof },
-       { NULL }
-};
+static struct cli_proto *ccf_master_cli, *ccf_public_cli, *ccf_debug_cli;
 
+/*--------------------------------------------------------------------
+ * Add CLI functions to the appropriate command set
+ */
 
-/*--------------------------------------------------------------------*/
-
-static void
-ccf_help(struct cli *cli, const char * const *av, void *priv)
+void
+CLI_AddFuncs(enum cli_set_e which, struct cli_proto *p)
 {
+       struct cli_proto *c, **cp;
 
-       (void)priv;
-       /* "+1" to skip "help" entry, manager already did that. */
-       cli_func_help(cli, av, cacher_cmds + 1);
-
-       if (av[2] != NULL && !strcmp(av[2], "-d")) {
-               /* Also list undocumented commands */
-               cli_out(cli, "\nDebugging commands:\n");
-               cli_func_help(cli, av, undoc_cmds);
-       } else if (cli->result == CLIS_UNKNOWN) {
-               /* Otherwise, try the undocumented list */
-               vsb_clear(cli->sb);
-               cli->result = CLIS_OK;
-               cli_func_help(cli, av, undoc_cmds);
+       switch (which) {
+       case MASTER_CLI: cp = &ccf_master_cli; break;
+       case PUBLIC_CLI: cp = &ccf_public_cli; break;
+       case DEBUG_CLI:  cp = &ccf_debug_cli;  break;
+       default: INCOMPL();
        }
+       LOCK(&cli_mtx);
+       c = cli_concat(*cp, p);
+       AN(c);
+       free(*cp);
+       *cp = c;
+       UNLOCK(&cli_mtx);
 }
 
-/*--------------------------------------------------------------------*/
+/*--------------------------------------------------------------------
+ * Called when we have a full line, look through all three command 
+ * lists to find it.
+ */
 
 static int
 cli_vlu(void *priv, const char *p)
@@ -157,17 +103,19 @@ cli_vlu(void *priv, const char *p)
        cli = priv;
        VSL(SLT_CLI, 0, "Rd %s", p);
        vsb_clear(cli->sb);
-       cli_dispatch(cli, master_cmds, p);
+       LOCK(&cli_mtx);
+       cli_dispatch(cli, ccf_master_cli, p);
        if (cli->result == CLIS_UNKNOWN) {
                vsb_clear(cli->sb);
                cli->result = CLIS_OK;
-               cli_dispatch(cli, cacher_cmds, p);
+               cli_dispatch(cli, ccf_public_cli, p);
        }
        if (cli->result == CLIS_UNKNOWN) {
                vsb_clear(cli->sb);
                cli->result = CLIS_OK;
-               cli_dispatch(cli, undoc_cmds, p);
+               cli_dispatch(cli, ccf_debug_cli, p);
        }
+       UNLOCK(&cli_mtx);
        vsb_finish(cli->sb);
        AZ(vsb_overflowed(cli->sb));
        i = cli_writeres(heritage.fds[1], cli);
@@ -179,8 +127,12 @@ cli_vlu(void *priv, const char *p)
        return (0);
 }
 
+/*--------------------------------------------------------------------
+ * Run CLI on stdin/stdout pipe from manager
+ */
+
 void
-CLI_Init(void)
+CLI_Run(void)
 {
        struct pollfd pfd[1];
        struct cli *cli, clis;
@@ -190,7 +142,6 @@ CLI_Init(void)
        cli = &clis;
        memset(cli, 0, sizeof *cli);
 
-       cli_thread = pthread_self();
        cli->sb = vsb_new(NULL, NULL, 0, VSB_AUTOEXTEND);
        XXXAN(cli->sb);
        vlu = VLU_New(cli, cli_vlu, params->cli_buffer);
@@ -219,3 +170,80 @@ CLI_Init(void)
                }
        }
 }
+
+/*--------------------------------------------------------------------*/
+
+static void
+cli_debug_sizeof(struct cli *cli, const char * const *av, void *priv)
+{
+       (void)av;
+       (void)priv;
+
+#define SZOF(foo)       cli_out(cli, \
+    "sizeof(%s) = %zd = 0x%zx\n", #foo, sizeof(foo), sizeof(foo));
+        SZOF(struct ws);
+        SZOF(struct http);
+        SZOF(struct http_conn);
+        SZOF(struct acct);
+        SZOF(struct worker);
+        SZOF(struct workreq);
+        SZOF(struct bereq);
+        SZOF(struct storage);
+        SZOF(struct object);
+        SZOF(struct objhead);
+        SZOF(struct sess);
+        SZOF(struct vbe_conn);
+}
+
+/*--------------------------------------------------------------------*/
+
+static void
+ccf_help(struct cli *cli, const char * const *av, void *priv)
+{
+
+       (void)priv;
+       cli_func_help(cli, av, ccf_public_cli);
+
+       if (av[2] != NULL && !strcmp(av[2], "-d")) {
+               /* Also list undocumented commands */
+               cli_out(cli, "\nDebugging commands:\n");
+               cli_func_help(cli, av, ccf_debug_cli);
+       } else if (cli->result == CLIS_UNKNOWN) {
+               /* Otherwise, try the undocumented list */
+               vsb_clear(cli->sb);
+               cli->result = CLIS_OK;
+               cli_func_help(cli, av, ccf_debug_cli);
+       }
+}
+
+/*--------------------------------------------------------------------*/
+
+static struct cli_proto master_cmds[] = {
+       { CLI_PING,             cli_func_ping },
+       { CLI_HELP,             ccf_help, NULL },
+       { NULL }
+};
+
+static struct cli_proto debug_cmds[] = {
+       { "debug.sizeof", "debug.sizeof",
+               "\tDump sizeof various data structures\n",
+               0, 0, cli_debug_sizeof },
+       { NULL }
+};
+
+
+/*--------------------------------------------------------------------
+ * Initialize the CLI subsystem
+ */
+
+void
+CLI_Init(void)
+{
+
+       MTX_INIT(&cli_mtx);
+       cli_thread = pthread_self();
+
+       CLI_AddFuncs(MASTER_CLI, master_cmds);
+       CLI_AddFuncs(DEBUG_CLI, debug_cmds);
+}
+
index 58cee809ab8d4d0d5c88f60fce78537ef60ceed0..e0fa3dd37e6df21db4c2ebd325f767655e32335d 100644 (file)
@@ -71,6 +71,8 @@ child_main(void)
 
        THR_Name("cache-main");
 
+       CLI_Init();
+
        CNT_Init();
        VCL_Init();
 
@@ -85,11 +87,13 @@ child_main(void)
        HSH_Init();
        BAN_Init();
 
+       VCA_Init();
+
        STV_open();
 
        VSL_stats->start_time = (time_t)TIM_real();
 
-       CLI_Init();
+       CLI_Run();
 
        printf("Child dies\n");
 }
index 0e2c8437e56d0744aa0216f6716d205e5891208b..d224c6ddbda0a718bad30e722b3a32823a36e01d 100644 (file)
@@ -208,7 +208,7 @@ VCL_Idle(void)
 
 /*--------------------------------------------------------------------*/
 
-void
+static void
 ccf_config_list(struct cli *cli, const char * const *av, void *priv)
 {
        struct vcls *vcl;
@@ -224,7 +224,7 @@ ccf_config_list(struct cli *cli, const char * const *av, void *priv)
        }
 }
 
-void
+static void
 ccf_config_load(struct cli *cli, const char * const *av, void *priv)
 {
 
@@ -236,7 +236,7 @@ ccf_config_load(struct cli *cli, const char * const *av, void *priv)
        return;
 }
 
-void
+static void
 ccf_config_discard(struct cli *cli, const char * const *av, void *priv)
 {
        struct vcls *vcl;
@@ -263,7 +263,7 @@ ccf_config_discard(struct cli *cli, const char * const *av, void *priv)
                VCL_Nuke(vcl);
 }
 
-void
+static void
 ccf_config_use(struct cli *cli, const char * const *av, void *priv)
 {
        struct vcls *vcl;
@@ -321,9 +321,18 @@ VCL_##func##_method(struct sess *sp)                                       \
 
 /*--------------------------------------------------------------------*/
 
+static struct cli_proto vcl_cmds[] = {
+       { CLI_VCL_LOAD,         ccf_config_load },
+       { CLI_VCL_LIST,         ccf_config_list },
+       { CLI_VCL_DISCARD,      ccf_config_discard },
+       { CLI_VCL_USE,          ccf_config_use },
+       { NULL }        
+};
+
 void
 VCL_Init()
 {
 
+       CLI_AddFuncs(MASTER_CLI, vcl_cmds);
        MTX_INIT(&vcl_mtx);
 }
index caddc5377431875942da0fa8fa4e190f46bdaeec..7922f152c8421177dd1c4a431e19d2263abbfbdd 100644 (file)
@@ -44,7 +44,6 @@ extern pid_t mgt_pid, child_pid;
 
 /* mgt_cli.c */
 
-void mgt_cli_init(void);
 void mgt_cli_setup(int fdi, int fdo, int verbose, const char *ident);
 int mgt_cli_askchild(unsigned *status, char **resp, const char *fmt, ...);
 void mgt_cli_start_child(int fdi, int fdo);