]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl Update after fatal signal debugging
authorEric Bollengier <eric@eb.homelinux.org>
Mon, 10 Nov 2008 18:07:20 +0000 (18:07 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Mon, 10 Nov 2008 18:07:20 +0000 (18:07 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@8031 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/cats/protos.h
bacula/src/cats/sql.c
bacula/src/dird/dird.c
bacula/src/jcr.h
bacula/src/lib/jcr.c
bacula/technotes-2.5

index f0ef589ef3f499c5517a22ee51c75ae95d3f4a13..eba966bf7324f365847c2b5d411a4780054aa513 100644 (file)
@@ -58,6 +58,7 @@ void db_start_transaction(JCR *jcr, B_DB *mdb);
 void db_end_transaction(JCR *jcr, B_DB *mdb);
 int db_int64_handler(void *ctx, int num_fields, char **row);
 void db_thread_cleanup();
+void _db_print_dbg(JCR *jcr, FILE *fp);
 
 /* sql_create.c */
 bool db_create_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar);
index 052d37af499c102cca72c494c3cfc16c522264ab..a100f2cd774f78e6dbb183ab18a20e96992c2324 100644 (file)
@@ -740,4 +740,28 @@ bool db_open_batch_connexion(JCR *jcr, B_DB *mdb)
    return true;
 }
 
+/*
+ * !!! WARNING !!! Use this function only when bacula is stopped.
+ * ie, after a fatal signal and before exiting the program
+ * Print information about a B_DB object.
+ */
+void _db_print_dbg(JCR *jcr, FILE *fp)
+{
+   B_DB *mdb = jcr->db;
+
+   if (!mdb) {
+      return;
+   }
+
+   fprintf(fp, "B_DB %p db_name=%s db_user=%s connected=%i\n",
+           mdb, NPRTB(mdb->db_name), NPRTB(mdb->db_user), mdb->connected);
+   fprintf(fp, "\tcmd=\"%s\" changes=%i\n", NPRTB(mdb->cmd), mdb->changes);
+   if (mdb->lock.valid == RWLOCK_VALID) { 
+      fprintf(fp, "\tRWLOCK %p w_active=%i w_wait=%i\n", &mdb->lock, mdb->lock.w_active, mdb->lock.w_wait);
+#ifndef HAVE_WIN32
+      fprintf(fp, "\t\tthreadid=0x%x mutex=%p\n", (int)mdb->lock.writer_id, &mdb->lock.mutex);
+#endif
+   }
+}
+
 #endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL*/
index 633cb91264e9f45700fb64ad0cef7145683610e4..2f2092df402779f226bd43051d1820bbf2419850 100644 (file)
@@ -282,7 +282,6 @@ int main (int argc, char *argv[])
    FDConnectTimeout = (int)director->FDConnectTimeout;
    SDConnectTimeout = (int)director->SDConnectTimeout;
 
-
 #if !defined(HAVE_WIN32)
    signal(SIGHUP, reload_config);
 #endif
@@ -313,6 +312,8 @@ int main (int argc, char *argv[])
 
    init_job_server(director->MaxConcurrentJobs);
 
+   dbg_add_hook(_db_print_dbg); /* used to debug B_DB connexion after fatal signal */
+
 //   init_device_resources();
 
    Dmsg0(200, "wait for next job\n");
index 386335eba068e746be03b99ecd2b6352c01998a5..b228073caea075b643fc0d93189e3c771ae05a76 100644 (file)
@@ -466,4 +466,8 @@ extern void b_free_jcr(const char *file, int line, JCR *jcr);
 extern void free_jcr(JCR *jcr);
 #endif
 
+/* Used to display job information after a fatal signal */
+typedef void (dbg_jcr_hook)(JCR *jcr, FILE *fp);
+void dbg_add_hook(dbg_jcr_hook *fct);
+
 #endif /* __JCR_H_ */
index 48d366ed490c6eb1df2b8d60bd07e253e5f0a94e..58a155b08b1dc723c3eef66455f76ae0c76bfe51 100644 (file)
@@ -1008,6 +1008,17 @@ extern "C" void timeout_handler(int sig)
    return;                            /* thus interrupting the function */
 }
 
+/* Used to display mdb information after a fatal signal */
+#define MAX_DBG_HOOK 10
+static dbg_jcr_hook *dbg_hooks[MAX_DBG_HOOK];
+static int dbg_jcr_handler_count;
+
+void dbg_add_hook(dbg_jcr_hook *fct)
+{
+   ASSERT(dbg_jcr_handler_count < MAX_DBG_HOOK);
+   dbg_hooks[dbg_jcr_handler_count++] = fct;
+}
+
 /*
  * !!! WARNING !!! 
  *
@@ -1048,6 +1059,11 @@ void _print_jcr_dbg(FILE *fp)
       fprintf(fp, "\tdequeing=%i\n", jcr->dequeuing);
       fprintf(fp, "\tdb=%p db_batch=%p batch_started=%i\n", 
               jcr->db, jcr->db_batch, jcr->batch_started);
+      
+      for(int i=0; i < dbg_jcr_handler_count; i++) {
+         dbg_jcr_hook *fct = dbg_hooks[i];
+         fct(jcr, fp);
+      }
    }
 }
 
index d8af59b567293a3deb300698d67b6cb4a1b4bbb9..a774fd50287ffd94a57980cb5f5a003ef35d6ce2 100644 (file)
@@ -10,6 +10,8 @@ filepattern (restore with regex in bsr)
 mixed priorities
 
 General:
+11Nov08
+ebl  Add db and rwlock debug after a fatal signal.
 10Nov08
 ebl  Fix maxwaittime to fit documentation, this time is now counted
      from the job start and group all wait periods.