]> git.sur5r.net Git - bacula/bacula/commitdiff
Add .dump command
authorEric Bollengier <eric@eb.homelinux.org>
Mon, 10 May 2010 18:26:26 +0000 (20:26 +0200)
committerEric Bollengier <eric@eb.homelinux.org>
Mon, 2 Aug 2010 14:53:48 +0000 (16:53 +0200)
bacula/src/dird/ua_dotcmds.c
bacula/src/filed/job.c

index 2dfc1470e886b77f8932f287ac33a96d2aea8a29..afe4be6a9e282c4a8d92fd01501d8221ee1409cb 100644 (file)
@@ -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; i<ua->argc; 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; i<ua->argc; 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;
 }
index 4fa151f3791a69b1565a9fb86df2af1bf2d07dde..0a2b8e2dcd7b26fd3bc5525d4991072b07739f81 100644 (file)
@@ -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.