void list_dashes(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx);
int get_sql_record_max(JCR *jcr, B_DB *mdb);
bool check_tables_version(JCR *jcr, B_DB *mdb);
+bool db_check_max_connections(JCR *jcr, B_DB *mdb, uint32_t nb);
void _db_unlock(const char *file, int line, B_DB *mdb);
void _db_lock(const char *file, int line, B_DB *mdb);
const char *db_get_type(void);
free(DBId);
}
-
/*
* Called here to retrieve an integer from the database
*/
return 0;
}
+
+/*
+ * Called here to retrieve an integer from the database
+ */
+static int db_max_connections_handler(void *ctx, int num_fields, char **row)
+{
+ uint32_t *val = (uint32_t *)ctx;
+ uint32_t index = sql_get_max_connections_index[db_type];
+ if (row[index]) {
+ *val = str_to_int64(row[index]);
+ } else {
+ Dmsg0(800, "int_handler finds zero\n");
+ *val = 0;
+ }
+ return 0;
+}
+
+/*
+ * Check catalog max_connections setting
+ */
+bool db_check_max_connections(JCR *jcr, B_DB *mdb, uint32_t max_concurrent_jobs)
+{
+ uint32_t max_conn=0;
+ int ret=true;
+
+ /* Without Batch insert, no need to verify max_connections */
+#ifndef HAVE_BATCH_FILE_INSERT
+ return ret;
+#endif
+
+ /* Check max_connections setting */
+ if (!db_sql_query(mdb, sql_get_max_connections[db_type], db_max_connections_handler, &max_conn)) {
+ Jmsg(jcr, M_ERROR, 0, "Can't verify max_connections settings %s", mdb->errmsg);
+ return ret;
+ }
+ if (max_conn && max_concurrent_jobs && max_concurrent_jobs > max_conn) {
+ Mmsg(mdb->errmsg,
+ _("On db_name=%s, %s max_connections=%d is lower than Director MaxConcurentJobs=%d\n"),
+ mdb->db_name, db_get_type(), max_conn, max_concurrent_jobs);
+ Jmsg(jcr, M_WARNING, 0, "%s", mdb->errmsg);
+ ret = false;
+ }
+
+ return ret;
+}
+
/* NOTE!!! The following routines expect that the
* calling subroutine sets and clears the mutex
*/
"AND Path.PathId=File.Pathid "
"AND Filename.FilenameId=File.FilenameId "
"GROUP BY File.FileIndex "};
+
+const char *sql_get_max_connections[4] = {
+ /* Mysql */
+ "SHOW VARIABLES LIKE 'max_connections'",
+ /* Postgresql */
+ "SHOW max_connections",
+ /* SQLite */
+ "SELECT 0",
+ /* SQLite3 */
+ "SELECT 0"
+};
+
+/* Row number of the max_connections setting */
+const uint32_t sql_get_max_connections_index[4] = {
+ /* Mysql */
+ 1,
+ /* Postgresql */
+ 0,
+ /* SQLite */
+ 0,
+ /* SQLite3 */
+ 0
+};
extern const char CATS_IMP_EXP *uar_create_temp[4];
extern const char CATS_IMP_EXP *uar_create_temp1[4];
extern const char CATS_IMP_EXP *uar_jobid_fileindex_from_dir[4];
+extern const char CATS_IMP_EXP *sql_get_max_connections[4];
+extern const uint32_t CATS_IMP_EXP sql_get_max_connections_index[4];
OK = false;
continue;
}
+
+ /* Display a message if the db max_connections is too low */
+ if (!db_check_max_connections(NULL, db, director->MaxConcurrentJobs+1)) {
+ Pmsg1(000, "Warning, settings problem for Catalog=%s\n", catalog->name());
+ Pmsg1(000, "%s", db_strerror(db));
+ }
/* we are in testing mode, so don't touch anything in the catalog */
if (mode == CHECK_CONNECTION) {