]> 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)
committerKern Sibbald <kern@sibbald.com>
Sun, 11 Jul 2010 12:22:02 +0000 (14:22 +0200)
bacula/src/dird/ua_dotcmds.c
bacula/src/filed/job.c

index 4a3c9a031032506b609c6886bddf325db2c8ce7f..ad46db8d69fc9f75942e603fc72d1f7465652cb9 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)))
 
@@ -362,7 +363,7 @@ static bool getmsgscmd(UAContext *ua, const char *cmd)
 }
 
 #ifdef DEVELOPER
-static void do_storage_die(UAContext *ua, STORE *store)
+static void do_storage_cmd(UAContext *ua, STORE *store, const char *cmd)
 {
    BSOCK *sd;
    JCR *jcr = ua->jcr;
@@ -390,7 +391,7 @@ static void do_storage_die(UAContext *ua, STORE *store)
    return;
 }
 
-static void do_client_die(UAContext *ua, CLIENT *client)
+static void do_client_cmd(UAContext *ua, CLIENT *client, const char *cmd)
 {
    BSOCK *fd;
 
@@ -417,18 +418,27 @@ static void do_client_die(UAContext *ua, CLIENT *client)
 }
 
 /*
- * Create segmentation fault
+ * Create segmentation fault or dump memory
  */
-static bool diecmd(UAContext *ua, const char *cmd)
-{
-   STORE *store;
-   CLIENT *client;
+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="sm_dump";
    int i;
    JCR *jcr = NULL;
    int a;
-
-   Dmsg1(120, "diecmd:%s:\n", cmd);
-
+   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 ||
@@ -473,34 +483,29 @@ static bool diecmd(UAContext *ua, const char *cmd)
          }
       }
    }
-   /*
-    * We didn't find an appropriate keyword above, so
-    * prompt the user.
-    */
-   start_prompt(ua, _("Available daemons are: \n"));
-   add_prompt(ua, _("Director"));
-   add_prompt(ua, _("Storage"));
-   add_prompt(ua, _("Client"));
-   switch(do_prompt(ua, "", _("Select daemon type to make die"), NULL, 0)) {
-   case 0:                         /* Director */
-      ua->send_msg(_("The Director will segment fault.\n"));
-      a = jcr->JobId; /* ref NULL pointer */
-      jcr->JobId = 1000; /* another ref NULL pointer */
-      break;
-   case 1:
-      store = get_storage_resource(ua, false/*no default*/);
-      if (store) {
-         do_storage_die(ua, store);
-      }
-      break;
-   case 2:
-      client = select_client_resource(ua);
-      if (client) {
-         do_client_die(ua, client);
+
+   if (store) {
+      do_storage_cmd(ua, store, remote_cmd);
+   }
+
+   if (client) {
+      do_client_cmd(ua, client, remote_cmd);
+   }
+
+   if (dir) {
+      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);
       }
-      break;
-   default:
-      break;
    }
    return true;
 }
@@ -510,7 +515,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 af1ef40bbe5c8abf0c9c3f57084403718b7d3bf9..ac46e6b3d285a3a73e2fc5c068bd559c4d9d9a01 100644 (file)
@@ -90,6 +90,7 @@ static int runafter_cmd(JCR *jcr);
 static int runbeforenow_cmd(JCR *jcr);
 static void 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 */
 
@@ -124,6 +125,8 @@ static struct s_cmds cmds[] = {
    {"RunAfterJob",  runafter_cmd,  0},
    {"Run",          runscript_cmd, 0},
    {"accurate",     accurate_cmd,  0},
+   {"restoreobject", restore_object_cmd, 0},
+   {"sm_dump",      sm_dump_cmd, 0},
    {NULL,       NULL}                  /* list terminator */
 };
 
@@ -387,7 +390,15 @@ 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.
  */