/* 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);
{ 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},
{ 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)))
}
#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;
return;
}
-static void do_client_die(UAContext *ua, CLIENT *client)
+static void do_client_cmd(UAContext *ua, CLIENT *client, const char *cmd)
{
BSOCK *fd;
}
/*
- * 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 ||
}
}
}
- /*
- * 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;
}
/*
* 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;
}
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 */
{"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 */
};
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.
*/