From: Kern Sibbald Date: Thu, 10 May 2007 11:11:06 +0000 (+0000) Subject: kes Implement heap size display in status for all daemons. X-Git-Tag: Release-7.0.0~6393 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=137bb193b84b61ecd75ea4d5093ced7c190809be;p=bacula%2Fbacula kes Implement heap size display in status for all daemons. kes Attempt to fix MySQL db open memory loss (not successfull). kes Don't set SIGKILL and SIGSTOP neither can be trapped. kes Eliminate memory loss in MySQL (possibly other SQLs) during Query. This looks like a MySQL but but by doing extra releases, the memory goes away. This should fix bug #847. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@4738 91ce42f0-d328-0410-95d8-f526ca767f89 --- diff --git a/bacula/src/baconfig.h b/bacula/src/baconfig.h index 68a3df8663..dd7c223ebd 100644 --- a/bacula/src/baconfig.h +++ b/bacula/src/baconfig.h @@ -83,6 +83,8 @@ void InitWinAPIWrapper(); #define OSDependentInit() InitWinAPIWrapper() +#define sbrk(x) 0 + #if defined(BUILDING_DLL) # define DLL_IMP_EXP _declspec(dllexport) diff --git a/bacula/src/cats/cats.h b/bacula/src/cats/cats.h index 25254d3222..c5428750ed 100644 --- a/bacula/src/cats/cats.h +++ b/bacula/src/cats/cats.h @@ -377,7 +377,6 @@ struct B_DB { #define sql_free_result(x) my_mysql_free_result(x) #define sql_fetch_row(x) mysql_fetch_row((x)->result) #define sql_query(x, y) mysql_query((x)->db, (y)) -#define sql_close(x) mysql_close((x)->db) #define sql_strerror(x) mysql_error((x)->db) #define sql_num_rows(x) mysql_num_rows((x)->result) #define sql_data_seek(x, i) mysql_data_seek((x)->result, (i)) diff --git a/bacula/src/cats/mysql.c b/bacula/src/cats/mysql.c index ab993d187b..df58a9a080 100644 --- a/bacula/src/cats/mysql.c +++ b/bacula/src/cats/mysql.c @@ -92,6 +92,8 @@ db_init_database(JCR *jcr, const char *db_name, const char *db_user, const char Dmsg2(100, "DB REopen %d %s\n", mdb->ref_count, db_name); mdb->ref_count++; V(mutex); + Dmsg3(100, "initdb ref=%d connected=%d db=%p\n", mdb->ref_count, + mdb->connected, mdb->db); return mdb; /* already open */ } } @@ -123,6 +125,8 @@ db_init_database(JCR *jcr, const char *db_name, const char *db_user, const char mdb->esc_name = get_pool_memory(PM_FNAME); mdb->esc_path = get_pool_memory(PM_FNAME); qinsert(&db_list, &mdb->bq); /* put db in list */ + Dmsg3(100, "initdb ref=%d connected=%d db=%p\n", mdb->ref_count, + mdb->connected, mdb->db); V(mutex); return mdb; } @@ -143,7 +147,6 @@ db_open_database(JCR *jcr, B_DB *mdb) V(mutex); return 1; } - mdb->connected = false; if ((errstat=rwl_init(&mdb->lock)) != 0) { Mmsg1(&mdb->errmsg, _("Unable to initialize DB lock. ERR=%s\n"), @@ -153,8 +156,8 @@ db_open_database(JCR *jcr, B_DB *mdb) } /* connect to the database */ -#ifdef HAVE_EMBEDDED_MYSQL - mysql_server_init(0, NULL, NULL); +#ifdef xHAVE_EMBEDDED_MYSQL +// mysql_server_init(0, NULL, NULL); #endif mysql_init(&(mdb->mysql)); Dmsg0(50, "mysql_init done\n"); @@ -191,6 +194,7 @@ db_open_database(JCR *jcr, B_DB *mdb) return 0; } + mdb->connected = true; if (!check_tables_version(jcr, mdb)) { V(mutex); return 0; @@ -199,8 +203,9 @@ db_open_database(JCR *jcr, B_DB *mdb) #ifdef HAVE_THREAD_SAFE_MYSQL my_thread_init(); #endif + Dmsg3(100, "opendb ref=%d connected=%d db=%p\n", mdb->ref_count, + mdb->connected, mdb->db); - mdb->connected = true; V(mutex); return 1; } @@ -213,16 +218,20 @@ db_close_database(JCR *jcr, B_DB *mdb) } db_end_transaction(jcr, mdb); P(mutex); + sql_free_result(mdb); mdb->ref_count--; #if defined(HAVE_THREAD_SAFE_MYSQL) my_thread_end(); #endif + Dmsg3(100, "closedb ref=%d connected=%d db=%p\n", mdb->ref_count, + mdb->connected, mdb->db); if (mdb->ref_count == 0) { qdchain(&mdb->bq); if (mdb->connected && mdb->db) { - sql_close(mdb); -#ifdef HAVE_EMBEDDED_MYSQL - mysql_server_end(); + Dmsg1(100, "close db=%p\n", mdb->db); + mysql_close(&(mdb->mysql)); +#ifdef xHAVE_EMBEDDED_MYSQL +// mysql_server_end(); #endif } rwl_destroy(&mdb->lock); diff --git a/bacula/src/cats/postgresql.c b/bacula/src/cats/postgresql.c index fcaf6f48b0..0b0218a72d 100644 --- a/bacula/src/cats/postgresql.c +++ b/bacula/src/cats/postgresql.c @@ -196,6 +196,8 @@ db_open_database(JCR *jcr, B_DB *mdb) return 0; } + mdb->connected = true; + if (!check_tables_version(jcr, mdb)) { V(mutex); return 0; @@ -203,7 +205,6 @@ db_open_database(JCR *jcr, B_DB *mdb) sql_query(mdb, "SET datestyle TO 'ISO, YMD'"); - mdb->connected = true; V(mutex); return 1; } @@ -216,6 +217,7 @@ db_close_database(JCR *jcr, B_DB *mdb) } db_end_transaction(jcr, mdb); P(mutex); + sql_free_result(mdb); mdb->ref_count--; if (mdb->ref_count == 0) { qdchain(&mdb->bq); @@ -468,7 +470,7 @@ int my_postgresql_query(B_DB *mdb, const char *query) { return mdb->status; } -void my_postgresql_free_result (B_DB *mdb) +void my_postgresql_free_result(B_DB *mdb) { if (mdb->result) { PQclear(mdb->result); diff --git a/bacula/src/cats/sql_create.c b/bacula/src/cats/sql_create.c index d1017cd36a..d01d0e4ec2 100644 --- a/bacula/src/cats/sql_create.c +++ b/bacula/src/cats/sql_create.c @@ -805,7 +805,7 @@ bool db_write_batch_file_records(JCR *jcr) " FROM batch " " JOIN Path ON (batch.Path = Path.Path) " " JOIN Filename ON (batch.Name = Filename.Name) ", - NULL,NULL)) + NULL,NULL)) { Jmsg(jcr, M_FATAL, 0, "Can't fill File table %s\n", jcr->db_batch->errmsg); return false; @@ -831,6 +831,7 @@ bool db_create_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) Dmsg0(dbglevel, "put_file_into_catalog\n"); if (!jcr->db_batch) { + Dmsg2(100, "Opendb attr. Stream=%d fname=%s\n", ar->Stream, ar->fname); jcr->db_batch = db_init_database(jcr, mdb->db_name, mdb->db_user, @@ -851,11 +852,12 @@ bool db_create_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) if (!sql_batch_start(jcr, jcr->db_batch)) { Jmsg(jcr, M_FATAL, 0, - "Can't start batch mode %s", db_strerror(jcr->db_batch)); + "Can't start batch mode %s", db_strerror(jcr->db_batch)); return false; } + Dmsg3(100, "initdb ref=%d connected=%d db=%p\n", jcr->db_batch->ref_count, + jcr->db_batch->connected, jcr->db_batch->db); } - B_DB *bdb = jcr->db_batch; /* diff --git a/bacula/src/cats/sqlite.c b/bacula/src/cats/sqlite.c index 935f5eb034..856a769699 100644 --- a/bacula/src/cats/sqlite.c +++ b/bacula/src/cats/sqlite.c @@ -203,7 +203,8 @@ db_open_database(JCR *jcr, B_DB *mdb) free(db_name); V(mutex); return 0; - } + } + mdb->connected = true; free(db_name); if (!check_tables_version(jcr, mdb)) { V(mutex); @@ -217,7 +218,6 @@ db_open_database(JCR *jcr, B_DB *mdb) sqlite_busy_handler(mdb->db, my_busy_handler, NULL); #endif - mdb->connected = true; V(mutex); return 1; } @@ -230,6 +230,7 @@ db_close_database(JCR *jcr, B_DB *mdb) } db_end_transaction(jcr, mdb); P(mutex); + sql_free_result(mdb); mdb->ref_count--; if (mdb->ref_count == 0) { qdchain(&mdb->bq); diff --git a/bacula/src/dird/dird.c b/bacula/src/dird/dird.c index d97b31fd33..9cdab0fb86 100644 --- a/bacula/src/dird/dird.c +++ b/bacula/src/dird/dird.c @@ -69,6 +69,7 @@ DIRRES *director; /* Director resource */ int FDConnectTimeout; int SDConnectTimeout; char *configfile = NULL; +void *start_heap; /* Globals Imported */ extern int r_first, r_last; /* first and last resources */ @@ -127,6 +128,7 @@ int main (int argc, char *argv[]) char *uid = NULL; char *gid = NULL; + start_heap = sbrk(0); setlocale(LC_ALL, ""); bindtextdomain("bacula", LOCALEDIR); textdomain("bacula"); @@ -866,6 +868,7 @@ static bool check_catalog() if (db) { Jmsg(NULL, M_FATAL, 0, _("%s"), db_strerror(db)); Pmsg1(000, "%s", db_strerror(db)); + db_close_database(NULL, db); } OK = false; continue; diff --git a/bacula/src/dird/job.c b/bacula/src/dird/job.c index 1edfd23c25..bd0be764f8 100644 --- a/bacula/src/dird/job.c +++ b/bacula/src/dird/job.c @@ -1,11 +1,3 @@ -/* - * - * Bacula Director Job processing routines - * - * Kern Sibbald, October MM - * - * Version $Id$ - */ /* Bacula® - The Network Backup Solution @@ -33,6 +25,14 @@ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. */ +/* + * + * Bacula Director Job processing routines + * + * Kern Sibbald, October MM + * + * Version $Id$ + */ #include "bacula.h" #include "dird.h" @@ -122,7 +122,7 @@ bool setup_job(JCR *jcr) /* * Open database */ - Dmsg0(150, "Open database\n"); + Dmsg0(100, "Open database\n"); jcr->db=db_init_database(jcr, jcr->catalog->db_name, jcr->catalog->db_user, jcr->catalog->db_password, jcr->catalog->db_address, jcr->catalog->db_port, jcr->catalog->db_socket, @@ -132,6 +132,7 @@ bool setup_job(JCR *jcr) jcr->catalog->db_name); if (jcr->db) { Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); + db_close_database(jcr, jcr->db); } goto bail_out; } diff --git a/bacula/src/dird/ua_cmds.c b/bacula/src/dird/ua_cmds.c index 917910f4b8..666bc6ef61 100644 --- a/bacula/src/dird/ua_cmds.c +++ b/bacula/src/dird/ua_cmds.c @@ -1800,7 +1800,7 @@ bool open_db(UAContext *ua) ua->jcr->catalog = ua->catalog; - Dmsg0(150, "Open database\n"); + Dmsg0(100, "UA Open database\n"); ua->db = db_init_database(ua->jcr, ua->catalog->db_name, ua->catalog->db_user, ua->catalog->db_password, ua->catalog->db_address, ua->catalog->db_port, ua->catalog->db_socket, diff --git a/bacula/src/dird/ua_output.c b/bacula/src/dird/ua_output.c index 324c53cea3..7e3fb49279 100644 --- a/bacula/src/dird/ua_output.c +++ b/bacula/src/dird/ua_output.c @@ -610,9 +610,12 @@ bool complete_jcr_for_job(JCR *jcr, JOB *job, POOL *pool) jcr->pool = pool; /* override */ } if (jcr->db) { + Dmsg0(100, "complete_jcr close db\n"); db_close_database(jcr, jcr->db); jcr->db = NULL; } + + Dmsg0(100, "complete_jcr open db\n"); jcr->db = jcr->db=db_init_database(jcr, jcr->catalog->db_name, jcr->catalog->db_user, jcr->catalog->db_password, jcr->catalog->db_address, jcr->catalog->db_port, jcr->catalog->db_socket, diff --git a/bacula/src/dird/ua_status.c b/bacula/src/dird/ua_status.c index 0fd354c308..e4993aadc3 100644 --- a/bacula/src/dird/ua_status.c +++ b/bacula/src/dird/ua_status.c @@ -38,7 +38,7 @@ #include "bacula.h" #include "dird.h" -extern void *start_sbrk; +extern void *start_heap; static void list_scheduled_jobs(UAContext *ua); static void list_running_jobs(UAContext *ua); @@ -270,8 +270,8 @@ void list_dir_status_header(UAContext *ua) ua->send_msg(_("Daemon started %s, %d Jobs run since started.\n"), dt, num_jobs_run); } - ua->send_msg(_(" Heap: sbrk=%s bytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"), - edit_uint64_with_commas((uint64_t)sbrk(0)-(uint64_t)start_sbrk, b1), + ua->send_msg(_(" Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"), + edit_uint64_with_commas((char *)sbrk(0)-(char *)start_heap, b1), edit_uint64_with_commas(sm_bytes, b2), edit_uint64_with_commas(sm_max_bytes, b3), edit_uint64_with_commas(sm_buffers, b4), diff --git a/bacula/src/filed/filed.c b/bacula/src/filed/filed.c index 069472e362..60fa82e223 100644 --- a/bacula/src/filed/filed.c +++ b/bacula/src/filed/filed.c @@ -47,6 +47,7 @@ static bool check_resources(); /* Exported variables */ CLIENT *me; /* my resource */ bool no_signals = false; +void *start_heap; #define CONFIG_FILE "bacula-fd.conf" /* default config file */ @@ -93,6 +94,7 @@ int main (int argc, char *argv[]) char *uid = NULL; char *gid = NULL; + start_heap = sbrk(0); setlocale(LC_ALL, ""); bindtextdomain("bacula", LOCALEDIR); textdomain("bacula"); diff --git a/bacula/src/filed/status.c b/bacula/src/filed/status.c index 4931e27110..58d8147216 100644 --- a/bacula/src/filed/status.c +++ b/bacula/src/filed/status.c @@ -1,15 +1,7 @@ -/* - * Bacula File Daemon Status routines - * - * Kern Sibbald, August MMI - * - * Version $Id$ - * - */ /* Bacula® - The Network Backup Solution - Copyright (C) 2001-2006 Free Software Foundation Europe e.V. + Copyright (C) 2001-2007 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -33,10 +25,20 @@ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. */ +/* + * Bacula File Daemon Status routines + * + * Kern Sibbald, August MMI + * + * Version $Id$ + * + */ #include "bacula.h" #include "filed.h" +extern void *start_heap; + /* Forward referenced functions */ static void list_terminated_jobs(void sendit(const char *msg, int len, void *sarg), void *arg); static void bsock_sendit(const char *msg, int len, void *arg); @@ -65,7 +67,7 @@ extern VSSClient *g_pVSSClient; void output_status(void sendit(const char *msg, int len, void *sarg), void *arg) { int sec, bps; - char *msg, b1[32], b2[32], b3[32], b4[32]; + char *msg, b1[32], b2[32], b3[32], b4[32], b5[5]; int len; bool found = false; JCR *njcr; @@ -124,11 +126,12 @@ void output_status(void sendit(const char *msg, int len, void *sarg), void *arg) sendit(msg, len, arg); } #endif - len = Mmsg(msg, _(" Heap: bytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"), - edit_uint64_with_commas(sm_bytes, b1), - edit_uint64_with_commas(sm_max_bytes, b2), - edit_uint64_with_commas(sm_buffers, b3), - edit_uint64_with_commas(sm_max_buffers, b4)); + len = Mmsg(msg, _(" Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"), + edit_uint64_with_commas((char *)sbrk(0)-(char *)start_heap, b1), + edit_uint64_with_commas(sm_bytes, b2), + edit_uint64_with_commas(sm_max_bytes, b3), + edit_uint64_with_commas(sm_buffers, b4), + edit_uint64_with_commas(sm_max_buffers, b5)); sendit(msg, len, arg); len = Mmsg(msg, _(" Sizeof: boffset_t=%d size_t=%d debug=%d trace=%d\n"), sizeof(boffset_t), sizeof(size_t), debug_level, get_trace()); diff --git a/bacula/src/lib/btime.c b/bacula/src/lib/btime.c index f2777ea8c6..0f730cf3bf 100644 --- a/bacula/src/lib/btime.c +++ b/bacula/src/lib/btime.c @@ -99,7 +99,7 @@ char *bstrftime_nc(char *dt, int maxlen, utime_t tim) (void)localtime_r(&ttime, &tm); /* NOTE! since the compiler complains about %y, I use %y and cut the century */ strftime(dt, maxlen, "%d-%b-%Y %H:%M", &tm); - strcpy(dt+7, dt+9); + strcpy(dt+7, dt+9); /* overlay the century */ return dt; } diff --git a/bacula/src/lib/signal.c b/bacula/src/lib/signal.c index 18b4e797e9..4e80e5241a 100644 --- a/bacula/src/lib/signal.c +++ b/bacula/src/lib/signal.c @@ -305,7 +305,7 @@ void init_signals(void terminate(int sig)) #endif sigaction(SIGBUS, &sighandle, NULL); sigaction(SIGFPE, &sighandle, NULL); - sigaction(SIGKILL, &sighandle, NULL); +/* sigaction(SIGKILL, &sighandle, NULL); cannot be trapped */ sigaction(SIGUSR1, &sighandle, NULL); sigaction(SIGSEGV, &sighandle, NULL); sigaction(SIGUSR2, &sighandle, NULL); @@ -314,7 +314,7 @@ void init_signals(void terminate(int sig)) #ifdef SIGSTKFLT sigaction(SIGSTKFLT, &sighandle, NULL); #endif - sigaction(SIGSTOP, &sighandle, NULL); +/* sigaction(SIGSTOP, &sighandle, NULL); cannot be trapped */ sigaction(SIGTSTP, &sighandle, NULL); sigaction(SIGTTIN, &sighandle, NULL); sigaction(SIGTTOU, &sighandle, NULL); diff --git a/bacula/src/lib/watchdog.c b/bacula/src/lib/watchdog.c index 2cd7bbfa0e..bcc41fbd4a 100644 --- a/bacula/src/lib/watchdog.c +++ b/bacula/src/lib/watchdog.c @@ -1,15 +1,7 @@ -/* - * Bacula thread watchdog routine. General routine that - * allows setting a watchdog timer with a callback that is - * called when the timer goes off. - * - * Kern Sibbald, January MMII - * - */ /* Bacula® - The Network Backup Solution - Copyright (C) 2002-2006 Free Software Foundation Europe e.V. + Copyright (C) 2002-2007 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -33,6 +25,14 @@ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. */ +/* + * Bacula thread watchdog routine. General routine that + * allows setting a watchdog timer with a callback that is + * called when the timer goes off. + * + * Kern Sibbald, January MMII + * + */ #include "bacula.h" #include "jcr.h" @@ -40,7 +40,6 @@ /* Exported globals */ time_t watchdog_time = 0; /* this has granularity of SLEEP_TIME */ time_t watchdog_sleep_time = 60; /* examine things every 60 seconds */ -void *start_sbrk; /* Locals */ static pthread_mutex_t timer_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -76,7 +75,6 @@ int start_watchdog(void) if (wd_is_init) { return 0; } - start_sbrk = sbrk(0); Dmsg0(800, "Initialising NicB-hacked watchdog thread\n"); watchdog_time = time(NULL); @@ -103,6 +101,7 @@ static void ping_watchdog() P(timer_mutex); pthread_cond_signal(&timer); V(timer_mutex); + bmicrosleep(0, 100); } /* @@ -121,9 +120,8 @@ int stop_watchdog(void) } quit = true; /* notify watchdog thread to stop */ - wd_is_init = false; - ping_watchdog(); + stat = pthread_join(wd_tid, NULL); while (!wd_queue->empty()) { @@ -150,6 +148,7 @@ int stop_watchdog(void) delete wd_inactive; wd_inactive = NULL; rwl_destroy(&lock); + wd_is_init = false; return stat; } diff --git a/bacula/src/stored/status.c b/bacula/src/stored/status.c index 091cb6278f..7ef13adafa 100644 --- a/bacula/src/stored/status.c +++ b/bacula/src/stored/status.c @@ -43,6 +43,7 @@ extern BSOCK *filed_chan; extern int r_first, r_last; extern struct s_res resources[]; +extern void *start_heap; /* Static variables */ static char qstatus[] = ".status %127s\n"; @@ -68,7 +69,7 @@ void output_status(void sendit(const char *msg, int len, void *sarg), void *arg) AUTOCHANGER *changer; DEVICE *dev; char dt[MAX_TIME_LENGTH]; - char *msg, b1[35], b2[35], b3[35], b4[35]; + char *msg, b1[35], b2[35], b3[35], b4[35], b5[35]; int bpb; int len; @@ -85,11 +86,12 @@ void output_status(void sendit(const char *msg, int len, void *sarg), void *arg) dt, num_jobs_run, num_jobs_run == 1 ? "" : "s"); sendit(msg, len, arg); - len = Mmsg(msg, _(" Heap: bytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"), - edit_uint64_with_commas(sm_bytes, b1), - edit_uint64_with_commas(sm_max_bytes, b2), - edit_uint64_with_commas(sm_buffers, b3), - edit_uint64_with_commas(sm_max_buffers, b4)); + len = Mmsg(msg, _(" Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"), + edit_uint64_with_commas((char *)sbrk(0)-(char *)start_heap, b1), + edit_uint64_with_commas(sm_bytes, b2), + edit_uint64_with_commas(sm_max_bytes, b3), + edit_uint64_with_commas(sm_buffers, b4), + edit_uint64_with_commas(sm_max_buffers, b5)); sendit(msg, len, arg); /* diff --git a/bacula/src/stored/stored.c b/bacula/src/stored/stored.c index dbce1a6b66..e027ffd89d 100644 --- a/bacula/src/stored/stored.c +++ b/bacula/src/stored/stored.c @@ -61,6 +61,7 @@ STORES *me = NULL; /* our Global resource */ bool forge_on = false; /* proceed inspite of I/O errors */ pthread_mutex_t device_release_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t wait_device_release = PTHREAD_COND_INITIALIZER; +void *start_heap; static uint32_t VolSessionId = 0; @@ -112,6 +113,7 @@ int main (int argc, char *argv[]) char *uid = NULL; char *gid = NULL; + start_heap = sbrk(0); setlocale(LC_ALL, ""); bindtextdomain("bacula", LOCALEDIR); textdomain("bacula"); diff --git a/bacula/technotes-2.1 b/bacula/technotes-2.1 index 6c4ceedfcf..6bd6f7bfac 100644 --- a/bacula/technotes-2.1 +++ b/bacula/technotes-2.1 @@ -1,6 +1,13 @@ Technical notes on version 2.1 General: +10May07 +kes Implement heap size display in status for all daemons. +kes Attempt to fix MySQL db open memory loss (not successfull). +kes Don't set SIGKILL and SIGSTOP neither can be trapped. +kes Eliminate memory loss in MySQL (possibly other SQLs) during + Query. This looks like a MySQL but but by doing extra releases, + the memory goes away. This should fix bug #847. 09May07 kes When backup fails, cancel SD before waiting for sd termination. kes If SD is waiting for FD to connect during cancel, wake up the