From: Eric Bollengier Date: Mon, 10 May 2010 18:26:26 +0000 (+0200) Subject: Add .dump command X-Git-Tag: Release-7.0.0~1818 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=8dc8be52d6b74cffdd72b30fe22bb05f1c633f93;p=bacula%2Fbacula Add .dump command --- diff --git a/bacula/src/dird/ua_dotcmds.c b/bacula/src/dird/ua_dotcmds.c index 2dfc1470e8..afe4be6a9e 100644 --- a/bacula/src/dird/ua_dotcmds.c +++ b/bacula/src/dird/ua_dotcmds.c @@ -52,7 +52,7 @@ extern bool dot_status_cmd(UAContext *ua, const char *cmd); /* Forward referenced functions */ -static bool diecmd(UAContext *ua, const char *cmd); +static bool die_or_dump_cmd(UAContext *ua, const char *cmd); static bool jobscmd(UAContext *ua, const char *cmd); static bool filesetscmd(UAContext *ua, const char *cmd); static bool clientscmd(UAContext *ua, const char *cmd); @@ -85,7 +85,8 @@ static struct cmdstruct commands[] = { /* help */ /* can be used in runscript * { NT_(".backups"), backupscmd, NULL, false}, { NT_(".clients"), clientscmd, NULL, true}, { NT_(".defaults"), defaultscmd, NULL, false}, - { NT_(".die"), diecmd, NULL, false}, + { NT_(".die"), die_or_dump_cmd, NULL, false}, + { NT_(".dump"), die_or_dump_cmd, NULL, false}, { NT_(".exit"), dot_quit_cmd, NULL, false}, { NT_(".filesets"), filesetscmd, NULL, false}, { NT_(".help"), dot_help_cmd, NULL, false}, @@ -106,7 +107,7 @@ static struct cmdstruct commands[] = { /* help */ /* can be used in runscript * { NT_(".bvfs_lsdirs"), dot_bvfs_lsdirs, NULL, true}, { NT_(".bvfs_lsfiles"),dot_bvfs_lsfiles,NULL, true}, { NT_(".bvfs_update"), dot_bvfs_update, NULL, true}, - { NT_(".types"), typescmd, NULL, false} + { NT_(".types"), typescmd, NULL, false} }; #define comsize ((int)(sizeof(commands)/sizeof(struct cmdstruct))) @@ -363,7 +364,7 @@ static bool getmsgscmd(UAContext *ua, const char *cmd) } #ifdef DEVELOPER -static void do_storage_die(UAContext *ua, STORE *store, const char *cmd) +static void do_storage_cmd(UAContext *ua, STORE *store, const char *cmd) { BSOCK *sd; JCR *jcr = ua->jcr; @@ -391,7 +392,7 @@ static void do_storage_die(UAContext *ua, STORE *store, const char *cmd) return; } -static void do_client_die(UAContext *ua, CLIENT *client, const char *cmd) +static void do_client_cmd(UAContext *ua, CLIENT *client, const char *cmd) { BSOCK *fd; @@ -418,28 +419,29 @@ static void do_client_die(UAContext *ua, CLIENT *client, const char *cmd) } /* - * Create segmentation fault + * Create segmentation fault or dump memory */ -static bool diecmd(UAContext *ua, const char *cmd) +static bool die_or_dump_cmd(UAContext *ua, const char *cmd) { pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; STORE *store=NULL; CLIENT *client=NULL; bool dir=false; bool do_deadlock=false; - const char *remote_cmd=".die"; + const char *remote_cmd="sm_dump"; int i; JCR *jcr = NULL; int a; - - Dmsg1(120, "diecmd:%s:\n", cmd); - - /* General debug? */ - for (i=1; iargc; i++) { - if (strcasecmp(ua->argk[i], "deadlock") == 0) { + if (!strncmp(ua->argk[0], ".die", 4)) { + if (find_arg(ua, "deadlock") > 0) { do_deadlock=true; remote_cmd = ".die deadlock"; + } else { + remote_cmd = ".die"; } + } + /* General debug? */ + for (i=1; iargc; i++) { if (strcasecmp(ua->argk[i], "dir") == 0 || strcasecmp(ua->argk[i], "director") == 0) { dir=true; @@ -493,22 +495,27 @@ static bool diecmd(UAContext *ua, const char *cmd) } if (store) { - do_storage_die(ua, store, remote_cmd); + do_storage_cmd(ua, store, remote_cmd); } if (client) { - do_client_die(ua, client, remote_cmd); + do_client_cmd(ua, client, remote_cmd); } if (dir) { - if (do_deadlock) { - ua->send_msg(_("The Director will generate a deadlock.\n")); - P(mutex); - P(mutex); + if (!strncmp(remote_cmd, ".die", 4)) { + if (do_deadlock) { + ua->send_msg(_("The Director will generate a deadlock.\n")); + P(mutex); + P(mutex); + } + ua->send_msg(_("The Director will segment fault.\n")); + a = jcr->JobId; /* ref NULL pointer */ + jcr->JobId = 1000; /* another ref NULL pointer */ + + } else { /* .dump */ + sm_dump(false, true); } - ua->send_msg(_("The Director will segment fault.\n")); - a = jcr->JobId; /* ref NULL pointer */ - jcr->JobId = 1000; /* another ref NULL pointer */ } return true; @@ -519,7 +526,7 @@ static bool diecmd(UAContext *ua, const char *cmd) /* * Dummy routine for non-development version */ -static bool diecmd(UAContext *ua, const char *cmd) +static bool die_or_dump_cmd(UAContext *ua, const char *cmd) { return true; } diff --git a/bacula/src/filed/job.c b/bacula/src/filed/job.c index 4fa151f379..0a2b8e2dcd 100644 --- a/bacula/src/filed/job.c +++ b/bacula/src/filed/job.c @@ -91,6 +91,7 @@ static int runbeforenow_cmd(JCR *jcr); static int restore_object_cmd(JCR *jcr); static int set_options(findFOPTS *fo, const char *opts); static void set_storage_auth_key(JCR *jcr, char *key); +static int sm_dump_cmd(JCR *jcr); /* Exported functions */ @@ -126,6 +127,7 @@ static struct s_cmds cmds[] = { {"Run", runscript_cmd, 0}, {"accurate", accurate_cmd, 0}, {"restoreobject", restore_object_cmd, 0}, + {"sm_dump", sm_dump_cmd, 0}, {NULL, NULL} /* list terminator */ }; @@ -397,6 +399,14 @@ void *handle_client_request(void *dirp) return NULL; } +static int sm_dump_cmd(JCR *jcr) +{ + BSOCK *dir = jcr->dir_bsock; + sm_dump(false, true); + dir->fsend("2000 sm_dump OK\n"); + return 1; +} + /** * Hello from Director he must identify himself and provide his * password.