]> git.sur5r.net Git - bacula/bacula/commitdiff
M_ABORT Bacula If batch insert is turned on when we try to open a connection and...
authorEric Bollengier <eric@eb.homelinux.org>
Mon, 21 Dec 2009 10:15:47 +0000 (11:15 +0100)
committerEric Bollengier <eric@eb.homelinux.org>
Mon, 21 Dec 2009 10:18:26 +0000 (11:18 +0100)
bacula/src/cats/mysql.c
bacula/src/cats/postgresql.c
bacula/src/cats/protos.h
bacula/src/cats/sqlite.c
bacula/src/tools/dbcheck.c

index d5cd64d873d2dabafa3e28a83c6f1065b60fccd8..994e0e548558967605309284096116b8949d9bcd 100644 (file)
@@ -98,6 +98,7 @@ db_init_database(JCR *jcr, const char *db_name, const char *db_user, const char
          }
       }
    }
+   db_check_backend_thread_safe();
    Dmsg0(100, "db_open first time\n");
    mdb = (B_DB *)malloc(sizeof(B_DB));
    memset(mdb, 0, sizeof(B_DB));
@@ -272,6 +273,16 @@ db_close_database(JCR *jcr, B_DB *mdb)
    V(mutex);
 }
 
+void db_check_backend_thread_safe()
+{
+#ifdef HAVE_BATCH_FILE_INSERT
+   if (!mysql_thread_safe()) {
+      Emsg0(M_ABORT, 0, _("MySQL client library must be thread-safe "
+                          "when using BatchMode.\n"));
+   }
+#endif
+}
+
 /*
  * This call is needed because the message channel thread
  *  opens a database on behalf of a jcr that was created in
index 08f5846f9519ef11e440bdf1a7e8ec66fe9c55a1..b5fd981531fc65249559755590c04ee1ce42820d 100644 (file)
@@ -300,6 +300,16 @@ db_close_database(JCR *jcr, B_DB *mdb)
    V(mutex);
 }
 
+void db_check_backend_thread_safe()
+{
+#ifdef HAVE_BATCH_FILE_INSERT
+   if (!PQisthreadsafe()) {
+      Emsg0(M_ABORT, 0, _("Pg client library must be thread-safe "
+                          "when using BatchMode.\n"));
+   }
+#endif
+}
+
 void db_thread_cleanup()
 { }
 
index 4d24db65c3595140c692bb6abe355402d9b33ab3..75753db356f71e86565a3376e38bcbe39ee7db56 100644 (file)
@@ -61,6 +61,7 @@ int db_list_handler(void *ctx, int num_fields, char **row);
 void db_thread_cleanup();
 void db_debug_print(JCR *jcr, FILE *fp);
 int db_int_handler(void *ctx, int num_fields, char **row);
+void db_check_backend_thread_safe();
 
 /* sql_create.c */
 int db_create_path_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar);
index 946a87e8fa80937b8195b3981191792f62c6b857..f98539ed38374970d58895d9b0f3265aa4cb7505 100644 (file)
@@ -265,6 +265,16 @@ db_close_database(JCR *jcr, B_DB *mdb)
    V(mutex);
 }
 
+void db_check_backend_thread_safe()
+{
+#ifdef HAVE_BATCH_FILE_INSERT
+   if (!sqlite3_threadsafe()) {
+      Emsg0(M_ABORT, 0, _("SQLite3 client library must be thread-safe "
+                          "when using BatchMode.\n"));
+   }
+#endif
+}
+
 void db_thread_cleanup()
 {
 #ifdef HAVE_SQLITE3
index 948e9f57fd04b1115f715fe0fe5cffec826ee34d..b18016777faaf5abbec0cb358bb9d58440a28783 100644 (file)
@@ -120,6 +120,7 @@ static void usage()
 "       -d <nn>         set debug level to <nn>\n"
 "       -dt             print a timestamp in debug output\n"
 "       -f              fix inconsistencies\n"
+"       -t              test if client library is thread-safe\n"
 "       -v              verbose\n"
 "       -?              print this message\n\n");
    exit(1);
@@ -130,6 +131,7 @@ int main (int argc, char *argv[])
    int ch;
    const char *user, *password, *db_name, *dbhost;
    int dbport = 0;
+   bool test_thread=false;
    bool print_catalog=false;
    char *configfile = NULL;
    char *catalogname = NULL;
@@ -146,7 +148,7 @@ int main (int argc, char *argv[])
    memset(&id_list, 0, sizeof(id_list));
    memset(&name_list, 0, sizeof(name_list));
 
-   while ((ch = getopt(argc, argv, "bc:C:d:fvB?")) != -1) {
+   while ((ch = getopt(argc, argv, "bc:C:d:fvBt?")) != -1) {
       switch (ch) {
       case 'B':
          print_catalog = true;     /* get catalog information from config */
@@ -182,6 +184,9 @@ int main (int argc, char *argv[])
       case 'v':
          verbose++;
          break;
+      case 't':
+         test_thread=true;
+         break;
 
       case '?':
       default:
@@ -193,6 +198,16 @@ int main (int argc, char *argv[])
 
    OSDependentInit();
 
+   if (test_thread) {
+      /* When we will load the SQL backend with ldopen, this check would be
+       * moved after the database initialization. It will need a valid config
+       * file.
+       */
+      db_check_backend_thread_safe();
+      Pmsg0(0, _("OK - DB backend seems to be thread-safe.\n"));
+      exit(0);
+   }
+
    if (configfile) {
       CAT *catalog = NULL;
       int found = 0;